Vue项目中使用百度编辑器和wangEditor编辑器

一、wangEditor编辑器

1、先安装插件

使用npm下载:npm install wangeditor

2、编写成组件(这个编辑器只支持组件调用)

<template>
  <div id="wangeditor">
    <!-- {{editorDatas}} -->
    <div ref="editorElem" style="text-align:left;"></div>
  </div>
</template>
<script>
  import axios from 'axios';
  import E from "wangeditor";
  export default {
    name: "Editor",
    data() {
      return {
        editor: null,
        editorContent: '',
      };
    },
    // catchData是一个类似回调函数,来自父组件,当然也可以自己写一个函数,主要是用来获取富文本编辑器中的html内容用来传递给服务端
    props: ['catchData', 'editorDatas'], // 接收父组件的方法
    watch: {
      // 监视和编辑时候获取传过来的值
      editorDatas(newVal, oldVal) {
        if (newVal) {
          this.editor.txt.html(newVal);
        }
      }
    },
    mounted() {
      this.editor = new E(this.$refs.editorElem);
      // 编辑器的事件,每次改变会获取其html内容
      this.editor.customConfig.onchange = html => {
        this.editorContent = html;
        this.catchData(this.editorContent); // 把这个html通过catchData的方法传入父组件
      };

      // 本地图片上传:关闭外部图片引入
      // this.editor.customConfig.showLinkImg = false;
      /* 自定义图片上传(支持跨域和非跨域上传,简单操作)*/
      this.editor.customConfig.customUploadImg = async (files, insert) => {
        let config1 = {
          headers: {
            'Content-Type': 'multipart/form-data;',
            'clientType': 'pc',
            'TY_SESSION': localStorage.getItem('token'),
          }
        };
        let formData = new FormData()
        formData.append('file', files[0])
        let data = ''
        data = await this.$axios.post('/HK_UploadAPI/file/commonUpload', formData, config1)
        if (data.data.code == 200) {
          insert(data.data.data)
        } else {
          this.$message({
            message: '图片上传失败,请重新上传',
            type: 'error',
            center: true
          });
        }
      }
      this.editor.customConfig.menus = [
        // 菜单配置
        'head', // 标题
        'bold', // 粗体
        'fontSize', // 字号
        'fontName', // 字体
        'italic', // 斜体
        'underline', // 下划线
        'strikeThrough', // 删除线
        'foreColor', // 文字颜色
        'backColor', // 背景颜色
        'list', // 列表
        'justify', // 对齐方式
        'quote', // 引用
        'image', // 插入图片
        'table', // 表格
        'code', // 插入代码
        'undo', // 撤销
        'redo' // 重复
      ];
      this.editor.create(); // 创建富文本实例
      // console.log(this.editorDatas);
      this.editor.txt.html(this.editorDatas);  // 接收编辑传过来的值
    }
  }
</script>
<style scoped lang="stylus">
  .w-e-toolbar {
    flex-wrap: wrap;
  }

  #wangeditor {
    background: #fff;
    color: #000;
  }
</style>

3、导入组件和使用

<template>
    <div>
        <EDITOR :catchData="editorChange" :editorDatas="modelDataObj.noticeContext"></EDITOR>
    </div>
</template>


<script>
import axios from 'axios';
import EDITOR from "@/components/wangeditor.vue";
export default {
  components: {
    EDITOR,
  },
  data() {
    return {
      modelDataObj: {},

    }
  },
  methods: {
    editorChange(html) { // 父组件接收子组件的html值
      this.modelDataObj.noticeContext = html
    },
  },
}
</script>

  

二、百度编辑器

1、安装插件

使用npm下载:npm install wangeditor

2、下载UEditor.zip安装包解压放入项目public文件夹下

3、使用

****** html模块 ******

<div class="el-menu-vertical-div">
    // 由于百度图片上传需要改动底层代码,所以使用了el-upload上传组件
                        <el-upload v-show="false" class="avatar-uploader" id="avatar-uploader_1" action="" :before-upload="beforeUpload"></el-upload>
                        <VueUeditorWrap v-model="modelDataObj.noticeContext" id="container" :config="myConfig" @ready="ready"
                            @beforeInit="addCustomButtom"></VueUeditorWrap>
                    </div>


