目录

一、CodeMirror是什么

二、React中CodeMirror的基本使用介绍

(一)引入CodeMirror

1. 安装CodeMirror插件

2.引入 CodeMirror 插件

(二)引入文件配置

(三)关键属性解读

1.value

2.mode

3.theme

4.readOnly

5.options

(四)CodeMirror内容更新

三、CodeMirror的封装详解


一、CodeMirror是什么

在前端交互丰富的业务场景中,难免会遇到需要编译器的情况。CodeMirror是一个代码编辑器组件,可以嵌入到Web页面中。用来满足代码书写的交互场景。

例如:

二、React中CodeMirror的基本使用介绍

详细的中文文档参考博客:CodeMirror用户手册_LingMax2013的博客-CSDN博客_codemirror中文文档

英文文档参考官网:

CodeMirror 5 User Manual

(一)引入CodeMirror

1. 安装CodeMirror插件

npm install codemirror react-codemirror2 --save      //安装CodeMirror

2.引入 CodeMirror 插件

import CodeMirror from 'react-codemirror';

(二)引入文件配置

require('codemirror/lib/codemirror.css');//关键信息引入
require('codemirror/theme/seti.css');//引入主题颜色
require('codemirror/addon/display/fullscreen.css');
require('../../styles/codemirror.less');//引入样式
require('codemirror/addon/display/panel');
require('codemirror/mode/xml/xml');//引入编辑语言  xml
require('codemirror/mode/javascript/javascript');//引入编辑语言  JavaScript
require('codemirror/mode/yaml/yaml');//引入编辑语言 yaml
require('codemirror/addon/display/fullscreen');
require('codemirror/addon/edit/matchbrackets');
require ('codemirror/addon/selection/active-line');//代码高亮
require ('codemirror/addon/fold/foldgutter.css'); // 代码折叠
require ('codemirror/addon/fold/foldcode.js');// 代码折叠
require ('codemirror/addon/fold/foldgutter.js');  // 代码折叠
require ('codemirror/addon/fold/brace-fold.js');  // 代码折叠
require ('codemirror/addon/fold/comment-fold.js');// 代码折叠

(三)关键属性解读

1.value

作为插件的初始值,写入命令行内。

2.mode

作为鉴定输入文本框的文本类型,如JavaScript和yaml文件。

3.theme

引入的主题。

4.readOnly

设置为是否可读。

5.options

各类配置的集合,作为属性传入CodeMirror插件之中

(四)CodeMirror内容更新

调用官方文档中的setValue方法,具体可查看官方文档。

先获取dom节点,通过ref或者设置id拿到真实的dom节点,在通过dom.setValue设置新的内容。


//使用引入的codemirror组件<CodeMirroroptions={options}value={text ? text :"-" }ref={(c) => this.myCodeMirror = c}//添加ref属性获取dome节点/>
//通过点击事件获取新的内容showDrawer = (val) => {if (this.myCodeMirror != (undefined || null)){const editor = this.myCodeMirror.getCodeMirror();editor.setValue(val)}this.setState({showDrawerswitch: !this.state.showDrawerswitch})}

三、CodeMirror的封装详解

