用于 Vue React

如果是第一次使用,请先通过 快速开始 了解基本使用。

注意

本文只介绍各个框架的组件接入,实际使用时还需要很多配置、API 。
所以,阅读下文代码时,如遇到 工具栏配置 编辑器配置 菜单配置 editor API 等字眼,请继续参考其他文档:

Vue2

Demo

安装

需安装 @wangeditor/editor@wangeditor/editor-for-vue,可参考这里

使用

模板

  1. <template>
  2. <div style="border: 1px solid #ccc;">
  3. <Toolbar
  4. style="border-bottom: 1px solid #ccc"
  5. :editor="editor"
  6. :defaultConfig="toolbarConfig"
  7. :mode="mode"
  8. />
  9. <Editor
  10. style="height: 500px; overflow-y: hidden;"
  11. v-model="html"
  12. :defaultConfig="editorConfig"
  13. :mode="mode"
  14. @onCreated="onCreated"
  15. />
  16. </div>
  17. </template>

script

  1. <script>
  2. import Vue from 'vue'
  3. import '@wangeditor/editor/dist/css/style.css'
  4. import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
  5. export default Vue.extend({
  6. components: { Editor, Toolbar },
  7. data() {
  8. return {
  9. editor: null,
  10. html: '<p>hello</p>',
  11. toolbarConfig: { },
  12. editorConfig: { placeholder: '请输入内容...' },
  13. mode: 'default', // or 'simple'
  14. }
  15. },
  16. methods: {
  17. onCreated(editor) {
  18. this.editor = Object.seal(editor) // 一定要用 Object.seal() ,否则会报错
  19. },
  20. },
  21. mounted() {
  22. // 模拟 ajax 请求,异步渲染编辑器
  23. setTimeout(() => {
  24. this.html = '<p>模拟 Ajax 异步设置内容 HTML</p>'
  25. }, 1500)
  26. },
  27. beforeDestroy() {
  28. const editor = this.editor
  29. if (editor == null) return
  30. editor.destroy() // 组件销毁时,及时销毁编辑器
  31. }
  32. })
  33. </script>

TIP

  • 赋值 this.editor 时要用 Object.seal()
  • 组件销毁时,要及时销毁编辑器

记得引入 style

  1. <style src="@wangeditor/editor/dist/css/style.css"></style>

配置

可通过 toolbarConfigeditorConfig 来修改菜单栏和编辑器的配置,详细文档参考

【注意】,编辑器配置中 onXxx 格式的生命周期函数,必须通过 Vue 事件来传递,不可以放在 editorConfig,例如:

  1. <template>
  2. <div style="border: 1px solid #ccc;">
  3. <Toolbar ... />
  4. <Editor
  5. @onCreated="onCreated"
  6. @onChange="onChange"
  7. @onDestroyed="onDestroyed"
  8. @onMaxLength="onMaxLength"
  9. @onFocus="onFocus"
  10. @onBlur="onBlur"
  11. @customAlert="customAlert"
  12. @customPaste="customPaste"
  13. />
  14. </div>
  15. </template>
  1. methods: {
  2. onCreated(editor) {
  3. this.editor = Object.seal(editor)
  4. console.log('onCreated', editor)
  5. },
  6. onChange(editor) { console.log('onChange', editor.children) },
  7. onDestroyed(editor) { console.log('onDestroyed', editor) },
  8. onMaxLength(editor) { console.log('onMaxLength', editor) },
  9. onFocus(editor) { console.log('onFocus', editor) },
  10. onBlur(editor) { console.log('onBlur', editor) },
  11. customAlert(info: string, type: string) { window.alert(`customAlert in Vue demo\n${type}:\n${info}`) },
  12. customPaste(editor, event, callback) {
  13. console.log('ClipboardEvent 粘贴事件对象', event)
  14. // const html = event.clipboardData.getData('text/html') // 获取粘贴的 html
  15. // const text = event.clipboardData.getData('text/plain') // 获取粘贴的纯文本
  16. // const rtf = event.clipboardData.getData('text/rtf') // 获取 rtf 数据(如从 word wsp 复制粘贴)
  17. // 自定义插入内容
  18. editor.insertText('xxx')
  19. // 返回 false ,阻止默认粘贴行为
  20. event.preventDefault()
  21. callback(false) // 返回值(注意,vue 事件的返回值,不能用 return)
  22. // 返回 true ,继续默认的粘贴行为
  23. // callback(true)
  24. },
  25. }

