最近在用uni-app写跨端的小程序APP应用。其中有富文本的需求,后台使用的vue-cli3+elementUI。vue做技术栈的话还是选择quill-editor比较多。
quill-editor默认的图片是base64文件,一般来说,我们都需要保存至自己的服务器或者OSS。
quill-editor上传到服务器的关键是对quill-editor的图片和视频点击事件的劫持,劫持之后自定义一个上传的方法。基本配置在这里就不多做记录。可以按照需求查看文档或者百度。
editorOption: {
theme: "snow", // or 'bubble'
placeholder: "",
modules: {
imageResize: {},
toolbar: {
container: toolbarOptions,
// container: "#toolbar",
handlers: {
//拦截默认的上传方式
image: function(value) {
//当点击图片上传时,value会变为true
if (value) {
// 触发自定义的上传
document.querySelector(".avatar-uploader input").click();
} else {
this.quill.format("image", false);
}
},
video: function(value) {
//当点击视频上传时,value会变为true
if (value) {
// 触发上传
document.querySelector(".video-uploader input").click();
} else {
this.quill.format("video",false);
}
},
}
}
}
},
文件上传的方法在这里就不做过多解释。下面说一下如何将上传之后的文件,插入到富文本中
uploadSuccessVideo(res,file){
// res为文件服务器返回的数据
// 获取富文本组件实例
let quill = this.$refs.myQuillEditor.quill;
// 如果上传成功
if (res.code === 200) {
// 使用getSelection来获取光标所在位置
let length = quill.getSelection().index;
// 插入“video”或者“image” 第三个参数为服务器端返回的地址
quill.insertEmbed(length, "video", res.data);
// 调整光标到最后
quill.setSelection(length + 1);
console.log(this.content)
} else {
this.$message.error("视频插入失败");
}
// loading动画消失
this.quillUpdateImg = false;
},
到这里自定义的文件服务器上传就完成了。
图片只有上传可远远不够,因为用户的图片大小规格不一,改变图片大小的需求是肯定会存在的。
这个插件在安装之后的引用遇到了许多问题,类似"Cannot read property 'register' of undefined"、"Cannot read property 'imports' of undefined" ,也百度了许多方案,但是很多行不通。这里记录下解决方案。
首先是quill-image-resize-module的引入,安装过程就不多做解释。
//引入
import "quill/dist/quill.core.css";
import "quill/dist/quill.snow.css";
import 'quill/dist/quill.bubble.css';
import { quillEditor } from 'vue-quill-editor'
import * as Quill from 'quill'
import ImageResize from 'quill-image-resize-module'
Quill.register('modules/imageResize', ImageResize)
//option配置
editorOption: {
theme: "snow", // or 'bubble'
placeholder: "您想说点什么?",
modules: {
imageResize: {},//这里就是配置
toolbar: {
//...
}
}
}
},
引入之后,然后运行! 接下来就开始报错,百度查找了。百度上有很多种webpack的配置,下面是本次在vue-cli3中的方案。
在vue.config.js中添加如下代码:(没有此文件的话,在根目录新建一个)
const webpack = require('webpack')
module.exports = {
... //这里是一些其他的配置
//关键配置
configureWebpack: {
plugins: [
new webpack.ProvidePlugin({
'window.Quill': 'quill/dist/quill.js',
'Quill': 'quill/dist/quill.js'
}),
]
}
//
};
记住,每次修改vue.config.js之后都需要重新启动 npm run serve 到这里实现图片的缩放了。
小程序是富文本默认是不解析视频的,需要一些其他的辅助来实现。微信小程序直接百度"wxparse"使用。uni-app的话去插件市场搜索"u-parse"。小程序的video的层级默认是高于普通标签的,如果video覆盖到了其他组件,可以对其他组件调节z-index去解决这个问题。
下边上传封装quill-editor组件,仅供参考配置需要自己修改。