1..项目创建与初始化
在安装好脚手架的依赖后,要执行 npm install vue-html5-editor -S 来安装这个富文本插件,由于这个富文本插件的图标是依赖font-awesome.css的,所以要cnpm install font-awesome --save安装这个css然后在main.js中引入这个css import 'font-awesome/css/font-awesome.min.css'
2.使用vue-html5-editor富文本编辑器
新建一个common文件夹用于存放我们的工具类js文件,然后将下面的代码copy进去:
import Vue from 'vue'import VueHtml5Editor from'vue-html5-editor'exportdefault function() {
let opt={//全局组件名称,使用new VueHtml5Editor(options)时该选项无效
name: "vue-html5-editor",//是否显示模块名称,开启的话会在工具栏的图标后台直接显示名称
showModuleName: true,//自定义各个图标的class,默认使用的是font-awesome提供的图标
icons: {
text:"fa fa-pencil",
color:"fa fa-paint-brush",
font:"fa fa-font",
align:"fa fa-align-justify",
list:"fa fa-list",
link:"fa fa-chain",
unlink:"fa fa-chain-broken",
tabulation:"fa fa-table",
image:"fa fa-file-image-o",
hr:"fa fa-minus",
eraser:"fa fa-eraser",
undo:"fa-undo fa","full-screen": "fa fa-arrows-alt",
info:"fa fa-info",
},//配置图片模块
image: {//文件最大体积,单位字节
sizeLimit: 512 * 1024 * 10,//上传参数,默认把图片转为base64而不上传
//upload config,default null and convert image to base64
upload: {
url:null,
headers:{},
params: {},
fieldName:{}},//压缩参数,默认使用localResizeIMG进行压缩,设置为null禁止压缩
//width和height是文件的最大宽高
compress: {
width:600,
height:600,
quality:80},//响应数据处理,最终返回图片链接
uploadHandler(responseText){//default accept json data like {ok:false,msg:"unexpected"} or {ok:true,data:"image url"}
var json =JSON.parse(responseText);if(json.status == 200){returnjson.data
}else{
alert(json.error)
}
}
},//语言,内建的有英文(en-us)和中文(zh-cn)
language: "zh-cn",//自定义语言
i18n: {"zh-cn": {"align": "对齐方式","image": "图片","list": "列表","link": "链接","unlink": "去除链接","table": "表格","font": "文字","full screen": "全屏","text": "排版","eraser": "格式清除","info": "关于","color": "颜色","please enter a url": "请输入地址","create link": "创建链接","bold": "加粗","italic": "倾斜","underline": "下划线","strike through": "删除线","subscript": "上标","superscript": "下标","heading": "标题","font name": "字体","font size": "文字大小","left justify": "左对齐","center justify": "居中","right justify": "右对齐","ordered list": "有序列表","unordered list": "无序列表","fore color": "前景色","background color": "背景色","row count": "行数","column count": "列数","save": "确定","upload": "上传","progress": "进度","unknown": "未知","please wait": "请稍等","error": "错误","abort": "中断","reset": "重置"}
},//隐藏不想要显示出来的模块
hiddenModules: [],//自定义要显示的模块,并控制顺序
visibleModules: [//"text",//"color",
"font","align",//"list",//"link",//"unlink",//"tabulation",
"image",//"hr",//"eraser",
"undo",//"full-screen",//"info",
],//扩展模块,具体可以参考examples或查看源码
//extended modules
modules: {//omit,reference to source code of build-in modules
}
};
Vue.use(VueHtml5Editor, opt);
}
接着在main.js中引入这个初始化的函数:
import initRichText from './common/initHTMLEditor.js'import'font-awesome/css/font-awesome.min.css'
3.使用组件
export default {
data() {
return {
content: ""
};
},
methods: {
updateData(e = "") {
let c1 = e.replace(/
let c2 = c1.replace(/
this.content = c2;
console.log(this.content);
}
}
};
.rich-text-test{
margin-top: 40px;
}
这个height属性是设置内容区的高度,content是内容区的数据内容,@change事件是内容区的监听事件,会在发生变化时触发,该函数接收一个参数,表示当前编辑器中的内容。运行结果如下(这里对图片的操作是转成base64的字符串):
4.常见问题解决
(1)自定义工具栏的模块
如果不想要显示这么多的工具,则只要配置visibleModules即可:
(2)移动端图片上传样式的处理
这里我没有配置服务端的上传文件的接口,所以我就直接将图片转成base64的来处理。但是这样会有问题,在PC端图片是可以修改大小的,但是在移动端上传的图片上是原图,也就是很大,图文混排的时候非常不好看,也不好编辑。这时候我做的处理挺投机取巧的,但是也是可行的方法。我们知道change函数是在内容发生变化时触发的,这时候我们只要将获取到的内容做一下修改即可,看代码:
updateData(e = "") {
let c1= e.replace(/
let c2= c1.replace(/
},
这样就可以了。
(3)图片上传的主要问题
图片上传的方法这里分两种。
第一种是默认把图片转为base64而不上传,最后点击发布上传所有。这里有个缺点是如果上传的图片太大而且有多张的话转为base64会很大,会出现因为文件太大上传不过去的情况,所以可以放弃这种方法。
第二种是在配置文件中(上面说的新建的js中)修改几行代码即可。原理是每上传一张图片,先上传到服务器然后返回一个图片链接地址,至于返回链接地址怎么展示在页面的问题,插件已经为我们封装的很好,直接在下面的uploadHandler函数return返回的链接就可以啦。在做的过程中出现了上传图片失败问题,原因出在接口问题上,这里的接口写成input file上传不是base64的接口就可以。
//配置图片模块
image: {//文件最大体积,单位字节
sizeLimit: 512 * 1024 * 10,//上传参数,默认把图片转为base64而不上传
//upload config,default null and convert image to base64
upload: {
url:'图片上传接口地址',
headers:{},
params: {},
fieldName:'file'},//压缩参数,默认使用localResizeIMG进行压缩,设置为null禁止压缩
//width和height是文件的最大宽高
compress: {
width:600,
height:600,
quality:80},//响应数据处理,最终返回图片链接
uploadHandler(responseText){//default accept json data like {ok:false,msg:"unexpected"} or {ok:true,data:"image url"}
var json =JSON.parse(responseText);if(json.status == 200){returnjson.data
}else{
alert(json.error)
}
}
},