调用 API

当编辑器渲染完成之后,通过 this.editor 获取 editor 实例,即可调用它的 API 。参考 编辑器 API

  1. <template>
  2. <div>
  3. <button @click="insertText">insert text</button>
  4. <div style="border: 1px solid #ccc;">
  5. <Toolbar .../>
  6. <Editor .../>
  7. </div>
  8. </div>
  9. </template>
  1. methods: {
  2. insertText() {
  3. const editor = this.editor // 获取 editor 实例
  4. if (editor == null) return
  5. // 调用 editor 属性和 API
  6. editor.insertText('一段文字')
  7. console.log(editor.children)
  8. },
  9. },

Vue3

Demo

安装

需安装 @wangeditor/editor@wangeditor/editor-for-vue@next,可参考这里

使用

模板

  1. <template>
  2. <div style="border: 1px solid #ccc">
  3. <Toolbar
  4. style="border-bottom: 1px solid #ccc"
  5. :editor="editorRef"
  6. :defaultConfig="toolbarConfig"
  7. :mode="mode"
  8. />
  9. <Editor
  10. style="height: 500px; overflow-y: hidden;"
  11. v-model="valueHtml"
  12. :defaultConfig="editorConfig"
  13. :mode="mode"
  14. @onCreated="handleCreated"
  15. />
  16. </div>
  17. </template>

script

  1. <script>
  2. import '@wangeditor/editor/dist/css/style.css' // 引入 css
  3. import { onBeforeUnmount, ref, shallowRef, onMounted } from 'vue'
  4. import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
  5. export default {
  6. components: { Editor, Toolbar },
  7. setup() {
  8. // 编辑器实例,必须用 shallowRef
  9. const editorRef = shallowRef()
  10. // 内容 HTML
  11. const valueHtml = ref('<p>hello</p>')
  12. // 模拟 ajax 异步获取内容
  13. onMounted(() => {
  14. setTimeout(() => {
  15. valueHtml.value = '<p>模拟 Ajax 异步设置内容</p>'
  16. }, 1500)
  17. })
  18. const toolbarConfig = {}
  19. const editorConfig = { placeholder: '请输入内容...' }
  20. // 组件销毁时,也及时销毁编辑器
  21. onBeforeUnmount(() => {
  22. const editor = editorRef.value
  23. if (editor == null) return
  24. editor.destroy()
  25. })
  26. const handleCreated = (editor) => {
  27. editorRef.value = editor // 记录 editor 实例,重要!
  28. }
  29. return {
  30. editorRef,
  31. valueHtml,
  32. mode: 'default', // 或 'simple'
  33. toolbarConfig,
  34. editorConfig,
  35. handleCreated
  36. };
  37. }
  38. }
  39. </script>

TIP

  • editorRef 必须用 shallowRef
  • 组件销毁时,要及时销毁编辑器

配置

可通过 toolbarConfigeditorConfig 来修改菜单栏和编辑器的配置,详细文档参考

【注意】,编辑器配置中 onXxx 格式的生命周期函数,必须通过 Vue 事件来传递,不可以放在 editorConfig,例如:

  1. <template>
  2. <div style="border: 1px solid #ccc">
  3. <Toolbar ... />
  4. <Editor
  5. @onCreated="handleCreated"
  6. @onChange="handleChange"
  7. @onDestroyed="handleDestroyed"
  8. @onFocus="handleFocus"
  9. @onBlur="handleBlur"
  10. @customAlert="customAlert"
  11. @customPaste="customPaste"
  12. />
  13. </div>
  14. </template>
  1. const handleCreated = (editor) => {
  2. editorRef.value = editor
  3. console.log('created', editor)
  4. }
  5. const handleChange = (editor) => { console.log('change:', editor.children) }
  6. const handleDestroyed = (editor) => { console.log('destroyed', editor) }
  7. const handleFocus = (editor) => { console.log('focus', editor) }
  8. const handleBlur = (editor) => { console.log('blur', editor) }
  9. const customAlert = (info, type) => { alert(`【自定义提示】${type} - ${info}`) }
  10. const customPaste = (editor, event, callback) => {
  11. console.log('ClipboardEvent 粘贴事件对象', event)
  12. // const html = event.clipboardData.getData('text/html') // 获取粘贴的 html
  13. // const text = event.clipboardData.getData('text/plain') // 获取粘贴的纯文本
  14. // const rtf = event.clipboardData.getData('text/rtf') // 获取 rtf 数据(如从 word wsp 复制粘贴)
  15. // 自定义插入内容
  16. editor.insertText('xxx')
  17. // 返回 false ,阻止默认粘贴行为
  18. event.preventDefault()
  19. callback(false) // 返回值(注意,vue 事件的返回值,不能用 return)
  20. // 返回 true ,继续默认的粘贴行为
  21. // callback(true)
  22. }
  23. return {
  24. // 省略其他 ...
  25. handleCreated,
  26. handleChange,
  27. handleDestroyed,
  28. handleFocus,
  29. handleBlur,
  30. customAlert,
  31. customPaste
  32. }

