| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | <template> | 
 |  |  |   <div :style="styleEditor"> | 
 |  |  |     <Toolbar style="border-bottom: 1px solid #ccc" :editor="editor" :defaultConfig="toolbarConfig" :mode="mode" /> | 
 |  |  |     <Editor :style="style" class="declass"  v-model="html" :defaultConfig="editorConfig" :mode="mode" | 
 |  |  |             @onCreated="onCreated" @onChange="onChange" /> | 
 |  |  |   </div> | 
 |  |  | </template> | 
 |  |  | <style src="@wangeditor/editor/dist/css/style.css"></style> | 
 |  |  | <script> | 
 |  |  | import Vue from 'vue' | 
 |  |  | import { Editor, Toolbar } from '@wangeditor/editor-for-vue' | 
 |  |  | import { Loading } from 'element-ui' | 
 |  |  | let loadingInstance = null | 
 |  |  | export default Vue.extend({ | 
 |  |  |   props: { | 
 |  |  |     richData: { // ç¶ç»ä»¶ä¼ éçæ°æ® | 
 |  |  |       type: String, | 
 |  |  |       default: '' | 
 |  |  |     }, | 
 |  |  |     styleEditor: '', | 
 |  |  |     style:'', | 
 |  |  |     readonly: false // æ¯å¦å¯ä»¥è¾å
¥ | 
 |  |  |   }, | 
 |  |  |   name: 'RichEditor', | 
 |  |  |   components: { Editor, Toolbar }, | 
 |  |  |   data () { | 
 |  |  |     return { | 
 |  |  |       editor: null, | 
 |  |  |       html: '', | 
 |  |  |       toolbarConfig: { // å·¥å
·æ é
ç½® | 
 |  |  |         toolbarKeys: this.readonly ? ['fullScreen'] : [ // æ¾ç¤ºæå®çèå项 | 
 |  |  |           'bold', // ç²ä½ | 
 |  |  |           'underline', // ä¸å线 | 
 |  |  |           'italic', // æä½ | 
 |  |  |           'through', // å é¤çº¿ | 
 |  |  |           'code', // è¡å
ä»£ç  | 
 |  |  |           'sub', // ä¸æ  | 
 |  |  |           'sup', // ä¸æ  | 
 |  |  |           'clearStyle', // æ¸
餿 ¼å¼ | 
 |  |  |           'color', // åä½é¢è² | 
 |  |  |           'bgColor', // èæ¯è² | 
 |  |  |           'fontSize', // åå· | 
 |  |  |           'fontFamily', // åä½ | 
 |  |  |           'indent', // å¢å ç¼©è¿ | 
 |  |  |           'delIndent', // åå°ç¼©è¿ | 
 |  |  |           'justifyLeft', // å·¦å¯¹é½ | 
 |  |  |           'justifyRight', // å³å¯¹é½ | 
 |  |  |           'justifyCenter', // å±
ä¸å¯¹é½ | 
 |  |  |           'justifyJustify', // ä¸¤ç«¯å¯¹é½ | 
 |  |  |           'lineHeight', // è¡é« | 
 |  |  |           // "viewImageLink", // æ¥ç龿¥ | 
 |  |  |           'divider', // åå²çº¿ | 
 |  |  |           'emotion', // è¡¨æ
 | 
 |  |  |           'insertLink', // æå
¥é¾æ¥ | 
 |  |  |           // "editLink", // ä¿®æ¹é¾æ¥ | 
 |  |  |           // "unLink", // åæ¶é¾æ¥ | 
 |  |  |           // "viewLink", // æ¥ç龿¥ | 
 |  |  |           'codeBlock', // ä»£ç å | 
 |  |  |           'blockquote', // å¼ç¨ | 
 |  |  |           'headerSelect', // æ é¢ | 
 |  |  |           // "header1", // æ é¢1 | 
 |  |  |           // "header2", // æ é¢2 | 
 |  |  |           // "header3", // æ é¢3 | 
 |  |  |           // "header4", // æ é¢4 | 
 |  |  |           // "header5", // æ é¢5 | 
 |  |  |           // "todo", // å¾
å | 
 |  |  |           'redo', // éå | 
 |  |  |           'undo', // æ¤é | 
 |  |  |           // "enter", // å车 | 
 |  |  |           // "bulletedList", // æ åºå表 | 
 |  |  |           // "numberedList", // æåºå表 | 
 |  |  |           // "codeSelectLang" // éæ©è¯è¨ | 
 |  |  |           // è¡¨æ ¼åè½åç» | 
 |  |  |           /* { | 
 |  |  |              key: 'table-style', // å¿
å¡«ï¼è¦ä»¥ group å¼å¤´ | 
 |  |  |              title: '表格', // å¿
å¡« | 
 |  |  |              // iconSvg: '<svg>....</svg>', // å¯é | 
 |  |  |              menuKeys: [ | 
 |  |  |                "insertTable", // æå
¥è¡¨æ ¼ | 
 |  |  |                "deleteTable", // å é¤è¡¨æ ¼ | 
 |  |  |                "insertTableRow", // æå
¥è¡ | 
 |  |  |                "deleteTableRow", // å é¤è¡ | 
 |  |  |                "insertTableCol", // æå
¥å | 
 |  |  |                "deleteTableCol", // å é¤å | 
 |  |  |                "tableHeader", // è¡¨å¤´ | 
 |  |  |                "tableFullWidth", // å®½åº¦èªéåº | 
 |  |  |              ] // ä¸çº§èå key ï¼å¿
å¡« | 
 |  |  |            }, */ | 
 |  |  |           // ä¸ä¼ å¾çåç» | 
 |  |  |           { | 
 |  |  |             key: 'img-style', // å¿
å¡«ï¼è¦ä»¥ group å¼å¤´ | 
 |  |  |             title: 'å¾ç', // å¿
å¡« | 
 |  |  |             // iconSvg: '<svg>....</svg>', // å¯é | 
 |  |  |             menuKeys: [ | 
 |  |  |               'uploadImage', // ä¸ä¼ å¾ç | 
 |  |  |               'insertImage', // ç½ç»å¾ç | 
 |  |  |               'deleteImage', // å é¤å¾ç | 
 |  |  |               'editImage', // ç¼è¾å¾ç | 
 |  |  |               'imageWidth30', // å¾ç宽度ç¸å¯¹äºç¼è¾å¨å®½åº¦çç¾åæ¯30 | 
 |  |  |               'imageWidth50', // å¾ç宽度ç¸å¯¹äºç¼è¾å¨å®½åº¦çç¾åæ¯50 | 
 |  |  |               'imageWidth100' // å¾ç宽度ç¸å¯¹äºç¼è¾å¨å®½åº¦çç¾åæ¯100 | 
 |  |  |             ] // ä¸çº§èå key ï¼å¿
å¡« | 
 |  |  |           }, | 
 |  |  |           // è§é¢åç» | 
 |  |  |           { | 
 |  |  |             key: 'video-style', // å¿
å¡«ï¼è¦ä»¥ group å¼å¤´ | 
 |  |  |             title: 'è§é¢', // å¿
å¡« | 
 |  |  |             // iconSvg: '<svg>....</svg>', // å¯é | 
 |  |  |             menuKeys: [ | 
 |  |  |               'insertVideo', // æå
¥ç½ç»è§é¢ | 
 |  |  |               'uploadVideo', // ä¸ä¼ è§é¢ | 
 |  |  |               'editVideoSize' // ä¿®æ¹è§é¢å°ºå¯¸ | 
 |  |  |             ] // ä¸çº§èå key ï¼å¿
å¡« | 
 |  |  |           }, | 
 |  |  |           'fullScreen' // å
¨å± | 
 |  |  |         ], | 
 |  |  |         excludeKeys: [ // éèæå®çèå项 | 
 |  |  |           // 'headerSelect', | 
 |  |  |           // 'video-style' | 
 |  |  |           // æé¤èåç»ï¼åèåç» key çå¼å³å¯ | 
 |  |  |         ] | 
 |  |  |  | 
 |  |  |       }, | 
 |  |  |       editorConfig: { // ç¼è¾å¨é
ç½® | 
 |  |  |         placeholder: '请è¾å
¥å
容...', | 
 |  |  |         readOnly: this.readonly, // æ¯å¦åªè¯»ï¼é»è®¤false | 
 |  |  |         autoFocus: false, // æ¯å¦èªå¨focusï¼é»è®¤ä¸ºtrue | 
 |  |  |         scroll: true, // é
ç½®ç¼è¾å¨æ¯å¦æ¯ææ»å¨ï¼é»è®¤ä¸º true ã注æï¼æ¤æ¶ä¸è¦åºå® editor-container çé«åº¦ï¼è®¾ç½®ä¸ä¸ª min-height å³å¯ã | 
 |  |  |         maxLength: 20000, // æå¤§éå¶ï¼é¿å
å
容è¿å¤å¡é¡¿ | 
 |  |  |         MENU_CONF: { | 
 |  |  |           // å¾çä¸ä¼  | 
 |  |  |           uploadImage: { | 
 |  |  |             server: process.env.VUE_APP_API_PREFIX + '/web/public/uploadLocal?folder=', | 
 |  |  |             fieldName: 'file', | 
 |  |  |             // å个æä»¶çæå¤§ä½ç§¯éå¶ï¼é»è®¤ä¸º 2M | 
 |  |  |             maxFileSize: 20 * 1024 * 1024, // 10M | 
 |  |  |             // æå¤å¯ä¸ä¼ å ä¸ªæä»¶ï¼é»è®¤ä¸º 100 | 
 |  |  |             maxNumberOfFiles: 10, | 
 |  |  |             // éæ©æä»¶æ¶çç±»åéå¶ï¼é»è®¤ä¸º ['image/*'] ãå¦ä¸æ³éå¶ï¼å设置为 [] | 
 |  |  |             allowedFileTypes: ['image/*'], | 
 |  |  |             // èªå®ä¹ä¸ä¼ åæ°ï¼ä¾å¦ä¼ ééªè¯ç token çãåæ°ä¼è¢«æ·»å å° formData ä¸ï¼ä¸èµ·ä¸ä¼ å°æå¡ç«¯ã | 
 |  |  |             meta: { | 
 |  |  |             }, | 
 |  |  |             // å° meta æ¼æ¥å° url åæ°ä¸ï¼é»è®¤ false | 
 |  |  |             metaWithUrl: false, | 
 |  |  |             // èªå®ä¹å¢å  http  header | 
 |  |  |             // headers: { Authorization: "Bearer " + getToken() }, | 
 |  |  |             // è·¨åæ¯å¦ä¼ é cookie ï¼é»è®¤ä¸º false | 
 |  |  |             withCredentials: true, | 
 |  |  |             // è¶
æ¶æ¶é´ï¼é»è®¤ä¸º 10 ç§ | 
 |  |  |             timeout: 10 * 1000, // 10 ç§ | 
 |  |  |             // ä¸ä¼ å | 
 |  |  |             onBeforeUpload (files) { | 
 |  |  |               loadingInstance = Loading.service({ | 
 |  |  |                 lock: true, | 
 |  |  |                 text: 'ä¸ä¼ ä¸...', | 
 |  |  |                 spinner: 'el-icon-loading', | 
 |  |  |                 background: 'rgba(0, 0, 0, 0.7)' | 
 |  |  |               }) | 
 |  |  |               return files | 
 |  |  |             }, | 
 |  |  |             // èªå®ä¹æå
¥å¾ç | 
 |  |  |             customInsert (res, insertFn) { | 
 |  |  |               console.log(res) | 
 |  |  |               // å ä¸ºèªå®ä¹æå
¥å¯¼è´onSuccessä¸onFailedåè°å½æ°ä¸èµ·ä½ç¨,èªå·±æå¨å¤ç | 
 |  |  |               // å
å
³éçå¾
çMessage | 
 |  |  |               loadingInstance = Loading.service({ | 
 |  |  |                 lock: true, | 
 |  |  |                 text: 'ä¸ä¼ ä¸...', | 
 |  |  |                 spinner: 'el-icon-loading', | 
 |  |  |                 background: 'rgba(0, 0, 0, 0.7)' | 
 |  |  |               }).close() | 
 |  |  |               if (res.code === 200) { | 
 |  |  |                 // Message.success({ | 
 |  |  |                 //     message: `${res.data.originalName} ä¸ä¼ æå` | 
 |  |  |                 // }); | 
 |  |  |               } else { | 
 |  |  |                 // Message.error({ | 
 |  |  |                 //     message: `${res.data.originalName} ä¸ä¼ å¤±è´¥ï¼è¯·éæ°å°è¯` | 
 |  |  |                 // }); | 
 |  |  |               } | 
 |  |  |               insertFn(res.data.url, res.data.originname, res.data.imgname) | 
 |  |  |             }, | 
 |  |  |  | 
 |  |  |             // å个æä»¶ä¸ä¼ æåä¹å | 
 |  |  |             onSuccess (file, res) { | 
 |  |  |               console.log(`${file.originalFilename} ä¸ä¼ æå`, res) | 
 |  |  |             }, | 
 |  |  |             // å个æä»¶ä¸ä¼ å¤±è´¥ | 
 |  |  |             onFailed (file, res) { | 
 |  |  |               console.log(`${file.originalFilename} ä¸ä¼ å¤±è´¥`, res) | 
 |  |  |               loadingInstance.close() | 
 |  |  |             }, | 
 |  |  |             // ä¸ä¼ è¿åº¦çåè°å½æ° | 
 |  |  |             onProgress (progress) { | 
 |  |  |               console.log('progress', progress) | 
 |  |  |               // progress æ¯ 0-100 çæ°å | 
 |  |  |             }, | 
 |  |  |             // ä¸ä¼ éè¯¯ï¼æè
触å timeout è¶
æ¶ | 
 |  |  |             onError (file, err, res) { | 
 |  |  |               loadingInstance.close() | 
 |  |  |               console.log(`${file.originalFilename} ä¸ä¼ åºé`, err, res) | 
 |  |  |             } | 
 |  |  |           }, | 
 |  |  |           // è§é¢ä¸ä¼  | 
 |  |  |           uploadVideo: { | 
 |  |  |             fieldName: 'file', | 
 |  |  |             server: process.env.VUE_APP_API_PREFIX + '/public/upload?folder=richeditor', | 
 |  |  |             // å个æä»¶çæå¤§ä½ç§¯éå¶ï¼é»è®¤ä¸º 10M | 
 |  |  |             maxFileSize: 50 * 1024 * 1024, // 50M | 
 |  |  |             // æå¤å¯ä¸ä¼ å ä¸ªæä»¶ï¼é»è®¤ä¸º 5 | 
 |  |  |             maxNumberOfFiles: 3, | 
 |  |  |             // éæ©æä»¶æ¶çç±»åéå¶ï¼é»è®¤ä¸º ['video/*'] ãå¦ä¸æ³éå¶ï¼å设置为 [] | 
 |  |  |             allowedFileTypes: ['video/*'], | 
 |  |  |             // èªå®ä¹ä¸ä¼ åæ°ï¼ä¾å¦ä¼ ééªè¯ç token çãåæ°ä¼è¢«æ·»å å° formData ä¸ï¼ä¸èµ·ä¸ä¼ å°æå¡ç«¯ã | 
 |  |  |             meta: { | 
 |  |  |               // token: 'xxx', | 
 |  |  |               // otherKey: 'yyy' | 
 |  |  |             }, | 
 |  |  |             // å° meta æ¼æ¥å° url åæ°ä¸ï¼é»è®¤ false | 
 |  |  |             metaWithUrl: false, | 
 |  |  |  | 
 |  |  |             // èªå®ä¹å¢å  http  header | 
 |  |  |             headers: { | 
 |  |  |               // Authorization: "Bearer " + getToken() | 
 |  |  |               // otherKey: 'xxx' | 
 |  |  |             }, | 
 |  |  |             // è·¨åæ¯å¦ä¼ é cookie ï¼é»è®¤ä¸º false | 
 |  |  |             withCredentials: true, | 
 |  |  |             // è¶
æ¶æ¶é´ï¼é»è®¤ä¸º 30 ç§ | 
 |  |  |             timeout: 1000 * 1000, // 1000 ç§, | 
 |  |  |             // ä¸ä¼ ä¹å触å | 
 |  |  |             onBeforeUpload (file) { | 
 |  |  |               return file | 
 |  |  |             }, | 
 |  |  |             // èªå®ä¹æå
¥è§é¢ | 
 |  |  |             customInsert (res, insertFn) { | 
 |  |  |               // å ä¸ºèªå®ä¹æå
¥å¯¼è´onSuccessä¸onFailedåè°å½æ°ä¸èµ·ä½ç¨,èªå·±æå¨å¤ç | 
 |  |  |               // å
å
³éçå¾
çMessage | 
 |  |  |               // Message.closeAll(); | 
 |  |  |               if (res.code === 200) { | 
 |  |  |                 // Message.success({ | 
 |  |  |                 //     message: `${res.data.originalName} ä¸ä¼ æå` | 
 |  |  |                 // }); | 
 |  |  |               } else { | 
 |  |  |                 // Message.error({ | 
 |  |  |                 //     message: `${res.data.originalName} ä¸ä¼ å¤±è´¥ï¼è¯·éæ°å°è¯` | 
 |  |  |                 // }); | 
 |  |  |               } | 
 |  |  |               insertFn(res.data.url, res.data.url) | 
 |  |  |             }, | 
 |  |  |             // ä¸ä¼ è¿åº¦çåè°å½æ° | 
 |  |  |             onProgress (progress) { | 
 |  |  |               console.log(progress) | 
 |  |  |               // onProgress(progress) {       // JS è¯æ³ | 
 |  |  |               // progress æ¯ 0-100 çæ°å | 
 |  |  |             }, | 
 |  |  |             // // å个æä»¶ä¸ä¼ æåä¹å | 
 |  |  |             // onSuccess(file, res) { | 
 |  |  |             //   console.log(`${file.name} ä¸ä¼ æå`, res); | 
 |  |  |             //   this.successMsg(file); | 
 |  |  |             // }, | 
 |  |  |             // // å个æä»¶ä¸ä¼ å¤±è´¥ | 
 |  |  |             // onFailed(file, res) { | 
 |  |  |             //   console.log(`${file.name} ä¸ä¼ å¤±è´¥`, res); | 
 |  |  |             //   this.errorMsg(file); | 
 |  |  |             // }, | 
 |  |  |             // ä¸ä¼ éè¯¯ï¼æè
触å timeout è¶
æ¶ | 
 |  |  |             onError (file, err, res) { | 
 |  |  |               console.log(`${file.name} ä¸ä¼ åºé`, err, res) | 
 |  |  |               // Notification.error({ | 
 |  |  |               //     title: 'é误', | 
 |  |  |               //     message: `${file.name} ä¸ä¼ å¤±è´¥ï¼è¯·éæ°å°è¯` | 
 |  |  |               // }); | 
 |  |  |             } | 
 |  |  |           } | 
 |  |  |         } | 
 |  |  |       }, | 
 |  |  |       mode: 'default' // or 'simple' | 
 |  |  |     } | 
 |  |  |   }, | 
 |  |  |   watch: { | 
 |  |  |     richData: function (value) { | 
 |  |  |       this.html = value | 
 |  |  |     }, | 
 |  |  |     readonly: function (value) { | 
 |  |  |       this.readonly = value | 
 |  |  |     }, | 
 |  |  |     styleEditor: function (value) { | 
 |  |  |       this.styleEditor = value | 
 |  |  |     } | 
 |  |  |   }, | 
 |  |  |   mounted () { | 
 |  |  |     // éè¦å¨ç¼è¾å¨åå»ºå®æ¯åå¨èµå¼ | 
 |  |  |     this.$nextTick(() => { | 
 |  |  |       this.html = this.richData | 
 |  |  |     }) | 
 |  |  |   }, | 
 |  |  |   methods: { | 
 |  |  |     // ç¼è¾å¨åå»ºå®æ¯æ¶çåè°å½æ° | 
 |  |  |     onCreated (editor) { | 
 |  |  |       this.editor = Object.seal(editor) // ä¸å®è¦ç¨ Object.seal() ï¼å¦å伿¥é | 
 |  |  |     }, | 
 |  |  |     // ç¼è¾å¨å
容ãéåºååæ¶çåè°å½æ° | 
 |  |  |     onChange (editor) { | 
 |  |  |       this.$emit('getWangedditor', editor.getHtml()) | 
 |  |  |       console.log('onChange', editor.getHtml()) // onChange æ¶è·åç¼è¾å¨ææ°å
容 | 
 |  |  |     } | 
 |  |  |   }, | 
 |  |  |   beforeDestroy () { | 
 |  |  |     // ç¼è¾å¨éæ¯æ¶çåè°å½æ°ãè°ç¨ editor.destroy() å³å¯éæ¯ç¼è¾å¨ | 
 |  |  |     const editor = this.editor | 
 |  |  |     if (editor == null) return | 
 |  |  |     editor.destroy() // ç»ä»¶éæ¯æ¶ï¼åæ¶éæ¯ç¼è¾å¨ | 
 |  |  |   } | 
 |  |  | }) | 
 |  |  | </script> | 
 |  |  | <style lang="scss"> | 
 |  |  | .declass{ | 
 |  |  |   min-height: 80px; overflow-y: hidden; | 
 |  |  | } | 
 |  |  | </style>> |