最近做项目需要用富文本编译器,上次使用的tinymce把我坑了一通,这次换了个更坑爹的Wangeditor。我要说的内容就是自己踩到的坑和解决方法。

首先要安装插件:npm install wangeditor

官方文档https://www.kancloud.cn/wangfupeng/wangeditor3/335774,写的很简单,不过要仔细阅读。

按照官方文档的指示(里面还有vuejs的demo(伪)真好),进行配置,大概就是这样

<template>
    <div>
        <div ref="editor" style="text-align:left"></div>
        <button v-on:click="getContent">查看内容</button>
    </div>
</template>

<script>
    import E from 'wangeditor'

    export default {
      name: 'editor',
      data () {
        return {
          editorContent: ''
        }
      },
      methods: {
        getContent: function () {
            alert(this.editorContent)
        }
      },
      mounted() {
        var editor = new E(this.$refs.editor)
        editor.customConfig.onchange = (html) => {
          this.editorContent = html
        }
        editor.create()
      }
    }
</script>

<style scoped>
</style>

制作了一个富文本编辑器的组件,但是没有本地上传,放到项目上也没法获取到里面的内容,中看不中用。那么只好自己动手丰衣足食了,开始进行修改。

先解决本地上传图片问题,这个简单,文档是有写的很清楚。

      // 配置服务器端地址
      editor.customConfig.uploadImgServer = "/upload.php";
      //自定义一个参数名
      editor.customConfig.uploadFileName = "filename";
      // 将图片大小限制为 3M
      editor.customConfig.uploadImgMaxSize = 3 * 1024 * 1024;

加入这三句话以后问题迎刃而解。

第二问题父组件获取不到内容,那就做一个子组件和父组件相互传值的功能。

//父组件中:
//引入子组件
import WangEditor from "@/components/common/WangEditor";
//注册组件
comonents:{
    WangEditor
}
//使用组件
<WangEditor :catchData="catchData"></WangEditor>
//接收参数
 methods: {
    catchData(value){
      this.content=value      //在这里接受子组件传过来的参数,赋值给data里的参数
    },
}

问题出在子组件上,怎么把内容传到父组件中。这个也不难的。

//子组件中:
 editor.customConfig.onchange = html => {
        //把获取的内容传给父组件
        this.$emit('catchData',html);
 };

这样一个编辑功能就完成了,但是还没有完,编辑错了肯定要修改的,怎么办?

接下来是重点(敲黑板,duang,duang,duang)

首先要把父组件的值传给子组件

//父组件
<WangEditor :catchData="catchData" v-bind:content="content"></WangEditor>
//子组件
 props: {
    content:{required:true}
  },
//文档上说了一个初始化内容的方法
editor.txt.html("内容");

//合理修改
editor.create();
//放在上面那句话之后这个要注意。
editor.txt.html(this.content);

但是把这句话写进去后什么都没发生。假文档??但是刷新后出现了 。。。我???

经研究发现,先加载的编辑器后加载的数据结果导致数据没写进去。坑爹的异步加载。。这个异步加载把我折腾的很惨,到网上找文档,没有一个靠谱的,闹得我想骂娘。苦水吐到这里,开始解决问题。

解决方法就是通过watch监听来完成的。上代码。把一开始的 进行修改后的终极代码

<template>
  <div>
    <div ref="editor" style="text-align:left"></div>
  </div>
</template>

<script>
import E from "wangeditor";

export default {
  name: "editor",
  data() {
    return {
      editor:""
    };
  },
  props: {
    content: { required: true }
  },
  mounted(){
    this.editor = new E(this.$refs.editor);
    
    this.editor.customConfig.onchange = html => {

      this.$emit('catchData',html);

    };
    // 配置服务器端地址
    this.editor.customConfig.uploadImgServer = "/Upload.php";
    //自定义一个图片参数名
    this.editor.customConfig.uploadFileName = "filename";
    // 将图片大小限制为 3M
    this.editor.customConfig.uploadImgMaxSize = 3 * 1024 * 1024;

    this.editor.create();
  },
  watch: {
     content: function(val) {
      this.editor.txt.html(val);
    }
  }
};
</script>

<style scoped>
</style>

这样就ok了。原理很简单就是把变量声明成全局变量,然后监听加载

最后一个问题,这个编译器放在手机端上看的时候会炸窝,解决方法有两种。

第一种,在全局样式中添加

.w-e-toolbar {
  flex-wrap: wrap;
}

第二种修改js源文件 wangEditor.js中的4661行,加上 flex-wrap: wrap;就好了。

以上就是我踩得的坑以及解决方法。谢谢大家支持。

Logo

前往低代码交流专区

更多推荐