- npm install @wangeditor/editor --save
- npm install @wangeditor/editor-for-vue@next --save
安装以上两个包
- <template>
- <div style="border: 1px solid #ccc;width: 1000px;z-index: 100;">
- <Toolbar style="border-bottom: 1px solid #ccc" :editor="editorRef" :defaultConfig="toolbarConfig" />
- <Editor style="height: 400px; overflow-y: hidden;" v-model="valueHtmlCount" :defaultConfig="editorConfig"
- @onCreated="handleCreated" @onChange='handleChange' />
- div>
- template>
注释:
valueHtmlCount:编辑里的内容,为富文本字符串
editorRef:工具栏实例
toolbarConfig:工具栏配置文件
editorConfig:编辑器菜单配置文件
onCreated:创建实例触发的事件
onChange:编辑里的内容改变触发的事件
引入组件:
- 引入样式文件
- import '@wangeditor/editor/dist/css/style.css';
- 引入组件文件
- import { Editor, Toolbar } from '@wangeditor/editor-for-vue';
- 引入数据类型(因为我用的是ts,所以需要引入数据类型)
- import { IToolbarConfig, IEditorConfig, IDomEditor } from '@wangeditor/editor';
- 引入vue常用
- import { onBeforeUnmount, ref, shallowRef, onMounted, watch } from 'vue';
创建实例:
- // 编辑器实例,必须用 shallowRef
- const editorRef = shallowRef()
定义接收富文本的变量:
- // 内容
- const valueHtmlCount = ref(props.valueHtml)
配置工具栏:
- const toolbarConfig: Partial<IToolbarConfig> = {
- /* 工具栏配置 */
- toolbarKeys: [
- 'redo',
- 'undo',
- '|',
- 'headerSelect',
- 'bold',
- 'italic',
- 'underline',
- 'fontSize',
- 'fontFamily',
- 'color',
- 'bgColor',
- 'through',
- 'sub',
- 'sup',
- 'clearStyle',
- 'lineHeight',
- 'insertLink',
- 'divider',
- 'emotion',
- 'blockquote',
- 'justifyLeft',
- 'justifyRight',
- 'justifyCenter',
- 'justifyJustify',
- {
- key: 'group-image', // 必填,要以 group 开头
- title: '图片', // 必填
- iconSvg: '',
- menuKeys: ['uploadImage',
- 'deleteImage']
- },
- 'fullScreen',
- ]
-
- 以下是所支持的所有工具栏字段,共六十个
- // toolbarKeys: ['bold', 'underline', 'italic', 'through', 'code', 'sub', 'sup', 'clearStyle', 'color',
- // 'bgColor', 'fontSize', 'fontFamily', 'indent', 'delIndent', 'justifyLeft', 'justifyRight',
- // 'justifyCenter', 'justifyJustify', 'lineHeight', 'insertImage', 'deleteImage', 'editImage', 'viewImageLink',
- // 'imageWidth30', 'imageWidth50', 'imageWidth100', 'divider', 'emotion', 'insertLink', 'editLink', 'unLink',
- // 'viewLink', 'codeBlock', 'blockquote', 'headerSelect', 'header1', 'header2', 'header3', 'header4', 'header5',
- // 'todo', 'redo', 'undo', 'fullScreen', 'enter', 'bulletedList', 'numberedList', 'insertTable', 'deleteTable',
- // 'insertTableRow', 'deleteTableRow', 'insertTableCol', 'deleteTableCol', 'tableHeader', 'tableFullWidth',
- // 'insertVideo', 'uploadVideo', 'editVideoSize', 'uploadImage', 'codeSelectLang']
- }
详情参考官网:工具栏配置 | wangEditor
编辑器配置:
- type InsertFnType = (url: string) => void
- const editorConfig: Partial<IEditorConfig> = {
- MENU_CONF: {
- // 行高
- lineHeight: {
- lineHeightList: ['0.5', '1', '1.5', '2', '2.5', '3', '3.5', '4']
- },
- // 字体
- // fontFamily: {
- // fontFamilyList: ['黑体',
- // '楷体']
- // },
- uploadImage: {
- async customUpload(file: any, insertFn: InsertFnType) {
- let date = new Date().getTime();
- let filepath = 'nft/' + date + '/' + file.name;
- // file 即选中的文件
- client.value.put(filepath, file)
- .then(function (res: any) {
- // 上传图片,返回结果,将图片插入到编辑器中
- insertFn(res.url)
- }).catch(function (err: any) {
- console.log(err)
- })
- },
- }
- },
- placeholder: '请输入内容...',
- }
上传图片配置:
我这里是上传到阿里云的,参考:上传至阿里云OSS · wangEditor 用户文档
也可以上传给后端,参考配置:菜单配置 | wangEditor
销毁组件:
- // 组件销毁时,也及时销毁编辑器
- onBeforeUnmount(() => {
- const editor = editorRef.value
- if (editor == null) return
- editor.destroy()
- })
记录实例:
- const handleCreated = (editor: IDomEditor) => {
- if (editor == null) return
- editorRef.value = editor // 记录 editor 实例,重要!
- // console.log('editor', editor)
- }
动态获取内容:
- const handleChange = (editor: IDomEditor) => {
- console.log('valueHtmlCount', valueHtmlCount.value)
- }