import React from 'react';
import { UnControlled as CodeMirror } from 'react-codemirror2';
import * as codemirror from 'codemirror';
// 引入全局样式
import 'codemirror/lib/codemirror.css';
// // 主题风格
import 'codemirror/theme/dracula.css';
// // 代码模式
import 'codemirror/mode/javascript/javascript';
// 添加折叠
require('codemirror/addon/fold/brace-fold.js');
require('codemirror/addon/fold/comment-fold.js');
require('codemirror/addon/fold/foldcode.js');
require('codemirror/addon/fold/foldgutter.js');
require('codemirror/addon/fold/foldgutter.css');
// 括号匹配
require('codemirror/addon/edit/matchbrackets.js');
// 自动补全
require('codemirror/addon/hint/show-hint.css');
require('codemirror/addon/hint/show-hint.js');
require('codemirror/addon/hint/anyword-hint.js');
// 代码检查错误
require('codemirror/addon/lint/json-lint.js');
require('codemirror/addon/lint/lint.css');
require('codemirror/addon/lint/lint.js');
const jsonlint = require('jsonlint-mod');
// eslint-disable-next-line dot-notation
window['jsonlint'] = jsonlint; // 不能删除,json-lint有依赖
// 引入格式化文件
const jsBeautify = require('js-beautify');
const CodeSnnipet: React.FC<{
snippet: string;
onChange?: (editor: codemirror.Editor, data: codemirror.EditorChange, value: string) => void;
}> = ({ snippet, onChange }) => (
<CodeMirror
value={snippet || '{\n\n}'}
options={{
mode: 'application/json',
theme: 'dracula',
lineNumbers: true,
smartIndent: true,
tabSize: 2,
lint: true,
foldGutter: true,
gutters: ['CodeMirror-linenumbers', 'CodeMirror-foldgutter', 'CodeMirror-lint-markers'],
}}
editorDidMount={(editor, data) => {
// 格式化
editor.setValue(jsBeautify(data));
}}
onChange={onChange}
/>
);
export default CodeSnnipet;
动手实现一个JSON编辑器
2020-06-16