****** JS模块 ******

import VueUeditorWrap from 'vue-ueditor-wrap';

myConfig: {
          UEDITOR_HOME_URL: '/UEditor/',
          autoHeightEnabled: false,
          initialFrameWidth: '100%'
},


// ************百度编辑器
            ready(editorInstance) {
        // console.log(`编辑器实例${editorInstance.key}: `, editorInstance);
        editorInstance.addListener('contentChange', () => {
          // this.content = instance.getContent();
        });
      },
      //插入图片
      insertImage() {
        let imageList = this.imageList;
        let imageHtml = '';
        (imageList || []).map(item => {
          imageHtml = imageHtml + '<p><img src="' + item + '"/></p>';
        });
        if (imageHtml != '') {
          this.editorHandler.execCommand('inserthtml', imageHtml);
        }
      },
      //上传图片前的函数
      beforeUpload(file) {
        this.imageList = [];
        const isLt5M = file.size / 1024 / 1024 < 5;
        if (!isLt5M) {
          this.$message.error('上传图片大小不能超过 5MB!');
          return;
        }
        //校验成功上传文件
        //将文件转化为formdata数据上传
        let formData1 = new FormData();
        // formData.append('file', file);   //这里设置的是 image格式  一般用file格式就行
        formData1.append('file', file);
        // console.log(formData.has('image')); //true
        let config1 = {
          headers: {
            'Content-Type': 'multipart/form-data;',
            'clientType': 'pc',
            'TY_SESSION': localStorage.getItem('token'),
          }
        };
        this.isShow = true;
        const instan1 = axios.create({
          withCredentials: true
        });
        //post上传图片
        instan1.post('/HK_UploadAPI/file/commonUpload',
          formData1,
          config1
        ).then(res => {
          if (res.data.code === 200) {
            let jsonimage = res.data;
            if (!jsonimage || !jsonimage.data) {
              this.$message.error(res.msg);
              return;
            }
            this.isShow = false;
            // 如果上传成功
            this.imageList.push(jsonimage.data);
            this.$message.success('图片上传成功');
            this.insertImage();
          } else {
            this.$message.error('图片上传失败');
            this.isShow = false;
          }
        });
        return isLt5M;
      },
      //自定义 添加图片按钮控件
      addCustomButtom(editorId) {
        let _this = this;
        //自定义图片
        window.UE.registerUI(
          'picture-button',
          function (editor, uiName) {
            editor.registerCommand(uiName, {
              execCommand: () => {
                //点击上传
                document.querySelector('#avatar-uploader_1 input').click();
                _this.editorHandler = editor;
              }
            });
            // 创建一个 button
            var btn = new window.UE.ui.Button({
              // 按钮的名字
              name: uiName,
              // 提示
              // title: '鼠标悬停时的提示文字',
              title: '上传图片',
              // 需要添加的额外样式,可指定 icon 图标,图标路径参考常见问题 2
              cssRules: 'background-position: -380px 0;',
              // 点击时执行的命令
              onclick: function () {
                // 这里可以不用执行命令,做你自己的操作也可
                editor.execCommand(uiName);
              }
            });
            // 当点到编辑内容上时,按钮要做的状态反射
            editor.addListener('selectionchange', function () {
              var state = editor.queryCommandState(uiName);
              if (state === -1) {
                btn.setDisabled(true);
                btn.setChecked(false);
              } else {
                btn.setDisabled(false);
                btn.setChecked(state);
              }
            });
            // 因为你是添加 button,所以需要返回这个 button
            return btn;
          },
          55 /* 指定添加到工具栏上的哪个位置,默认时追加到最后 */,
          editorId /* 指定这个 UI 是哪个编辑器实例上的,默认是页面上所有的编辑器都会添加这个按钮 */
        );
            },

 

三、资源下载

Vue项目中使用百度编辑器.zip  

Vue项目中使用wangeditor.zip  

 

myConfig: {
          UEDITOR_HOME_URL: '/UEditor/',
          autoHeightEnabled: false,
          initialFrameWidth: '100%'
        },
posted @ 2020-08-28 11:21  蜗牛snail  阅读(556)  评论(0编辑  收藏  举报
蜗牛前端 蜗牛文学