vue2.0中安装使用TinyMce富文本编辑器

1,874 阅读1分钟

1、vue2.0的只能使用tinymce-vue3版本的,使用高版本的tinymce-vue会报错。

npm install @tinymce/tinymce-vue@3.0.1 -s

2、把node_modules\tinymce里面的文件 包括tinymce文件夹 全部复制到static文件夹下面

3、新建一个TinyMce.vue文件,复制以下代码进去

<template>
  <div>
    <editor  
    api-key="y0wryxiphozxaj3spgx6ivap7k2t3zyvaqwgrxrgcobdacsh"
      v-model="content"
      :initial-value="value"
      @onChange="changeValue" 
     :init="{ 
       element_format: 'html', 
       height: 400,  
      menubar: false, 
       language: 'zh_CN',  
      forced_root_block: 'div',
        media_url_resolver: mediaUrlResolver, 
       images_upload_handler: uploadImg, 
       file_picker_callback: uploadFile,  
      media_live_embeds: true,   
     file_picker_types: 'media',  
      fontsize_formats: '8px 10px 12px 14px 18px 24px 36px',  
      font_formats: '微软雅黑;宋体;黑体;仿宋;楷体;隶书;幼圆', 
       plugins: [  
        ' advlist autolink lists link image charmap print preview anchor', 
         'searchreplace visualblocks code fullscreen',  
        'insertdatetime media table paste code help wordcount', 
       ],  
      toolbar:  
        ' fontsizeselect fontselect | media link autolink image | table |undo redo  | formatselect | bold italic forecolor backcolor | \ alignleft aligncenter alignright alignjustify | \    bullist numlist outdent indent   | help',    
  }"    />  </div></template><script>import Editor from "@tinymce/tinymce-vue";export default {  name: "TinyMce",  props: {    value: {      type: String,      value: ""    }  },  model: {    prop: "value",    event: "change"  }, 
 components: {  
  editor: Editor 
 },  data () 
{    
return {   
   content: "", 
     URL: ''   
 }; 
 }, 
 mounted () {  
  let self = this  
  //tinymce.init() 
 }, 
 created () {  
  this.URL = sessionStorage.getItem("CloudnewUrl");
  }, 
 methods: {    
changeValue (evt) {  
    const value = evt.level.content; 
     this.$emit("change", value.replace(/(<p><br><\/p>){1,}$/g, "")); 
   },    
// uploadImg(...args) {  
  //   console.log(args);    
// 
},   
 upload (blob, success, failure) {     
let xhr, formData;   
   xhr = new XMLHttpRequest(); 
     xhr.withCredentials = false; 
     xhr.open("POST", this.URL + "/cloud/message/images/upload");
    
 xhr.onload = function () {   
     let json;   
    if (xhr.status != 200) {   
       failure && failure("HTTP Error: " + xhr.status);   
       return;    
    }        
json = JSON.parse(xhr.responseText);    
    if (!json || typeof json.data.imgPath != "string") {   
       failure && failure("Invalid JSON: " + xhr.responseText);  
        return;   
     }     
   success(json.data.imgPath);  
    };    
  formData = new FormData();   
   formData.append("images", blob, blob.name);   
   xhr.send(formData);  
  },    
uploadImg: function (blobInfo, success, failure) {
      this.upload(blobInfo.blob(), success, failure);  
  },   
 uploadFile (cb, value, meta) {    
  // let filetype = '.pdf, .txt, .zip, .rar, .7z, .doc, .docx, .xls, .xlsx, .ppt, .pptx, .mp3, .mp4';      // const map = {      //   image: '.jpg, .jpeg, .png, .gif',      //   media: '.mp3, .mp4',      // }    
  // if (map[meta.filetype]) {    
  //   filetype = map[meta.filetype]      // }    
  if (meta.filetype !== "media") {     
   console.log("非媒体资源,");    
    return;    
  }    
  const filetype = "video/*";   
   const input = document.createElement("input");   
   input.setAttribute("type", "file");    
  input.setAttribute("accept", filetype);  
   input.click();    
  input.onchange = () => {  
      const file = input.files[0];   
     this.uploadMedia(file, cb);   
   };  
  },   
 uploadMedia (blob, success, failure) {    
  let self = this;  
    let xhr, formData;   
   xhr = new XMLHttpRequest();  
   xhr.withCredentials = false;  
    xhr.open("POST", this.URL + "/cloud/message/images/upload");   
   xhr.onload = function () {   
     let json;     
   if (xhr.status != 200) {    
      failure && failure("HTTP Error: " + xhr.status);   
       return;    
    }        
json = JSON.parse(xhr.responseText);   
     if (!json || typeof json.data.imgPath != "string") {   
       failure && failure("Invalid JSON: " + xhr.responseText);        
  return;      
  }    
    let localObjUrl = json.data.imgPath;  
      // self.content = (  
      //    `<p>  
      //       
 <span class="mce-preview-object mce-object-video" contenteditable="false" data-mce-object="video" data-mce-p-allowfullscreen="allowfullscreen" data-mce-p-frameborder="no" data-mce-p-scrolling="no" data-mce-p-src=${localObjUrl} data-mce-html="%20">        //          <video src=${localObjUrl} width="100%" controls="controls"><source src=${localObjUrl} /></video><span class="mce-shim"></span>        //        </span>        //     </p>`        //   )        success(json.data.imgPath);       
 //success('https://fscdn.zto.com/fs8/M05/5C/23/wKhBEF7ZFzuANmj_AGE8d6WihfE721.mp4');  
   };   
   formData = new FormData();    
  formData.append("images", blob, blob.name);     
 xhr.send(formData);    },    mediaUrlResolver (data, resolve) {     
 try {        let videoUri = encodeURI(data.url);       
 let embedHtml = `<p>                 
 <span                    class="mce-object mce-object-video"                    data-mce-selected="1"                    data-mce-object="video"                    data-mce-p-width="100%"                    data-mce-p-height="auto"                    data-mce-p-controls="controls"                    data-mce-p-controlslist="nodownload"                    data-mce-p-allowfullscreen="true"                    data-mce-p-src=${videoUri} >                    <video src=${data.url} width="100%" height="auto" controls="controls" controlslist="nodownload">         
           </video>                  </span>    
            </p>                <p style="text-align: left;"></p>`;      
  resolve({ html: embedHtml });    
  } catch (e) {        resolve({ html: "" });      }    }  }};</script>