mock平台

AceEditor.js 1.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import React from 'react';
  2. import mockEditor from './mockEditor';
  3. import PropTypes from 'prop-types';
  4. import './AceEditor.scss';
  5. const ModeMap = {
  6. javascript: 'ace/mode/javascript',
  7. json: 'ace/mode/json',
  8. text: 'ace/mode/text',
  9. xml: 'ace/mode/xml',
  10. html: 'ace/mode/html'
  11. };
  12. const defaultStyle = { width: '100%', height: '200px' };
  13. function getMode(mode) {
  14. return ModeMap[mode] || ModeMap.text;
  15. }
  16. class AceEditor extends React.PureComponent {
  17. constructor(props) {
  18. super(props);
  19. }
  20. static propTypes = {
  21. data: PropTypes.any,
  22. onChange: PropTypes.func,
  23. className: PropTypes.string,
  24. mode: PropTypes.string, //enum[json, text, javascript], default is javascript
  25. readOnly: PropTypes.bool,
  26. callback: PropTypes.func,
  27. style: PropTypes.object,
  28. fullScreen: PropTypes.bool,
  29. insertCode: PropTypes.func
  30. };
  31. componentDidMount() {
  32. this.editor = mockEditor({
  33. container: this.editorElement,
  34. data: this.props.data,
  35. onChange: this.props.onChange,
  36. readOnly: this.props.readOnly,
  37. fullScreen: this.props.fullScreen
  38. });
  39. let mode = this.props.mode || 'javascript';
  40. this.editor.editor.getSession().setMode(getMode(mode));
  41. if (typeof this.props.callback === 'function') {
  42. this.props.callback(this.editor.editor);
  43. }
  44. }
  45. componentWillReceiveProps(nextProps) {
  46. if (!this.editor) {
  47. return;
  48. }
  49. if (nextProps.data !== this.props.data && this.editor.getValue() !== nextProps.data) {
  50. this.editor.setValue(nextProps.data);
  51. let mode = nextProps.mode || 'javascript';
  52. this.editor.editor.getSession().setMode(getMode(mode));
  53. this.editor.editor.clearSelection();
  54. }
  55. }
  56. render() {
  57. return (
  58. <div
  59. className={this.props.className}
  60. style={this.props.className ? undefined : this.props.style || defaultStyle}
  61. ref={editor => {
  62. this.editorElement = editor;
  63. }}
  64. />
  65. );
  66. }
  67. }
  68. export default AceEditor;