【Vue】集成富文本编辑器

这文章使用的是wangeditor插件,官网地址:wangEditor,这个比较简单

安装

复制代码
npm i wangeditor --save

使用

复制代码
<div id="editor"></div>

import E from "wangeditor"

const editor = new E("#editor")
editor.create()

//或者
export default {
data() {
   return {
     editor: null
   }
}
this.editor = new E(`#editor`)//设置参数
this.editor.create() //创建

报错:

原因是在打开表单的时候元素还没创建好,所以找不到

解决方法:

使用NextTick:在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。

复制代码
this.$nextTick(() => {
        this.editor = new E(`#editor`)//设置参数
        this.editor.create() //创建
      })

销毁编辑器

关闭时销毁,不然下次打开内容还在编辑器中

复制代码
//在dialog销毁时调用
beforeDestroy() {
this.editor.destroy ()
this.editor = null
}

// 获取编辑器内容
this.editor.txt.html()

配置图片上传

配置图片上传接口

java 复制代码
 @PostMapping("/editor/upload")
    public Dict editorUpload(MultipartFile file) throws IOException {
        String originaFilename = file.getOriginalFilename();//文件原始名 a.jpg
        String mainname = FileUtil.mainName(originaFilename);//a
        String extname = FileUtil.extName(originaFilename);//jpg
        File parentFile = new File(ROOT_PATH);
        if (!FileUtil.exist(ROOT_PATH)) {
            //若当前父级目录不存在就创建一个
            FileUtil.mkdir(ROOT_PATH);
        }
        if (FileUtil.exist(ROOT_PATH + File.separator + originaFilename)) {
            //若当前上传的文件名已存在,则重命名
            originaFilename = System.currentTimeMillis() + "_" + mainname + "." + extname;//124234_a.jpg
        }
        File saveFile = new File(ROOT_PATH + File.separator + originaFilename);
        file.transferTo(saveFile);//存储到本地
        String url = "http://localhost:8080/file/download/" + originaFilename;
        Dict dict=Dict.create().set("errno",0).set("data", CollUtil.newArrayList(Dict.create().set("url",url)));
        //返回
        return dict;
    }

前端使用接口:

TypeScript 复制代码
this.editor.config.uploadImgServer = this.$baseUrl + '/file/editor/upload'
this.editor.config.uploadFileName = 'file'
this.editor.config.uploadImgHeaders = {
     token: this.user.token
}

server 接口返回格式,重要!!!

复制代码
{
"errno": 0,
"data":[
    {url:"图片地址"}
 ]
}

视频上传

TypeScript 复制代码
this.editor.config.uploadVideoServer = this.$baseUrl + '/file/editor/upload'
        this.editor.config.uploadVideoName = 'file'
        this.editor.config.uploadVideoHeaders = {
          token: this.user.token
        }

写到这里报错了,最后发现视频的格式和图片格式要求不一样,视频格式:

所以需要改一下后端接口,判断是视频还是图片,最后完整代码:

接口:

java 复制代码
@PostMapping("/editor/upload")
    public Dict editorUpload(@RequestParam MultipartFile file, @RequestParam String type) throws IOException {
        String originaFilename = file.getOriginalFilename();
        String mainname = FileUtil.mainName(originaFilename);
        String extname = FileUtil.extName(originaFilename);
        if (!FileUtil.exist(ROOT_PATH)) {
            FileUtil.mkdir(ROOT_PATH);
        }
        if (FileUtil.exist(ROOT_PATH + File.separator + originaFilename)) {
            //若当前上传的文件名已存在,则重命名
            originaFilename = System.currentTimeMillis() + "_" + mainname + "." + extname;//124234_a.jpg
        }
        File saveFile = new File(ROOT_PATH + File.separator + originaFilename);
        file.transferTo(saveFile);//存储到本地
        String url = "http://localhost:8080/file/download/" + originaFilename;
        Dict dict = Dict.create().set("errno", 0);
        if ("img".equals(type)) {
            dict = Dict.create().set("errno", 0).set("data", CollUtil.newArrayList(Dict.create().set("url", url)));
        } else if ("video".equals(type)) {
            dict = Dict.create().set("errno", 0).set("data", Dict.create().set("url", url));
        }
        //返回
        return dict;
    }

前端:

javascript 复制代码
//编辑显示
this.$nextTick(() => {
        this.editor = new E(`#editor`)//设置参数

        this.editor.config.uploadImgServer = this.$baseUrl + '/file/editor/upload'
        this.editor.config.uploadFileName = 'file'
        this.editor.config.uploadImgHeaders = {
          token: this.user.token
        }
        this.editor.config.uploadImgParams = {
          type: 'img'
        }
        this.editor.config.uploadVideoServer = this.$baseUrl + '/file/editor/upload'
        this.editor.config.uploadVideoName = 'file'
        this.editor.config.uploadVideoHeaders = {
          token: this.user.token
        }
        this.editor.config.uploadVideoParams = {
          type: 'video'
        }
        this.editor.create() //创建
        this.editor.txt.html(row.content)
      })
相关推荐
Javatutouhouduan15 分钟前
Java面试大厂真题汇总!
java·java面试·java面试题·后端开发·java编程·java架构师·java八股文
丷丩23 分钟前
MapLibre GL JS第31课:添加实时数据
javascript·gis·map·mapbox·maplibre gl js
maomao大哥闯天下24 分钟前
K8s对象deployment、job、service应用详解
java·容器·kubernetes
闪电悠米26 分钟前
黑马点评-优惠券秒杀-05_local_lock_cluster_problem
java·spring boot·redis·缓存
IronMurphy35 分钟前
SSM拷打第二讲!!!
java·spring·mybatis
小江的记录本43 分钟前
【JVM虚拟机】类加载机制:类加载全流程:加载→验证→准备→解析→初始化(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·算法·安全·spring·面试
candyTong1 小时前
Claude Code 每次调用 API 时,上下文是怎么"拼"出来的?
javascript·后端·架构
千纸鹤の脉搏1 小时前
多线程的初步了解---进程与线程
java·开发语言·学习·线程
小林ixn1 小时前
别再背“变量提升”了!深入编译执行,彻底搞懂 JavaScript 运行机制
javascript
用户852495071841 小时前
为什么变量能 未定义先使用?
javascript·程序员