调用 API

当编辑器渲染完成之后,通过 editorRef.value 获取 editor 实例,即可调用它的 API 。参考 编辑器 API

  1. <template>
  2. <div>
  3. <button @click="insertText">insert text</button>
  4. <div style="border: 1px solid #ccc">
  5. <Toolbar ... />
  6. <Editor ... />
  7. </div>
  8. </div>
  9. </template>
  1. const insertText = () => {
  2. const editor = editorRef.value // 获取 editor ,必须等待它渲染完之后
  3. if (editor == null) return
  4. editor.insertText('hello world') // 执行 editor API
  5. }
  6. return {
  7. // 省略其他 ...
  8. insertText
  9. }

React

Demo

安装

需安装 @wangeditor/editor@wangeditor/editor-for-react,可参考这里

使用

示例源码用于 Vue React - 图7open in new window

  1. import '@wangeditor/editor/dist/css/style.css' // 引入 css
  2. import React, { useState, useEffect } from 'react'
  3. import { Editor, Toolbar } from '@wangeditor/editor-for-react'
  4. import { IDomEditor, IEditorConfig } from '@wangeditor/editor'
  5. function MyEditor() {
  6. const [editor, setEditor] = useState<IDomEditor | null>(null) // 存储 editor 实例
  7. const [html, setHtml] = useState('<p>hello</p>') // 编辑器内容
  8. // 模拟 ajax 请求,异步设置 html
  9. useEffect(() => {
  10. setTimeout(() => {
  11. setHtml('<p>hello&nbsp;world</p>')
  12. }, 1500)
  13. }, [])
  14. const toolbarConfig = { }
  15. const editorConfig: Partial<IEditorConfig> = {
  16. placeholder: '请输入内容...',
  17. }
  18. // 及时销毁 editor ,重要!
  19. useEffect(() => {
  20. return () => {
  21. if (editor == null) return
  22. editor.destroy()
  23. setEditor(null)
  24. }
  25. }, [editor])
  26. return (
  27. <>
  28. <div style={{ border: '1px solid #ccc', zIndex: 100}}>
  29. <Toolbar
  30. editor={editor}
  31. defaultConfig={toolbarConfig}
  32. mode="default"
  33. style={{ borderBottom: '1px solid #ccc' }}
  34. />
  35. <Editor
  36. defaultConfig={editorConfig}
  37. value={html}
  38. onCreated={setEditor}
  39. onChange={editor => setHtml(editor.getHtml())}
  40. mode="default"
  41. style={{ height: '500px', 'overflow-y': 'hidden' }}
  42. />
  43. </div>
  44. <div style={{ marginTop: '15px' }}>
  45. {html}
  46. </div>
  47. </>
  48. )
  49. }
  50. export default MyEditor

配置

可通过 toolbarConfigeditorConfig 来修改菜单栏和编辑器的配置,详细文档参考

调用 API

当编辑器渲染完成之后,即可调用它的 API 。参考 编辑器 API

  1. function insertText() {
  2. if (editor == null) return
  3. editor.insertText('hello')
  4. }
  5. return (
  6. <>
  7. <button onClick={insertText}>insert text</button>
  8. <div style={{ border: '1px solid #ccc', zIndex: 100}}>
  9. <Toolbar ... />
  10. <Editor ... />
  11. </div>
  12. </>
  13. )