import { Upload } from 'antd';
import React, { PureComponent } from 'react';
import CodeMirror from 'react-codemirror';
import apiconfig from '../../../config/api.config';
import cookie from '../../utils/cookie';
import globalUtil from '../../utils/global';
import styles from './index.less';require('codemirror/lib/codemirror.css');
require('codemirror/theme/seti.css');
require('codemirror/addon/display/fullscreen.css');
require('../../styles/codemirror.less');
require('codemirror/addon/display/panel');
require('codemirror/mode/xml/xml');
require('codemirror/mode/javascript/javascript');
require('codemirror/mode/yaml/yaml');
require('codemirror/addon/display/fullscreen');
require('codemirror/addon/edit/matchbrackets');// eslint-disable-next-line react/no-redundant-should-component-update
class CodeMirrorForm extends PureComponent {constructor(props) {super(props);this.state = {fullScreen: false};this.CodeMirrorRef = '';}componentWillReceiveProps(nextProps) {const { name, data, setFieldsValue } = this.props;const { CodeMirrorRef } = this;if (data !== nextProps.data && CodeMirrorRef) {setFieldsValue({[name]: nextProps.data});if (CodeMirrorRef) {const editor = CodeMirrorRef.getCodeMirror();editor.setValue(nextProps.data);}}}saveRef = ref => {this.CodeMirrorRef = ref;const { saveRef = false } = this.props;if (saveRef) {saveRef(ref);}};handleChangeUpload = info => {const { beforeUpload } = this.props;if (beforeUpload) {if (beforeUpload(info.file, false)) {this.handleFile(info);}return null;}return this.handleFile(info);};handleFile = info => {let fileList = [...info.fileList];if (fileList.length > 0) {fileList = fileList.slice(-1);this.readFileContents(fileList, 'file_content');}};readFileContents = fileList => {let fileString = '';const { CodeMirrorRef } = this;const { name, setFieldsValue } = this.props;for (let i = 0; i < fileList.length; i++) {const reader = new FileReader(); // 新建一个FileReaderreader.readAsText(fileList[i].originFileObj, 'UTF-8'); // 读取文件// eslint-disable-next-line no-loop-funcreader.onload = evt => {// 读取完文件之后会回来这里fileString += evt.target.result; // 读取文件内容setFieldsValue({[name]: fileString});if (CodeMirrorRef) {const editor = CodeMirrorRef.getCodeMirror();editor.setValue(fileString);}};}};checkValue = (_, value, callback) => {const { message } = this.props;if (value === '' || !value || (value && value.trim() === '')) {callback(message);return;}callback();};render() {const {Form,getFieldDecorator,formItemLayout,data,label,name,message,width: proWidth,mode,action,beforeUpload,isHeader = true,isUpload = true,isAmplifications = true,disabled = false,titles,bg = '#333',help} = this.props;const { fullScreen } = this.state;let defaultFullScreenStyle = {display: 'flex',justifyContent: 'space-between',cursor: 'pointer',top: '0',textAlign: 'left',background: bg,lineHeight: '1px',padding: '9px 0 6px 0'};if (fullScreen) {defaultFullScreenStyle = Object.assign(defaultFullScreenStyle, {position: 'fixed',right: '5px',width: '100%',zIndex: 99});} else {defaultFullScreenStyle = Object.assign(defaultFullScreenStyle, {position: 'absolute',width: proWidth || '100%',zIndex: 4});}const options = {mode: { name: mode || 'javascript', json: true },lineNumbers: true,theme: 'seti',fullScreen,lineWrapping: true,smartIndent: true,matchBrackets: true,scrollbarStyle: null,showCursorWhenSelecting: true,readOnly: disabled};const token = cookie.get('token');const amplifications = (<spanstyle={{ margin: '0 20px' }}onClick={() => {this.setState({ fullScreen: !this.state.fullScreen });}}>{globalUtil.fetchSvg('amplifications')}</span>);return (<Form.Item{...formItemLayout}label={label}help={help && <span style={{ color: 'red' }}>{help}</span>}className={fullScreen? `${styles.fullScreens} ${styles.childrenWidth}`: styles.childrenWidth}>{getFieldDecorator(name, {initialValue: data || '',rules: [{ required: true, validator: this.checkValue }]})(<CodeMirror options={options} ref={this.saveRef} />)}{amplifications}{isHeader && (<div style={defaultFullScreenStyle}><divstyle={{ lineHeight: '20px', paddingLeft: '30px', color: '#fff' }}>{titles || ''}</div><div>{isUpload && (<Uploadaction={action ||`${apiconfig.baseUrl}/console/enterprise/team/certificate`}showUploadList={false}withCredentialsheaders={{ Authorization: `GRJWT ${token}` }}beforeUpload={beforeUpload || false}onChange={this.handleChangeUpload}>{globalUtil.fetchSvg('uploads')}</Upload>)}{isAmplifications && amplifications}</div></div>)}</Form.Item>);}
}export default CodeMirrorForm;

React中CodeMirror插件的使用及封装相关推荐

  1. react中quill插件的使用

    ##react中quill的使用 近期使用由于项目需要一款富文本编辑框,本来打算试着使用drift.js写一款富文本编辑器.但由于时间比较紧急最后选择引用第三方插件,在众多富文本插件中初步选择了Qui ...

  2. react中CodeMirror (代码编辑器)

