vue进阶——整合富文本编辑器wangEditor

2023-11-17

前言

个人整合wangEditor过程中的经验与总结

一、什么是wangEditor?

wangEditor是一款基于JavaScript的富文本编辑器插件,用于在网页中实现所见即所得的编辑功能。它提供了丰富的编辑功能,包括文字样式设置、插入图片、插入表格、代码高亮等。wangEditor易于集成和使用,支持自定义配置和扩展。

二、安装wangEditor

1. React

yarn add @wangeditor/editor-for-react
# 或者 npm install @wangeditor/editor-for-react --save

2. Vue2

yarn add @wangeditor/editor-for-vue
# 或者 npm install @wangeditor/editor-for-vue --save

3. Vue3

yarn add @wangeditor/editor-for-vue@next
# 或者 npm install @wangeditor/editor-for-vue@next --save

4. CDN

<!-- 引入 css -->
<link href="https://unpkg.com/@wangeditor/editor@latest/dist/css/style.css" rel="stylesheet">

<!-- 引入 js -->
<script src="https://unpkg.com/@wangeditor/editor@latest/dist/index.js"></script>
<script>
    var E = window.wangEditor; // 全局变量
</script>

三、基本使用

1. vue2

<template>
    <div style="border: 1px solid #ccc;">
        <Toolbar
            style="border-bottom: 1px solid #ccc"
            :editor="editor"
            :defaultConfig="toolbarConfig"
            :mode="mode"
        />
        <Editor
            style="height: 500px; overflow-y: hidden;"
            v-model="html"
            :defaultConfig="editorConfig"
            :mode="mode"
            @onCreated="onCreated"
        />
    </div>
</template>
<script>
import Vue from 'vue'
import { Editor, Toolbar } from '@wangeditor/editor-for-vue'

export default Vue.extend({
    components: { Editor, Toolbar },
    data() {
        return {
            editor: null,
            html: '<p>hello</p>',
            toolbarConfig: { },
            editorConfig: { placeholder: '请输入内容...' },
            mode: 'default', // or 'simple'
        }
    },
    methods: {
        onCreated(editor) {
            this.editor = Object.seal(editor) // 一定要用 Object.seal() ,否则会报错
        },
    },
    mounted() {
        // 模拟 ajax 请求,异步渲染编辑器
        setTimeout(() => {
            this.html = '<p>模拟 Ajax 异步设置内容 HTML</p>'
        }, 1500)
    },
    beforeDestroy() {
        const editor = this.editor
        if (editor == null) return
        editor.destroy() // 组件销毁时,及时销毁编辑器
    }
})
</script>
<style src="@wangeditor/editor/dist/css/style.css"></style>

2. vue3

<template>
    <div style="border: 1px solid #ccc">
      <Toolbar
        style="border-bottom: 1px solid #ccc"
        :editor="editorRef"
        :defaultConfig="toolbarConfig"
        :mode="mode"
      />
      <Editor
        style="height: 500px; overflow-y: hidden;"
        v-model="valueHtml"
        :defaultConfig="editorConfig"
        :mode="mode"
        @onCreated="handleCreated"
      />
    </div>
</template>
<script>
import '@wangeditor/editor/dist/css/style.css' // 引入 css

import { onBeforeUnmount, ref, shallowRef, onMounted } from 'vue'
import { Editor, Toolbar } from '@wangeditor/editor-for-vue'

export default {
  components: { Editor, Toolbar },
  setup() {
    // 编辑器实例,必须用 shallowRef
    const editorRef = shallowRef()

    // 内容 HTML
    const valueHtml = ref('<p>hello</p>')

    // 模拟 ajax 异步获取内容
    onMounted(() => {
        setTimeout(() => {
            valueHtml.value = '<p>模拟 Ajax 异步设置内容</p>'
        }, 1500)
    })

    const toolbarConfig = {}
    const editorConfig = { placeholder: '请输入内容...' }

    // 组件销毁时,也及时销毁编辑器
    onBeforeUnmount(() => {
        const editor = editorRef.value
        if (editor == null) return
        editor.destroy()
    })

    const handleCreated = (editor) => {
      editorRef.value = editor // 记录 editor 实例,重要!
    }

    return {
      editorRef,
      valueHtml,
      mode: 'default', // 或 'simple'
      toolbarConfig,
      editorConfig,
      handleCreated
    };
  }
}
</script>

四、文件上传问题

此处以vue2+Springboot为例,代码仅供参考

1、前端重点在于editorConfig中fileName及server的配置

<template>
    <div>
        <div class="editor-container">
            <Toolbar :editor="editor" :defaultConfig="toolbarConfig" :mode="mode" />
            <el-button @click="save">保存</el-button>
            <el-button @click="clear">清空</el-button>
            <Editor v-model="html" :defaultConfig="editorConfig" :mode="mode" @onCreated="onCreated" />
        </div>
    </div>
</template>
    
