CodeArea代码域

文本域用于输入一段文字。

何时使用

用于编辑或展示代码

代码演示

CodeArea 代码域 - 图1

基本使用

基本使用。

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

CodeArea 代码域 - 图2

数据绑定

数据绑定

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

CodeArea 代码域 - 图3

Javascript格式化

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

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

CodeArea 代码域 - 图4

HTML格式化

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

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

CodeArea 代码域 - 图5

受控代码框

受控代码框。

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

CodeArea 代码域 - 图6

主题

使用不同主题。

  1. import { CodeArea, Switch, DataSet } from 'choerodon-ui/pro';
  2. // 这两个主题不是组件内置的主题,需要手动引入
  3. import 'codemirror/theme/material.css';
  4. import 'codemirror/theme/idea.css';
  5. const jsonText = `{
  6. "compilerOptions": {
  7. "strictNullChecks": true,
  8. "moduleResolution": "node",
  9. "allowSyntheticDefaultImports": true,
  10. "experimentalDecorators": true,
  11. "jsx": "preserve",
  12. "noUnusedParameters": true,
  13. "noUnusedLocals": true,
  14. "declaration": true,
  15. "target": "es6",
  16. "lib": [
  17. "dom",
  18. "dom.iterable",
  19. "es7",
  20. "es2017.object"]
  21. },
  22. "exclude": [
  23. "node_modules",
  24. "lib",
  25. "es"
  26. ]
  27. }
  28. `;
  29. const style = { height: 525 };
  30. class App extends React.Component {
  31. state = {
  32. theme: 'idea',
  33. }
  34. ds = new DataSet({
  35. autoCreate: true,
  36. fields: [
  37. { name: 'content', type: 'string', defaultValue: jsonText, required: true },
  38. ],
  39. });
  40. handleThemeChange = (value) => {
  41. this.setState({ theme: value ? 'material' : 'idea' });
  42. }
  43. render() {
  44. return (
  45. <div>
  46. <CodeArea
  47. dataSet={this.ds}
  48. name="content"
  49. options={{ theme: this.state.theme }}
  50. style={style}
  51. />
  52. <Switch onChange={this.handleThemeChange} unCheckedChildren="idea">material</Switch>
  53. </div>
  54. );
  55. }
  56. }
  57. ReactDOM.render(<App />, mountNode);

CodeArea 代码域 - 图7

JSON格式化

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

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

CodeArea 代码域 - 图8

YAML格式化

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

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

API

CodeArea

属性说明类型默认值
options编辑器配置,详见CodeMirror Optionsobject
formatHotKey格式化快捷键stringAlt+F
unFormatHotKey清除格式化快捷键stringAlt+R
formatterCodeAreaFormatter类的实例,用于格式化CodeAreaFormatternew JSONFormatter()

更多属性请参考 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