解决表单内无法使用codemirror初始化失败、格式不对齐、行号错位等问题(codemirror react使用专题及常见问题)


在使用Ant Desgin Pro进行业务开发的过程中,遇到需要编辑/展示JSON配置的需求。

Ant Design推荐使用react-codemirror2 或者 react-monaco-editor作为代码编辑器,然后我选择了react-codemirror2进行功能实现。

如何使用

  • Step1:npm install react-codemirror2 codemirror --save

  • Step2:使用

    Q1:想换编辑器的底色、代码的颜色?

    node_modules里找到codemirror文件夹,就可以看到theme文件夹,里面是可以选择的主题。(Tips:neomdn-likeeclipse是为数不多背景色是白色/浅色的主题噢;深色主题推荐dracula,就…挺好看的!下面是展示图)
    在这里插入图片描述

    Q2:我编辑器要写JSON的!

    node_modules里找到codemirror文件夹,就可以看到mode文件夹,里面是可以选择的模式。需要JSON的小伙伴可以通过引入模式里的javascript.js文件,options里的mode的值指定为{name: "javascript", json: true}即可!(官网有说mode可以是一个字符串,也可以是与该模式关联的MIME类型。同理,需要css的就引入css.js文件,mode指定css。)

    Q3:想给编辑器添个高度,换下字号改下样式啥的

    通过给CodeMirror组件添加一个外层元素,然后给这个外层元素增加一个样式,在样式里覆盖.CodeMirror的样式即可!下面是调了高度的和字体的展示:
    在这里插入图片描述

     require('codemirror/lib/codemirror.css');
     require('codemirror/theme/dracula.css'); // 按需引入主题
     require('codemirror/mode/javascript/javascript.js'); // 按需引入模式
     import { Controlled as CodeMirror} from 'react-codemirror2'
     import styles from './TestDemo.less'; // 按需修改
     
     class TestDemo extends PureComponent {
       state = {
         content: ''
       }
     
       render() {
         return (
           <div className={styles.CodeMirrorWrapper}>
             <CodeMirror
               value={this.state.content}
               options={{
                 mode: {name: "javascript", json: true}, // string|object
                 theme: 'dracula',
                 lineNumbers: true
               }}
               onBeforeChange={(editor, data, value) => {
                 this.setState({ content: value });
               }}
               onChange={(editor, data, value) => {
               }}
             />
           </div>
         )
       }
     }
    
     .CodeMirrorWrapper {
       :global {
         .CodeMirror {
           height: 600px; // 组件默认高度是300px
           font: 14px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace; // 字体和双引号更符合我们平时打代码的习惯
         }
       }
     }
     ```
    

你可能会遇到的问题

Q1.在表单里使用CodeMirror,无法赋初始值,无法正常输入?

翻看Ant Design组件文档,可以看到Form表单是支持使用自定义表单控件。按道理我们直接把CodeMirror的value值去掉就可以了呀,然而会发现无法正常使用。这是因为CodeMirror改变值使用的是onBeforeChange={(editor, data, value) => {}方法,而getFieldDecorator使用的是onChange。因此,我们可以通过在外部多加一层元素解决。

此外,CodeMirror组件可以放在任意一个地方,只需要通过getFieldValuesetFieldsValue方法使用即可。

正确使用姿势:

<FormItem label="" {...formLayout}>
  {getFieldDecorator('content',{
    initialValue: current.id ? current.content : ''
  })(
     <div className={styles.CodeMirrorWrapper}>
        <CodeMirror
          value={this.props.form.getFieldValue('content')}
          options={{
            mode: {name: "javascript", json: true},
            theme: 'dracula', // neo、mdn-like、eclipse
            lineNumbers: true
          }}
          onBeforeChange={(editor, data, value) => {
            this.props.form.setFieldsValue({ content: value });
          }}
          onChange={(editor, data, value) => {
          }}
        />
      </div>
  )}
</FormItem>

Q2.格式不对齐、行号错位的样式问题?

利用setTimeout延长100ms获取数据的时间.

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值