<script>
import { Editor, Toolbar } from '@wangeditor/editor-for-vue';

export default {
    components: {
        Editor,
        Toolbar
    },
    data() {
        return {
            editor: null,
            html: '<p>文章内容</p>',
            toolbarConfig: {},
            editorConfig: {
                placeholder: '请输入内容...',
                MENU_CONF: {
                    uploadImage: {
                        fieldName: 'file',
                        server: 'http://localhost:8082/file/uploadTest'
                    }
                }
            },
            mode: 'default'
        };
    },
    methods: {
        save() {
            this.$store.state.articleContent = this.html;
        },
        clear() {
            this.html = '';
        },
        onCreated(editor) {
            this.editor = Object.seal(editor);
        }
    },
    mounted() {
        setTimeout(() => {
            this.html = '<p>暂不支持视频,提交前记得保存</p>';
        }, 2000);
    },
    beforeDestroy() {
        const editor = this.editor;
        if (editor == null) return;
        editor.destroy();
    }
};
</script>
    
<style src="@wangeditor/editor/dist/css/style.css"></style>
<style>

.editor-container {
    border: 1px solid #ccc;
}

.editor-container>* {
    border-bottom: 1px solid #ccc;
}

.editor-container>button {
    border: 0;
}

.editor-container>.w-e-text-container {
    height: 500px;
    overflow-y: hidden;
}

</style>

2、后端重点在于返回类型及文件大小配置

import com.alibaba.fastjson.JSONObject;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;

@RestController
@CrossOrigin
@RequestMapping("/file")
public class FileController {


    @PostMapping("/uploadTest")
    @CrossOrigin
    public JSONObject uploadTest(@RequestParam(value = "file", required = false) MultipartFile file,HttpServletRequest request) throws Exception {
        String url = upload(file,request);
        JSONObject jsonObject = new JSONObject();
        if(url != null){
            jsonObject.put("errno",0);
            JSONObject jsonObject1 = new JSONObject();
            jsonObject1.put("url",url);
            jsonObject1.put("alt","a2-w1p.jpeg");
            jsonObject1.put("href",url);
            jsonObject.put("data",jsonObject1);
        }else {
            jsonObject.put("errno",1);
            jsonObject.put("message","上传图片失败");
        }
        return jsonObject;
    }

    @PostMapping("/upload")
    public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws IOException {
        String filename = file.getOriginalFilename();
        String path = request.getServletContext().getRealPath("/upload/");
        saveFile(file, path);
        return "http://localhost:8082/upload/" + filename;
    }

    public void saveFile(MultipartFile f, String path) throws IOException {
        File upDir = new File(path);
        if (!upDir.exists()) {
            upDir.mkdir();
        }
        File file = new File(path + f.getOriginalFilename());
        f.transferTo(file);
    }

}
  • yml文件大小配置
  servlet:
    multipart:
      # 上传文件的最大大小限制
      max-file-size: 10MB
      # 请求的最大大小限制
      max-request-size: 10MB

五、参考文献

wangEditor官方文档

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue进阶——整合富文本编辑器wangEditor 的相关文章

