CodeArea 代码域

代码编辑器。

何时使用

用于输入表单域代码内容,实现对应语言高亮时。

代码演示

基本使用

基本使用。

CodeArea代码域 - 图1

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import { CodeArea, Switch, Row, Col } from 'choerodon-ui/pro';
  4. const style = { height: 60 };
  5. class App extends React.Component {
  6. state = { readOnly: true, disabled: true };
  7. handleChange = (value) => {
  8. this.setState({ readOnly: value });
  9. };
  10. handleDisabledChange = (value) => {
  11. this.setState({ disabled: value });
  12. };
  13. render() {
  14. const { readOnly, disabled } = this.state;
  15. return (
  16. <Row gutter={10}>
  17. <Col span={8}>
  18. <CodeArea style={style} />
  19. </Col>
  20. <Col span={8}>
  21. <CodeArea readOnly={readOnly} style={style} defaultValue="ReadOnly" />
  22. <Switch onChange={this.handleChange} checked={readOnly}>
  23. 只读
  24. </Switch>
  25. </Col>

受控代码框

受控代码框。

CodeArea代码域 - 图2

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import { CodeArea } from 'choerodon-ui/pro';
  4. const style = { height: 80 };
  5. class App extends React.Component {
  6. state = {
  7. value: 'Controlled Value',
  8. };
  9. handleChange = (value) => {
  10. this.setState({ value });
  11. };
  12. render() {
  13. return (
  14. <CodeArea
  15. value={this.state.value}
  16. style={style}
  17. onChange={this.handleChange}
  18. />
  19. );
  20. }
  21. }
  22. ReactDOM.render(<App />, document.getElementById('container'));

数据绑定

数据绑定

CodeArea代码域 - 图3

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import { CodeArea, DataSet } from 'choerodon-ui/pro';
  4. const jsonText = `{
  5. "compilerOptions": {
  6. "strictNullChecks": true,
  7. "moduleResolution": "node",
  8. "allowSyntheticDefaultImports": true,
  9. "experimentalDecorators": true,
  10. "jsx": "preserve",
  11. "noUnusedParameters": true,
  12. "noUnusedLocals": true,
  13. "declaration": true,
  14. "target": "es6",
  15. "lib": [
  16. "dom",
  17. "dom.iterable",
  18. "es7",
  19. "es2017.object"]
  20. },
  21. "exclude": [
  22. "node_modules",
  23. "lib",
  24. "es"
  25. ]
  26. }
  27. `;
  28. const style = { height: 550 };
  29. class App extends React.Component {
  30. ds = new DataSet({
  31. autoCreate: true,
  32. fields: [
  33. { name: 'content', type: 'string', defaultValue: jsonText, required: true, readOnly: true },
  34. ],
  35. });
  36. render() {
  37. return <CodeArea dataSet={this.ds} name="content" style={style} />;
  38. }
  39. }
  40. ReactDOM.render(
  41. <App />,
  42. document.getElementById('container')
  43. );

主题

使用不同主题。

CodeArea代码域 - 图4

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import { CodeArea, Switch, DataSet } from 'choerodon-ui/pro';
  4. // 这两个主题不是组件内置的主题,需要手动引入
  5. import 'codemirror/theme/material.css';
  6. import 'codemirror/theme/idea.css';
  7. // 引入 javascript lint
  8. import 'choerodon-ui/pro/lib/code-area/lint/javascript';
  9. // 处理 codemirror 的SSR问题, 如无需SSR,请用import代替require;
  10. import 'codemirror/mode/javascript/javascript';
  11. const jsonText = `{
  12. "compilerOptions": {
  13. "strictNullChecks": true,
  14. "moduleResolution": "node",
  15. "allowSyntheticDefaultImports": true,
  16. "experimentalDecorators": true,
  17. "jsx": "preserve",
  18. "noUnusedParameters": true,
  19. "noUnusedLocals": true,
  20. "declaration": true,
  21. "target": "es6",
  22. "lib": [
  23. "dom",
  24. "dom.iterable",
  25. "es7",
  26. "es2017.object"]
  27. },
  28. "exclude": [
  29. "node_modules",
  30. "lib",
  31. "es"
  32. ]
  33. }
  34. `;
  35. const style = { height: 525 };
  36. class App extends React.Component {
  37. state = {
  38. theme: 'idea',
  39. };
  40. ds = new DataSet({
  41. autoCreate: true,
  42. fields: [
  43. {
  44. name: 'content',
  45. type: 'string',
  46. defaultValue: jsonText,
  47. required: true,
  48. },
  49. ],
  50. });

Javascript格式化

使用快捷键格式化代码,要传入一个 formatter 对象。默认的格式化快捷键是Alt + F,去格式化快捷键是Alt + R,可以通过属性手动配置。

CodeArea代码域 - 图5

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import { CodeArea, DataSet } from 'choerodon-ui/pro';
  4. // 引入格式化器
  5. import JSFormatter from 'choerodon-ui/pro/lib/code-area/formatters/JSFormatter';
  6. // 引入 javascript lint
  7. import 'choerodon-ui/pro/lib/code-area/lint/javascript';
  8. // 处理 codemirror 的SSR问题, 如无需SSR,请用import代替require;
  9. import 'codemirror/mode/javascript/javascript';
  10. // if (typeof window !== 'undefined') {
  11. // // 提供对应语言的语法高亮
  12. // require('codemirror/mode/javascript/javascript');
  13. // }
  14. const options = { mode: 'javascript' };
  15. const jsText = `function getOptions() {
  16. var options = {
  17. "compilerOptions": {
  18. "strictNullChecks": true,
  19. "moduleResolution": "node",
  20. "allowSyntheticDefaultImports": true,
  21. "experimentalDecorators": true,
  22. "jsx": "preserve",
  23. "noUnusedParameters": true,
  24. "noUnusedLocals": true,
  25. "declaration": true,
  26. "target": "es6",
  27. "lib": [
  28. "dom",
  29. "dom.iterable",
  30. "es7",
  31. "es2017.object"
  32. ]
  33. },
  34. "exclude": [
  35. "node_modules",
  36. "lib",
  37. "es"
  38. ]
  39. };
  40. return options;
  41. }
  42. `;
  43. const jsStyle = { height: 500 };
  44. class App extends React.Component {
  45. ds = new DataSet({
  46. autoCreate: true,
  47. fields: [
  48. { name: 'content', type: 'string', defaultValue: jsText, required: true },
  49. ],

JSON格式化

使用快捷键格式化代码,要传入一个 formatter 对象。默认的格式化快捷键是Alt + F,去格式化快捷键是Alt + R,可以通过属性手动配置。

CodeArea代码域 - 图6

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import { CodeArea, DataSet } from 'choerodon-ui/pro';
  4. // 引入格式化器
  5. import JSONFormatter from 'choerodon-ui/pro/lib/code-area/formatters/JSONFormatter';
  6. // 引入 json lint
  7. import 'choerodon-ui/pro/lib/code-area/lint/json';
  8. // 处理 codemirror 的SSR问题, 如无需SSR,请用import代替require;
  9. import 'codemirror/mode/javascript/javascript';
  10. // if (typeof window !== 'undefined') {
  11. // // 提供对应语言的语法高亮
  12. // require('codemirror/mode/javascript/javascript');
  13. // }
  14. const options = { mode: { name: 'javascript', json: true } };
  15. const jsonText = `{
  16. "compilerOptions": {
  17. "strictNullChecks": true,
  18. "moduleResolution": "node",
  19. "allowSyntheticDefaultImports": true,
  20. "experimentalDecorators": true,
  21. "jsx": "preserve",
  22. "noUnusedParameters": true,
  23. "noUnusedLocals": true,
  24. "declaration": true,
  25. "target": "es6",
  26. "lib": [
  27. "dom",
  28. "dom.iterable",
  29. "es7",
  30. "es2017.object"
  31. ]
  32. },
  33. "exclude": [
  34. "node_modules",
  35. "lib",
  36. "es"
  37. ]
  38. }
  39. `;
  40. const jsonStyle = { height: 500 };
  41. class App extends React.Component {
  42. ds = new DataSet({
  43. autoCreate: true,
  44. fields: [
  45. {
  46. name: 'content',
  47. type: 'string',
  48. defaultValue: jsonText,
  49. required: true,
  50. },

HTML格式化

使用快捷键格式化代码,要传入一个 formatter 对象。默认的格式化快捷键是Alt + F,去格式化快捷键是Alt + R,可以通过属性手动配置。

CodeArea代码域 - 图7

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import { CodeArea, DataSet } from 'choerodon-ui/pro';
  4. // 引入格式化器
  5. import HTMLFormatter from 'choerodon-ui/pro/lib/code-area/formatters/HTMLFormatter';
  6. // 引入 html lint
  7. import 'choerodon-ui/pro/lib/code-area/lint/html';
  8. // 处理 codemirror 的SSR问题, 如无需SSR,请用import代替require;
  9. import 'codemirror/mode/htmlmixed/htmlmixed';
  10. // if (typeof window !== 'undefined') {
  11. // // 提供对应语言的语法高亮
  12. // require('codemirror/mode/htmlmixed/htmlmixed');
  13. // }
  14. const options = { mode: 'htmlmixed' };
  15. const htmlText = `<div class="demo-wrapper">
  16. <span id="demo">Demo</span>
  17. </div>
  18. <script>
  19. var demo = document.getElementById('demo');
  20. demo.style.cssText = 'color: red;';
  21. </script>
  22. `;
  23. const htmlStyle = { height: 200 };
  24. class App extends React.Component {
  25. ds = new DataSet({
  26. autoCreate: true,
  27. fields: [
  28. {
  29. name: 'content',
  30. type: 'string',
  31. defaultValue: htmlText,
  32. required: true,
  33. },
  34. ],
  35. });

YAML格式化

使用快捷键格式化代码,要传入一个 formatter 对象。默认的格式化快捷键是Alt + F,去格式化快捷键是Alt + R,可以通过属性手动配置。

CodeArea代码域 - 图8

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import { CodeArea, DataSet } from 'choerodon-ui/pro';
  4. // 引入格式化器,注意使用模块的默认导出
  5. import YAMLFormatter from 'choerodon-ui/pro/lib/code-area/formatters/YAMLFormatter';
  6. // 引入 yaml lint
  7. import 'choerodon-ui/pro/lib/code-area/lint/yaml';
  8. // 处理 codemirror 的SSR问题, 如无需SSR,请用import代替require;
  9. import 'codemirror/mode/yaml/yaml';
  10. // if (typeof window !== 'undefined') {
  11. // // 提供对应语言的语法高亮
  12. // require('codemirror/mode/yaml/yaml');
  13. // }
  14. const options = { mode: 'yaml' };
  15. const yamlText = `YAML:
  16. - A human-readable data serialization language
  17. - https://en.wikipedia.org/wiki/YAML
  18. yaml:
  19. - A complete JavaScript implementation
  20. - https://www.npmjs.com/package/yaml
  21. `;
  22. const yamlStyle = { height: 200 };
  23. class App extends React.Component {
  24. ds = new DataSet({
  25. autoCreate: true,
  26. fields: [
  27. {
  28. name: 'content',
  29. type: 'string',
  30. defaultValue: yamlText,
  31. required: true,
  32. },
  33. ],
  34. });

API

CodeArea

属性说明类型默认值
options编辑器配置,详见CodeMirror Optionsobject
formatHotKey格式化快捷键stringAlt+F
unFormatHotKey清除格式化快捷键stringAlt+R
formatterCodeAreaFormatter类的实例,用于格式化CodeAreaFormatternew JSONFormatter()
editorDidMount在实例挂载前回调函数(editor: IInstance, value: string, cb: () => void) => void;

更多属性请参考 FormField

自定义主题

组件内置'neat''monokai'两个主题,使用更多主题需要引入对应的样式文件,如下:

  1. // style.less
  2. @import '~codemirror/theme/material.css';

或在*.js文件中引用

  1. import 'codemirror/theme/material.css';

所有可用主题请参考 CodeMirror Themes

更多编辑器配置项

更多编辑器配置可以直接作为输入属性传递给组件,如下:

  1. const options = { tabSize: 4, viewportMargin: Infinity };
  2. <CodeArea options={options} />;

所有可用的配置项请参考 CodeMirror Options