| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | <template> | 
 |  |  |   <div :style="styleEditor"> | 
 |  |  |     <Toolbar style="border-bottom: 1px solid #ccc" :editor="editor" :defaultConfig="toolbarConfig" :mode="mode" /> | 
 |  |  |     <Editor style="min-height: 80px; overflow-y: hidden;" 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: '', | 
 |  |  |     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: 10 * 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 + '/web/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 | 
 |  |  |       console.log("onChange123", value); // onChange æ¶è·åç¼è¾å¨ææ°å
容 | 
 |  |  |       this.$nextTick(()=>{ | 
 |  |  |         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) { | 
 |  |  |       var that =this | 
 |  |  |       this.editor = Object.seal(editor) // ä¸å®è¦ç¨ Object.seal() ï¼å¦å伿¥é | 
 |  |  |       setTimeout(function (){ | 
 |  |  |         that.html = that.richData | 
 |  |  |         // alert(that.html) | 
 |  |  |       },15000) | 
 |  |  |     }, | 
 |  |  |     // ç¼è¾å¨å
容ãéåºååæ¶çåè°å½æ° | 
 |  |  |     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> | 
 |  |  | ::v-deep .w-e-text-container { | 
 |  |  |   height: 420px !important; | 
 |  |  | } | 
 |  |  | .w-e-text-container .w-e-scroll { | 
 |  |  |   height: 500px !important; | 
 |  |  |   -webkit-overflow-scrolling: touch; | 
 |  |  | } | 
 |  |  | </style> | 
 |  |  |  |