代码在线编辑codemirror在React中使用

3 篇文章 0 订阅

初次学习codemirror笔记,下附完整代码

成果图

安装

yarn add codemirror

 引入

import CodeMirror from 'codemirror';
import 'codemirror/lib/codemirror.css'

 

options配置

1.行号

lineNumbers:true//是否显示左侧行号
firstLineNumber: 1//从哪个数字开始计数行。默认值为 1。

2.编码模式

  模式可查看  https://codemirror.net/mode/

import "codemirror/mode/python/python.js";
 
mode: "python", // 要使用的模式//https://codemirror.net/mode/

3.滚动和换行

 lineWrapping: true,//滚动或换行
 scrollbarStyle: null,//滚动条样式,为null时隐藏滚动条

4.主题

//引入主题文件(可选择自己喜欢的)
import 'codemirror/theme/material.css';
import 'codemirror/theme/solarized.css'

//options中配置
theme: 'material',//主题

 5.代码折叠

// 引入
import 'codemirror/addon/fold/foldgutter.css';
import 'codemirror/addon/fold/foldcode.js';
import 'codemirror/addon/fold/foldgutter.js';
import 'codemirror/addon/fold/brace-fold.js';
import 'codemirror/addon/fold/comment-fold.js';
import 'codemirror/addon/fold/indent-fold.js';

//options中配置
// 在行槽中添加行号显示器、折叠器、语法检测器
gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter", "CodeMirror-lint-markers"],
foldGutter: true, // 启用行槽中的代码折叠

6.缩进

tabSize: 2, //tab键缩进,默认4
smartIndent: true, // 智能缩进
indentUnit: 2, // 智能缩进单位为2个空格长度
indentWithTabs: true//Whether, when indenting, the first N*tabSize spaces should be replaced by N tabs. Default is false.没看明白😅

7.选中行高亮

//引入
import "codemirror/addon/selection/active-line.js";

options中配置
styleActiveLine: true, // 显示选中行的样式

8.括号匹配以及自动补全

// 括号匹配
import "codemirror/addon/edit/closebrackets.js";
import "codemirror/addon/edit/matchbrackets.js";

//options中配置
matchBrackets: true,	//括号匹配
autoCloseBrackets: true,//括号自动补全

 9.代码提示级自动补全

// 代码提示
import 'codemirror/addon/hint/show-hint.css'; //
import 'codemirror/addon/hint/show-hint.js';
import 'codemirror/addon/hint/anyword-hint.js'; // 简单提示,按需引入,spl可引入sql-hint.js

//代码提示自动补全功能
myCodeMirror.on("keypress", function () {//代码补全功能
   myCodeMirror.showHint();
});

//如果未选择提示代码,会默认选中第一个补全代码,emmmm.....
//可在options中配置以下代码,默认不补全,只提示
hintOptions: {
   completeSingle: false//代码自动补全功能不默认补充
},

完整代码

import React, { useEffect, useState } from 'react'
import axios from 'axios';

import CodeMirror from 'codemirror';
import 'codemirror/lib/codemirror.css'
//主题
import 'codemirror/theme/material.css';
import 'codemirror/theme/solarized.css'
// 折叠代码
import 'codemirror/addon/fold/foldgutter.css';
import 'codemirror/addon/fold/foldcode.js';
import 'codemirror/addon/fold/foldgutter.js';
import 'codemirror/addon/fold/brace-fold.js';
import 'codemirror/addon/fold/comment-fold.js';
import 'codemirror/addon/fold/indent-fold.js';

// 代码提示
import 'codemirror/addon/hint/show-hint.css'; //
import 'codemirror/addon/hint/show-hint.js';
import 'codemirror/addon/hint/anyword-hint.js'; // 简单提示,按需引入,spl可引入sql-hint.js

import "codemirror/addon/comment/comment.js";
// 高亮
import "codemirror/addon/selection/active-line.js";

// python语言
import "codemirror/mode/python/python.js";

// 括号匹配
import "codemirror/addon/edit/closebrackets.js";
import "codemirror/addon/edit/matchbrackets.js";

import 'codemirror/addon/lint/lint.js'
import 'codemirror/addon/lint/javascript-lint.js'

import Style from './OnlineEdit.module.css'
import { Button } from 'antd';