随机推荐

  • 计算机网络之7层协议

    7层协议图解 通俗的理解 1 首先物理层解决两个硬件之间怎么通信 具体就是一台发些比特流 然后另一台能收到 物理层的作用 主要定义物理设备标准 如网线的接口类型 光纤的接口类型 各种传输介质的传输速率等 它的主要作用是传输比特流 就是由1
  • el-tabs中使用Echarts警告。Can‘t get DOM width or height. Please check dom.clientWidth and dom.clientHeight

    具体警告 Can t get DOM width or height Please check dom clientWidth and dom clientHeight They should not be 0 For example yo
  • SnowFlake 雪花算法实现以及详解

    背景简介 现在的服务基本是分布式 微服务形式的 而且大数据量也导致分库分表的产生 对于水平分表就需要保证表中 id 的全局唯一性 对于 MySQL 而言 一个表中的主键 id 一般使用自增的方式 但是如果进行水平分表之后 多个表中会生成重复
  • 软件测试基础之软件缺陷处理

    一 什么是缺陷 不满足用户确定需求 影响软件功能实现的问题 故障 缺陷就是人们通常所说的bug ex 一下哪一种选项不属于软件缺陷 A 软件没有实现产品规格说明所要求的功能 B 软件中出现了产品规格说明不应该出现的功能 C 软件实现了产品规
  • 【电路设计】RC振荡器 - 文氏电桥振荡器

    一 文氏电桥振荡器的工作原理 文氏电桥振荡器广泛用于产生几Hz到几百kHz频段范围的可变频率振荡器 主要由两部分构成 具有正反馈作用的RC串并联选频网络 gt 以满足相位平衡条件 具有负反馈作用的同相放大器 gt 以满足振幅平衡条件 其工作
  • Qt中用textEdit发送文本遇到的换行问题

    用textEdit发送文本遇到的换行问题 在开发BLE通讯的过程中遇到了以下问题 在自己写的BLE上位机的输入框textEdit中输入数据 回车换行之后发送 但串口调试助手处接收的数据没有换行 但是在串口调试助手的输入框中输入数据再回车换行
  • Blender使用maya系快捷键

    文章目录 第一步 将config文件夹放入 第二步 将maya快捷键 以及类maya面板放入 空格以及右键的饼面板 第三步 在blender里将mayaKey里的快捷键导入 并选择 第四步 融合blender本身的快捷键 可选 1 从ble
  • 英伟达驱动更新记录_N卡驱动更新软件(NVIDIA GeForce Experience) v3.16.0.122 官方版

    NVIDIA GeForce Experience显卡驱动更新软件可以帮助你检查计算机的geforce驱动程序 并且将其更新到最新的版本 更新显卡驱动有利于更稳定流畅的运行游戏 功能介绍 1 让驱动程序始终处于最新状态 GeForce Ex
  • Docker容器之私有仓库(Harbor)

    创建私有仓库 下载registry镜像 docker pull registry 指定镜像仓库地址 vim etc docker daemon json insecure registries 192 168 159 11 5000 添加此
  • java.lang.NoSuchMethodError: org.springframework.data.redis.core.StringRedisTemplate.delete redis删报错

    java lang NoSuchMethodError org springframework data redis core StringRedisTemplate delete Ljava lang Object V springboo
  • KEIL 断点调试技巧

    实际项目中断点调试起了很大作用 Keil的断点调试功能很强大 除了普通的设置断点运行到断点处 还有单步 跳转 除了这些常规的方法 对于一些疑难杂症 常规方法就有点杯水车薪了 下面我总结下我在工作中常用的几种断点调试技巧 1 断点位置运行次数
  • Linux 中的 chsh 命令及示例

    Linux中的chsh命令用于更改用户的登录shell 当前为登录shell Shell是与操作系统交互的用户界面 可以被认为是操作系统的外层 bash shell 是 Linux 中使用最广泛的登录 shell 之一 该命令允许用户从当前
  • selenium处理12306出发地value值修改不成功

    不知道你们在使用ui框架编写12306时 有没有遇到过这样的问题 在使用selenium去编写场景时发现出发地这个input标签 每次都没办法按照你的预期去修改值 例如 首先在浏览器里使用document发现完全可以修改掉输入框的值 然后兴
  • 排序算法总结(Python版本)

    看了很多排序算法 每种算法都有多个版本 现总结一版自己觉得容易理解的 供以后翻阅 1 插入排序 直接插入排序 直接插入排序是将一个数插入到已经排序好的序列中 做法是先将第一个数作为已经排序好的 依此将后面的数取出插入到前面已排序好的序列中
  • 数据科学猫:机器学习建模流程

    进击的橘子猫正式改名上线啦 我的CSDN主页 https blog csdn net Orange Spotty Cat 也欢迎大家搜索微信公众号 进击的橘子猫 我也会定期分享数据科学 Python 大数据 项目管理与PPT的相关知识 让我
  • 【机器学习】—各类梯度下降算法 简要介绍

    阅读之前看这里 博主是一名正在学习数据类知识的学生 在每个领域我们都应当是学生的心态 也不应该拥有身份标签来限制自己学习的范围 所以博客记录的是在学习过程中一些总结 也希望和大家一起进步 在记录之时 未免存在很多疏漏和不全 如有问题 还请私
  • 考研教训分享

    考研教训分享 大家好 今天分享一篇考研教训 这不是经验帖 这只是一篇避坑指南 记录了我考研期间所走的所有弯路 希望可以帮助到在这条路上奋斗的你 我是某双非的工科考生 所以这篇文章更偏向于考数学的研友 2月中旬备考 复习前感觉自己之前大学学过
  • 你的朋友可能还在为毕设烦恼,而你已经有了这113个Java计算机毕业设计项目

    站在计算机专业毕业设计的门槛上 你是否为选题和项目规划而烦恼 今天 我们将为即将毕业的同学们展示多个毕业设计项目 期待能为正在为毕业设计抓狂的同学们提供一些帮助 一 成品列表 以下所有springboot框架项目的源码博主已经打包好上传到百
  • Mac用户入门的13个基础终端命令

    终端是用户在Mac电脑中经常使用的应用程序 也是非常好用的Mac应用 终端应用之所以受欢迎是因为 它可以直接执行用户给出的命令 从而完成其他程序无法完成的操作 更改目录 cd 示例用法 cd folder 使用cd命令更改目录 例如 cd
  • vue进阶——整合富文本编辑器wangEditor

    vue进阶 整合富文本编辑器wangEditor 前言 一 什么是wangEditor 二 安装wangEditor 1 React 2 Vue2 3 Vue3 4 CDN 三 基本使用 1 vue2 2 vue3 四 文件上传问题 1 前