Toolbar,mode=”simple”
取消了选中文字的悬浮菜单
@wangeditor/editor@5

  1. "@wangeditor/editor": "^5.1.23",
  2. "@wangeditor/editor-for-react": "^1.0.6",

WangEditor编辑器简洁版预览
1190px宽度,编辑器UI效果
image.png

865px宽度,编辑器UI效果
image.png

WangEditor 编辑器

  1. import {
  2. useState,
  3. useEffect,
  4. useMemo
  5. } from 'react';
  6. import {
  7. string,
  8. number,
  9. object,
  10. array,
  11. func,
  12. oneOf,
  13. oneOfType
  14. } from "prop-types";
  15. import { merge, noop, isEqual } from "lodash-es";
  16. import cls from 'classnames';
  17. import { Editor, Toolbar } from '@wangeditor/editor-for-react';
  18. import {
  19. IDomEditor,
  20. IEditorConfig,
  21. IToolbarConfig
  22. } from '@wangeditor/editor';
  23. WangEditor.propTypes = {
  24. value: oneOfType([array, string]),
  25. onChange: func,
  26. height: number,
  27. placeholder: string,
  28. mode: oneOf(["simple", "default"]),
  29. className: oneOfType([string, object]),
  30. style: object,
  31. };
  32. WangEditor.defaultProps = {
  33. value: "",
  34. onChange: noop,
  35. height: 200,
  36. placeholder: "请输入内容...",
  37. mode: "simple"
  38. };
  39. function WangEditor(props) {
  40. const {
  41. value,
  42. onChange,
  43. height,
  44. placeholder,
  45. mode,
  46. className,
  47. style
  48. } = props;
  49. // editor 编辑器实例
  50. const [editorInst, setEditorInst] = useState<IDomEditor | null>(null);
  51. // 编辑器内容
  52. const [content, setContent] = useState(value);
  53. // useEffect 是在render结束之后才执行的
  54. useEffect(() => {
  55. // 及时销毁 editorInst 重要!
  56. return () => {
  57. if (!editorInst) return;
  58. editorInst.destroy();
  59. setEditorInst(null);
  60. };
  61. }, [editorInst]);
  62. // value 改变,设置 content
  63. useEffect(() => {
  64. if (isEqual(value, content)) return;
  65. setContent(value);
  66. }, [value]);
  67. // 工具栏配置
  68. const toolbarConfig: Partial<IToolbarConfig> = useMemo(() => ({}), []);
  69. // 编辑器配置
  70. const editorConfig: Partial<IEditorConfig> = useMemo(() => ({
  71. placeholder,
  72. // scroll: false, // 禁止编辑器滚动
  73. // maxLength: 1000,
  74. // onMaxLength(editor) {
  75. // console.log('Trigger maxlength callback')
  76. // },
  77. MENU_CONF: {
  78. // onChange(editor: any) {
  79. // console.log(editor.getHtml());
  80. // },
  81. uploadImage: {
  82. // form-data fieldName ,默认值 'wangeditor-uploaded-image'
  83. fieldName: 'your-custom-name',
  84. // 单个文件的最大体积限制,默认为 2M
  85. maxFileSize: 2 * 1024 * 1024, // 1M
  86. // 最多可上传几个文件,默认为 100
  87. maxNumberOfFiles: 10,
  88. // 选择文件时的类型限制,默认为 ['image/*'] 。如不想限制,则设置为 []
  89. allowedFileTypes: ['image/*'],
  90. /**
  91. * 小于该值就插入 base64 格式(而不上传),默认为 0
  92. * 1MB 兆 = 1024KB 千字节 * 1024B 比特 = 1048576 kb 字节
  93. * 1MB = 1024KB
  94. * 1KB = 1024B
  95. * 10 * 1024 * 1024, // 10M 以下插入 base64
  96. */
  97. // 10 * 1024 * 1024 // 10M 以下
  98. base64LimitSize: 5 * 1024, // 5kb
  99. // 跨域是否传递 cookie ,默认为 false
  100. withCredentials: true,
  101. // 超时时间,默认为 10 秒
  102. timeout: 5 * 1000, // 5 秒
  103. // 自定义增加 http header
  104. headers: {
  105. Accept: 'text/x-json',
  106. otherKey: 'xxx',
  107. },
  108. // 自定义上传参数,例如传递验证的 token 等。参数会被添加到 formData 中,一起上传到服务端。
  109. meta: {
  110. token: 'xxx',
  111. otherKey: 'yyy',
  112. },
  113. },
  114. // fontSize: { // 覆盖默认的配置
  115. // fontSizeList: [
  116. // { name: '26px', value: '26px' },
  117. // ],
  118. // }
  119. }
  120. }), [placeholder]);
  121. function handleChange(editor: IDomEditor) {
  122. // const html = editor.getHtml(); // 获取 HTML
  123. // const text = editor.getText(); // 获取纯文本,默认带换行符
  124. // const text = editor.getText().replace(/\n|\r/mg, '');
  125. const json = editor.children; // 获取 JSON []
  126. // editor.getSelectionText() // 选中的文字
  127. setContent(json);
  128. onChange(json, editor);
  129. }
  130. const EditorStyle = useMemo(() => {
  131. return merge({ height, overflow: "hidden auto" }, style);
  132. }, [style, height]);
  133. return (
  134. <div className={cls('z-100', className)}>
  135. {/*工具栏组件*/}
  136. <Toolbar
  137. editor={editorInst}
  138. defaultConfig={toolbarConfig}
  139. mode={mode}
  140. />
  141. {/*编辑器组件*/}
  142. <Editor
  143. defaultConfig={editorConfig}
  144. content={content}
  145. onCreated={setEditorInst}
  146. // 编辑器内容改变
  147. onChange={handleChange}
  148. style={EditorStyle}
  149. mode={mode}
  150. />
  151. </div>
  152. );
  153. }
  154. export default WangEditor;

value

value,默认只支持 html标签 string字符串格式
html字符串细节

  • html字符串存储是没有样式的,需要自己维护 css样式
  • html必须是 WangEditor生成的 html字符串,不能是自定义的 html,自定义的可能解析失败
  • 自定义的 html无法全部兼容,例如行内的样式,就会解析失败

content

json格式,需要设置 content,而不是 value

@wangeditor.css

global.less引入 编辑器全局样式
@import “./assets/css/@wangeditor.css”;
样式自定义参考 import “@wangeditor/editor/dist/css/style.css”;

  1. .w-e-text-container {
  2. position: relative;
  3. height: 100%;
  4. border: 1px solid var(--w-e-toolbar-border-color);
  5. border-top: none;
  6. background-color: var(--w-e-textarea-bg-color);
  7. color: var(--w-e-textarea-color);
  8. }
  9. .w-e-toolbar {
  10. flex-wrap: wrap;
  11. position: relative;
  12. border-radius: 8px 8px 0 0;
  13. background-color: var(--w-e-toolbar-border-color);
  14. }