跳至主要內容

在 vue.js 中使用 wangEditor 富文本编辑器

星火燎原@vxhly大约 2 分钟vuejsNode.jsJavaScript

前言

富文本编辑器在后台管理系统中是一个常见而又简单的需求, 这里介绍到的是在 vue.js 项目中使用 wangEditor 这一款富文本编辑器。

wangEditor

至于这款编辑器并不想做过多的介绍, 自行查阅官方文档

结合 Vue.js 项目

建立 Vue.js 项目

首先该项目是基于 webpack 的一个项目, 如果已经是了请忽略

vue init webpack demo
cd demo
npm i

安装 wangEditor 依赖

npm install wangeditor

编写组件代码

在组件目录下新建 EditorBar.vue , 然后就可以编写代码了

这边使用菜单与编辑器区域分离作为 demo, 这边也列出了在 vue 中常见几种 API 调用方法

<template lang="html">
  <div class="editor">
    <div ref="toolbar" class="toolbar"></div>
    <div ref="editor" class="text"></div>
  </div>
</template>

<script>
  import E from "wangeditor";
  export default {
    name: "Editorbar",
    data() {
      return {
        editor: null,
        info_: null,
      };
    },
    model: {
      prop: "value",
      event: "change",
    },
    props: {
      value: {
        type: String,
        default: "",
      },
      isClear: {
        type: Boolean,
        default: false,
      },
    },
    watch: {
      isClear(val) {
        // 触发清除文本域内容
        if (val) {
          this.editor.txt.clear();
          this.info_ = null;
        }
      },
    },
    mounted() {
      this.seteditor();
      this.editor.txt.html(this.value);
    },
    methods: {
      seteditor() {
        this.editor = new E(this.$refs.toolbar, this.$refs.editor);

        this.editor.customConfig.uploadImgShowBase64 = true; // base 64 存储图片
        this.editor.customConfig.uploadImgServer = ""; // 配置服务器端地址
        this.editor.customConfig.uploadImgHeaders = {}; // 自定义 header
        this.editor.customConfig.uploadFileName = ""; // 后端接受上传文件的参数名
        this.editor.customConfig.uploadImgMaxSize = 2 * 1024 * 1024; // 将图片大小限制为 2M
        this.editor.customConfig.uploadImgMaxLength = 6; // 限制一次最多上传 3 张图片
        this.editor.customConfig.uploadImgTimeout = 3 * 60 * 1000; // 设置超时时间

        // 配置菜单
        this.editor.customConfig.menus = [
          "head", // 标题
          "bold", // 粗体
          "fontSize", // 字号
          "fontName", // 字体
          "italic", // 斜体
          "underline", // 下划线
          "strikeThrough", // 删除线
          "foreColor", // 文字颜色
          "backColor", // 背景颜色
          "link", // 插入链接
          "list", // 列表
          "justify", // 对齐方式
          "quote", // 引用
          "emoticon", // 表情
          "image", // 插入图片
          "table", // 表格
          "video", // 插入视频
          "code", // 插入代码
          "undo", // 撤销
          "redo", // 重复
        ];

        this.editor.customConfig.uploadImgHooks = {
          fail: (xhr, editor, result) => {
            // 插入图片失败回调
          },
          success: (xhr, editor, result) => {
            // 图片上传成功回调
          },
          timeout: (xhr, editor) => {
            // 网络超时的回调
          },
          error: (xhr, editor) => {
            // 图片上传错误的回调
          },
          customInsert: (insertImg, result, editor) => {
            // 图片上传成功,插入图片的回调
          },
        };
        this.editor.customConfig.onchange = (html) => {
          this.info_ = html; // 绑定当前逐渐地值
          this.$emit("change", this.info_); // 将内容同步到父组件中
        };

        // 创建富文本编辑器
        this.editor.create();
      },
    },
  };
</script>

<style lang="css">
  .editor {
    width: 80%;
    margin: 0 auto;
  }

  .toolbar {
    border: 1px solid #ccc;
  }

  .text {
    border: 1px solid #ccc;
    height: 500px;
  }
</style>

编辑父组件代码

<template lang="html">
  <div>
    <editor-bar
      v-model="editor.info"
      :isClear="isClear"
      @change="change"
    ></editor-bar>
  </div>
</template>

<script>
  import EditorBar from "@/components/EditorBar";
  export default {
    data() {
      return {
        editor: {
          info: "",
        },
        isClear: false,
      };
    },
    methods: {
      change(val) {
        this.editor.info1 = val;
      },
    },
    components: {
      EditorBar,
    },
  };
</script>
打赏
给作者赏一杯咖啡吧
您的支持将是我继续更新下去的动力
微信微信
支付宝支付宝