戴口罩的汤圆 發表於 2021-7-22 16:15:00

react-codemirror2 代码编辑器

<p>CodeMirror是一款在线的支持语法高亮的代码编辑器。官网:&nbsp;http://codemirror.net/</p>
<p>安装:</p>
<div class="cnblogs_code">
<pre>npm install react-codemirror2 codemirror --save</pre>
</div>
<p>使用:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> import 'codemirror/lib/codemirror.js'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> import 'codemirror/lib/codemirror.css'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 主题风格</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> import 'codemirror/theme/solarized.css'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置代码语言模式(比如JS,SQL,python,java等)</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> import 'codemirror/mode/javascript/javascript'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> import 'codemirror/mode/sql/sql.js'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> import 'codemirror/mode/python/python.js'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> import 'codemirror/mode/shell/shell.js'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">10</span> import 'codemirror/mode/clike/clike.js'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 代码模式,clike是包含java,c++等模式的</span>
<span style="color: rgba(0, 128, 128, 1)">12</span> import 'codemirror/mode/clike/clike'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">13</span> import 'codemirror/mode/css/css'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">ctrl+空格代码提示补全</span>
<span style="color: rgba(0, 128, 128, 1)">15</span> import 'codemirror/addon/hint/show-hint.css'; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> start-ctrl+空格代码提示补全</span>
<span style="color: rgba(0, 128, 128, 1)">16</span> import 'codemirror/addon/hint/show-hint.js'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">17</span> import 'codemirror/addon/hint/anyword-hint.js'; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> end</span>
<span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">代码高亮</span>
<span style="color: rgba(0, 128, 128, 1)">19</span> import 'codemirror/addon/selection/active-line'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">20</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">折叠代码</span>
<span style="color: rgba(0, 128, 128, 1)">21</span> import 'codemirror/addon/fold/foldgutter.css'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">22</span> import 'codemirror/addon/fold/foldcode.js'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">23</span> import 'codemirror/addon/fold/foldgutter.js'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">24</span> import 'codemirror/addon/fold/brace-fold.js'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">25</span> import 'codemirror/addon/fold/comment-fold.js'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">26</span>
<span style="color: rgba(0, 128, 128, 1)">27</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> ScriptTask() {
</span><span style="color: rgba(0, 128, 128, 1)">28</span>   const = useState(<span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">29</span>   const = useState(''<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">30</span>   
<span style="color: rgba(0, 128, 128, 1)">31</span>   <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
</span><span style="color: rgba(0, 128, 128, 1)">32</span>         &lt;<span style="color: rgba(0, 0, 0, 1)">CodeMirror
</span><span style="color: rgba(0, 128, 128, 1)">33</span>         editorDidMount={(editor) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">34</span> <span style="color: rgba(0, 0, 0, 1)">            setInstance(editor);
</span><span style="color: rgba(0, 128, 128, 1)">35</span> <span style="color: rgba(0, 0, 0, 1)">          }}
</span><span style="color: rgba(0, 128, 128, 1)">36</span>         value=<span style="color: rgba(0, 0, 0, 1)">{codeData}
</span><span style="color: rgba(0, 128, 128, 1)">37</span>         options=<span style="color: rgba(0, 0, 0, 1)">{{
</span><span style="color: rgba(0, 128, 128, 1)">38</span>               <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> mode: { name: 'text/sql' }, //定义mode</span>
<span style="color: rgba(0, 128, 128, 1)">39</span>               mode: 'sql', <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义mode</span>
<span style="color: rgba(0, 128, 128, 1)">40</span>               theme: 'solarized', <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">选中的theme</span>
<span style="color: rgba(0, 128, 128, 1)">41</span>               autofocus: <span style="color: rgba(0, 0, 255, 1)">true</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">自动获取焦点</span>
<span style="color: rgba(0, 128, 128, 1)">42</span>               styleActiveLine: <span style="color: rgba(0, 0, 255, 1)">true</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">光标代码高亮</span>
<span style="color: rgba(0, 128, 128, 1)">43</span>               lineNumbers: <span style="color: rgba(0, 0, 255, 1)">true</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">显示行号</span>
<span style="color: rgba(0, 128, 128, 1)">44</span>               smartIndent: <span style="color: rgba(0, 0, 255, 1)">true</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">自动缩进</span>
<span style="color: rgba(0, 128, 128, 1)">45</span>               <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">start-设置支持代码折叠</span>
<span style="color: rgba(0, 128, 128, 1)">46</span>               lineWrapping: <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">47</span>               foldGutter: <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">48</span>               gutters: ['CodeMirror-linenumbers', 'CodeMirror-foldgutter'], <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">end</span>
<span style="color: rgba(0, 128, 128, 1)">49</span> <span style="color: rgba(0, 0, 0, 1)">            extraKeys: {
</span><span style="color: rgba(0, 128, 128, 1)">50</span>                   Ctrl: 'autocomplete'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">51</span>                   'Ctrl-S': <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(editor) {
</span><span style="color: rgba(0, 128, 128, 1)">52</span>                     <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.codeSave(editor);
</span><span style="color: rgba(0, 128, 128, 1)">53</span> <span style="color: rgba(0, 0, 0, 1)">                  },
</span><span style="color: rgba(0, 128, 128, 1)">54</span>                   'Ctrl-Z': <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(editor) {
</span><span style="color: rgba(0, 128, 128, 1)">55</span> <span style="color: rgba(0, 0, 0, 1)">                      editor.undo();
</span><span style="color: rgba(0, 128, 128, 1)">56</span>                   }, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">undo</span>
<span style="color: rgba(0, 128, 128, 1)">57</span>                   F8: <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(editor) {
</span><span style="color: rgba(0, 128, 128, 1)">58</span> <span style="color: rgba(0, 0, 0, 1)">                      editor.redo();
</span><span style="color: rgba(0, 128, 128, 1)">59</span>                   } <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Redo</span>
<span style="color: rgba(0, 128, 128, 1)">60</span> <span style="color: rgba(0, 0, 0, 1)">            },
</span><span style="color: rgba(0, 128, 128, 1)">61</span>               matchBrackets: <span style="color: rgba(0, 0, 255, 1)">true</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">括号匹配,光标旁边的括号都高亮显示</span>
<span style="color: rgba(0, 128, 128, 1)">62</span>               autoCloseBrackets: <span style="color: rgba(0, 0, 255, 1)">true</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">键入时将自动关闭()[]{}''""</span>
<span style="color: rgba(0, 128, 128, 1)">63</span> <span style="color: rgba(0, 0, 0, 1)">          }}
</span><span style="color: rgba(0, 128, 128, 1)">64</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> onChange={changeCode}</span>
<span style="color: rgba(0, 128, 128, 1)">65</span>
<span style="color: rgba(0, 128, 128, 1)">66</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 在失去焦点的时候触发,这个时候放数据最好</span>
<span style="color: rgba(0, 128, 128, 1)">67</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> onBlur={this.codeOnBlur}</span>
<span style="color: rgba(0, 128, 128, 1)">68</span>
<span style="color: rgba(0, 128, 128, 1)">69</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 这个必须加上,否则在一些情况下,第二次打开就会有问题</span>
<span style="color: rgba(0, 128, 128, 1)">70</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">   onBeforeChange={(editor, data, value) =&gt; {</span>
<span style="color: rgba(0, 128, 128, 1)">71</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">       console.log("onBeforeChange fresh")</span>
<span style="color: rgba(0, 128, 128, 1)">72</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">       console.log(JSON.stringify(data));</span>
<span style="color: rgba(0, 128, 128, 1)">73</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">   }}</span>
<span style="color: rgba(0, 128, 128, 1)">74</span>       /&gt;
<span style="color: rgba(0, 128, 128, 1)">75</span> <span style="color: rgba(0, 0, 0, 1)">    )
</span><span style="color: rgba(0, 128, 128, 1)">76</span> }</pre>
</div>
<p>&nbsp;</p>
<h4 id="articleContentId" class="title-article">CodeMirror 事件</h4>
<p>1.onChange(instance,changeObj):codeMirror文本被修改后触发。instance是一个当前的codemirror对象,changeObj是一个{from,to,text[,removed][,origin]}对象。其中from,to分别表示起始行对象和结束行对象,行对象包括ch:改变位置距离行头的间隔字符,line:改变的行数。text是一个字符串数组表示被修改的文本内容,即你输入的内容。</p>
<p>2.onBeforeChange(instance,changObj):内容改变前被调用</p>
<p>3.onCursorActivity(instance):当鼠标点击内容区、选中内容、修改内容时被触发</p>
<p>4.onKeyHandled:(instance,name,event):当一个都dom元素的事件触发时调用,name为操作名称。</p>
<p>5.onInputRead(insatance,changeObj):当一个新的input从隐藏的textara读取出时调用</p>
<p>6.onBeforeSelectionChange(instance,obj):当选中的区域被改变时调用,obj对象是选择的范围和改变的内容(本人未测试成功)</p>
<p>7.onUpdate(instance):编辑器内容被改变时触发</p>
<p>8.onFocus(instance):编辑器获得焦点式触发</p>
<p>9.onBlur(instance):编辑器失去焦点时触发</p>
<h4 id="articleContentId" class="title-article">CodeMirror 常用方法</h4>
<p>getValue():获取编辑器文本内容</p>
<p>setValue(text):设置编辑器文本内容</p>
<p>getRange({line,ch},{line,ch}):获取指定范围内的文本内容第一个对象是起始坐标,第二个是结束坐标</p>
<p>replaceRange(replaceStr,{line,ch},{line,ch}):替换指定区域的内容</p>
<p>getLine(line):获取指定行的文本内容</p>
<p>lineCount():统计编辑器内容行数</p>
<p>firstLine():获取第一行行数,默认为0,从开始计数</p>
<p>lastLine():获取最后一行行数</p>
<p>getLineHandle(line):根据行号获取行句柄</p>
<p>getSelection():获取鼠标选中区域的代码</p>
<p>replaceSelection(str):替换选中区域的代码</p>
<p>setSelection({line:num,ch:num1},{line:num2,ch:num3}):设置一个区域被选中</p>
<p>somethingSelected():判断是否被选择</p>
<p>getEditor():获取CodeMirror对像</p>
<p>undo():撤销</p>
<p>redo():回退</p><br><br>
来源:https://www.cnblogs.com/minjh/p/15044706.html
頁: [1]
查看完整版本: react-codemirror2 代码编辑器