let myCodeMirror;
export default function OnlineEdit() {
    const [submitResult, setSubmitResult] = useState('')
    // 初始化编辑器
    useEffect(() => {
        const textArea = document.getElementById("editor");
        myCodeMirror = CodeMirror.fromTextArea(textArea, {
            theme: 'material',//主题
            lineNumbers: true,//显示行号
            firstLineNumber: 1,//行号从几开始,默认1
            lineWrapping: true,//滚动或换行
            scrollbarStyle: null,//隐藏滚动条样式
            tabSize: 2, //tab键缩进,默认4
            smartIndent: true, // 智能缩进
            indentUnit: 2, // 智能缩进单位为2个空格长度
            indentWithTabs: true, // 使用制表符进行智能缩进
            autofocus: true,//自动获取焦点
            // 在行槽中添加行号显示器、折叠器、语法检测器
            gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter", "CodeMirror-lint-markers"],
            foldGutter: true, // 启用行槽中的代码折叠
            mode: "python", // 要使用的模式//https://codemirror.net/mode/
            styleActiveLine: true, // 显示选中行的样式
            matchBrackets: true,	//括号匹配
            autoCloseBrackets: true,//括号自动补全,()[]{}''""
            hintOptions: {
                completeSingle: false//代码自动补全功能不默认补充
            },
        });
        myCodeMirror.setOption("value", 'print("hello word")');//初始值
        myCodeMirror.on("keypress", function () {//代码补全功能
            myCodeMirror.showHint();
        });
        myCodeMirror.setSize('40vw', '50vh');//编辑框大小(宽,高)
    }, [])

    // 将值传给后端,后端返回运行结果
    function runFunction() {
        axios({
            method: 'post',
            url: 'http://192.168.2.139:7000/edit_api/edit',
            params: {
                code: myCodeMirror.getValue()
            },
            // timeout: 5000,
        }).then(function (res) {
            console.log('3:', res)
            if (res.data.code === 0) {
                setSubmitResult(res.data.data.output)
            }
        }).catch(function (error) {
            console.log(error);
        })
    }

    return (
        <div className={Style.mainWrapper}>
            <div className={Style.leftWrapper}>
                <div className={Style.codeTop}>
                    <Button onClick={runFunction} type='primary' >运行</Button>
                </div>
                <textarea id="editor"></textarea>
            </div>
            <div className={Style.rightWrapper}>
                <div className={Style.codeTop}>
                    <p>运行结果</p>
                </div>
                <div className={Style.codeResult}>
                    <div>{submitResult}</div>
                </div>
            </div>

        </div>
    )
}

css样式

.mainWrapper {
    height: 100vh;
    width: 100vw;
    padding: 0px 10vw;
    display: flex;
    /* justify-content: center; */
    align-items: center;
}

.leftWrapper {
    width: 40vw;
    height: 55vh;
}

.rightWrapper {
    width: 40vw;
    height: 55vh;
}

.codeTop {
    height: 5vh;
}

.codeTop p {
    font-weight: 600;
    font-size: 2vh;
}

.codeResult {
    height: 50vh;
    background-color: #263238;
    border-left: 1px solid white;
    /* 识别\n换行 */
    white-space: pre-line;
    padding: 2vh 2vw;
    overflow-y: auto;
    color: white;
}

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
React-codemirror 是一个 React 组件,用于在 React 应用程序使用 CodeMirror 编辑器。要在项目使用 react-codemirror,可以按照以下步骤进行操作: 1. 安装依赖: ```bash npm install react-codemirror codemirror ``` 2. 在组件导入 react-codemirrorcodemirror 样式: ```jsx import React, { useState } from 'react'; import { Controlled as CodeMirror } from 'react-codemirror2'; import 'codemirror/lib/codemirror.css'; import 'codemirror/theme/material.css'; import 'codemirror/mode/javascript/javascript'; ``` 3. 在组件使用 react-codemirror: ```jsx function MyComponent() { const [code, setCode] = useState('const hello = "Hello World!";'); const options = { mode: 'javascript', theme: 'material', lineNumbers: true, }; return ( <CodeMirror value={code} options={options} onBeforeChange={(editor, data, value) => { setCode(value); }} /> ); } ``` 在上面的示例,我们创建了一个包含 CodeMirror 组件的函数组件 `MyComponent`。我们还定义了一个名为 `code` 的状态变量,并将其初始值设置为字符串 `"const hello = 'Hello World!';"`。 我们还定义了一个名为 `options` 的对象,指定了编辑器的一些选项,例如编辑器模式、主题和行号。 最后,我们将 `CodeMirror` 组件渲染到组件,并将 `value`、`options` 和一个回调函数 `onBeforeChange` 作为组件的 props 传递。在回调函数,我们将编辑的值设置为 `code` 状态变量的新值。 这是一个简单的 react-codemirror使用示例。您可以根据您的需要调整代码,以满足您的需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钢镚是个小屁精

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值