    前言: 实现一个在react项目中页面展示代码编辑器的效果. codemirror: 使用JavaScript为浏览器实现的多功能文本编辑器.codemirror作用:专门用于编辑代码,并带有实现更高 ...

  3. android 倒计时封装,react native中的聊天气泡及timer封装成的发送验证码倒计时

    其实,今天我想把我近期遇到的坑都总结一下: 1.goBack的跨页面跳转,又两种方法,一可以像兔哥那样修改navigation源码,二可以用navigationActions 2.父子组件的传值,一可 ...

  4. react 中使用Swiper轮播图插件

    第一步.安装 npm i swiper 第二步.使用 import { Swiper, SwiperSlide } from 'swiper/react'; //根据自己的需要引用样式 import ...

  5. react文字滚动插件_【赠书】Preact(React)核心原理详解

    豆皮粉儿们,又见面了,今天这一期,由字节跳动数据平台的"winge(宝丁)",带大家见识见识前端"轮子"之一Preact框架. 提到Preact,你肯定会先想到 ...

  6. React中的Portal组件

    这可以在这里看:http://leozdgao.me/reactzhong-de-portalzu-jian/ 几个月前遇到了写模态窗(modal)的需求,当初其实没什么思路,不知道怎么用更React ...

  7. React学习(十)-React中编写样式CSS(styled-components)

    虽互不曾谋面,但希望能和你成为笔尖下的朋友 以读书,技术,生活为主,偶尔撒点鸡汤 不作,不敷衍,意在真诚吐露,用心分享 点击左上方,可关注本刊 撰文 | 川川 VX-ID:suibichuanji 点 ...

  8. jquery 监听td点击事件_React 事件 | 1. React 中的事件委托

    说到 React 的事件,也算是 React 的一个非常有亮点的优化,它在原生事件体系的基础上,单独实现了一套事件机制.想要了解这个机制,首先的了解下什么是事件委托以及事件委托的好处. 事件委托 假设 ...

  9. mobx在react中应用_借助React Native Elements,Jest和MobX MST可以轻松实现现实世界中的ReactNative应用...

    mobx在react中应用 by Qaiser Abbas 由Qaiser Abbas 借助React Native Elements,Jest和MobX MST可以轻松实现现实世界中的ReactNa ...

最新文章

  1. mysql 左连接 去重复,MySQL删除左连接,3个表上的重复列
  2. C#学习小记12实现一个接口
  3. [机器学习]AutoML --- NNI (Microsoft)
  4. 论文学习7-Spam Review Detection with Graph Convolutional Networks(阿里巴巴)
  5. unix系统编码 java_JAVA字符编码系列三:Java应用中的编码问题
  6. php怎么给接口里的方法传参,PHP接口中方法的参数和实现类方法中的参数可以不一致的问题...
  7. 微信小程序接口测试时appid为空如何解决
  8. promiseKit 解析 iOS
  9. 自学python能找到工作吗-自学Python好找工作吗?
  10. springboot做网站_Github点赞接近100k的SpringBoot学习教程+实战推荐!牛批!
  11. Python验证码识别处理实例
  12. Java中的注释方法
  13. ADB常用命令及详解
  14. 数控切削加工尺寸不稳定怎么办?这么办!
  15. 三星,现代,中颖,合泰,松翰等单片机定时器溢出计算公式
  16. More Effective C++之 Item M6:自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别
  17. 帕金森病的功能性脑连接障碍:一项5年的纵向研究
  18. Beta 测试和 Alpha 测试有什么区别?
  19. Linux-2 文件管理(vi 和vim)
  20. Python Scrapy简单爬虫-爬取澳洲药店,代购党的福音

热门文章

  1. Java面试大全(2020年版)101-200
  2. YoukuParser 程序 解析优酷视频
  3. 使用Java实现简单的监控系统
  4. Spring boot + Jsoup 搭建高清视频解析系统接口只需1分钟
  5. 简诉事件代理(事件委托)及其优点
  6. 西游记中出现的女神仙
  7. 卧槽!竟然可以直接白嫖 Github Action 的 2C7G 服务器。。
  8. 3, excel vba 获取表格里的单元格的值
  9. 测绘工程与计算机论文,测绘工程毕业论文.doc
  10. 寡言,而心存一片海。