# 「富文本编辑器」vue2-editor

预计阅读时间: 3 分钟

  在后台管理系统开发的过程中,富文本编辑器是经常会用到的一种文本编辑工具。目前主流的富文本编辑器有很多,但总有一款是符合自己需求的。在周末花费了大约半天的时间,尝试了许多富文本编辑器,大体上功能都相差无几。主要是对富文本中图片的处理,各个种类的富文本对图片的处理差异还是挺大的。此处的所说的图片处理指的是图片的大小调整、位置调整、是否可以拖拽等。此次我使用的富文本编辑器是 vue2-editor,并结合实际情况进行了相应调整。

  vue2-editor 富文本编辑器是基于 vue-quill-editor 富文本编辑器进行改造的,如果有问题可以访问文档进行问题的查找。

插件安装

  • vue2-editor:富文本编辑器

    npm
    yarn
    pnpm
    bun
    1npm install vue2-editor
  • quill-image-drop-module:图片拖拽

    npm
    yarn
    pnpm
    bun
    1npm install quill-image-drop-module -D
  • quill-image-resize-module:图片大小调整

    npm
    yarn
    pnpm
    bun
    1npm install quill-image-resize-module -D

封装 Editor 组件

代码示例
1<template>
2	<div class="editor">
3		<vue-editor
4			v-model="editorHtml"
5			:customModules="customModulesForEditor"
6			:editorOptions="editorSettings"
7			:editorToolbar="customToolbar"
8			useCustomImageHandler
9			@image-added="handleImageAdded"
10			@blur="onEditorBlur"
11		/>
12	</div>
13</template>
14
15<script>
16	// 引入vue2wditor
17	import { VueEditor } from "vue2-editor";
18	// 导入图片操作相关插件
19	import { ImageDrop } from "quill-image-drop-module";
20	import ImageResize from "quill-image-resize-module";
21
22	export default {
23		name: "Vue2Editor",
24		components: { VueEditor },
25		props: {
26			defaultText: { type: String, default: "" },
27			richText: { type: String, default: "" }
28		},
29		watch: {
30			// 监听默认值回调
31			defaultText(nv, ov) {
32				if (nv != "") {
33					this.editorHtml = nv;
34					this.$emit("update:rich-text", nv);
35				}
36			}
37		},
38		data() {
39			return {
40				editorHtml: "",
41				// 菜单栏
42				customToolbar: [
43					[{ header: [false, 1, 2, 3, 4, 5, 6] }],
44					["bold", "underline"],
45					[{ align: "" }, { align: "center" }, { align: "right" }, { align: "justify" }],
46					[{ list: "ordered" }, { list: "bullet" }, { list: "check" }],
47					[{ indent: "-1" }, { indent: "+1" }],
48					["color", "background"],
49					["link", "image", "video"]
50				],
51				// 调整图片大小和位置
52				customModulesForEditor: [
53					{ alias: "imageDrop", module: ImageDrop },
54					{ alias: "imageResize", module: ImageResize }
55				],
56				// 设置编辑器图片可拖拽
57				editorSettings: {
58					modules: { imageDrop: true, imageResize: {} }
59				}
60			};
61		},
62		mounted() {},
63		methods: {
64			// 自定义图片上传
65			handleImageAdded(file, Editor, cursorLocation, resetUploader) {
66				// 文件上传:$oss图片文件上传插件是自己封装的阿里云oss文件直传,此处代码自定义
67				this.$oss(file, file.name).then(url => {
68					if (!!url) {
69						Editor.insertEmbed(cursorLocation, "image", url);
70						resetUploader();
71					}
72				});
73			},
74			// 失去焦点
75			onEditorBlur(quill) {
76				this.$emit("update:rich-text", this.editorHtml);
77			}
78		}
79	};
80</script>
81
82<style scoped>
83	/* 处理添加视频链接标签位置 */
84	.editor >>> .ql-snow .ql-tooltip {
85		top: 0 !important;
86		left: 40% !important;
87	}
88</style>

使用 Editor 组件

代码示例
1<template>
2	<div class="home">
3		<el-card shadow="never">
4			<div slot="header" class="clearfix">
5				<h1>Editor 编辑器</h1>
6			</div>
7			<!-- 编辑器 -->
8			<Editor :defaultText="defaultText" :richText.sync="richText" />
9		</el-card>
10	</div>
11</template>
12
13<script>
14	// 导入插件
15	import Editor from "../components/Editor";
16
17	export default {
18		name: "Home",
19		components: { Editor },
20		data() {
21			return {
22				defaultText: "",
23				richText: ""
24			};
25		}
26	};
27</script>

参考图: editor.png

注意事项:

  当引入调整的图片的两个插件时,vue 控制台会报无法找到 Quill.jsvue2editor 官方给的解决办法是基于 webpack4.x 的,如果报错,说明当前项目使用的 webpack 版本较高,现在的解决办法就是针对高版本 webpack 的即 vue-cli 版本> 4.x

  解决办法:

  修改 vue.config.js 文件,在文件顶部导出 webpack 模块,然后根据修改要求对 webpack

进行相应的调整和设置。代码如下:

代码示例
1// webpack
2const webpack = require("webpack");
3// gzip
4
5module.exports = {
6	chainWebpack: config => {
7		// 压缩代码
8		config.optimization.minimize(true);
9		// 分割代码
10		config.optimization.splitChunks({ chunks: "all" });
11		// 用cdn方式引入
12		config.externals({
13			//vue: "Vue"
14		});
15		// Quill.js文件引入失败配置
16		config.plugin("provide").use(webpack.ProvidePlugin, [
17			{
18				"window.Quill": "quill/dist/quill.js",
19				Quill: "quill/dist/quill.js"
20			}
21		]);
22	}
23};
提示

  因为业务需要,移动端图片要 100% 占满全屏,所以当前使用的基于quill 的图片拖拽无法达到 宽度 100% 的效果,拖拽后的图片大小是指定的像素宽度,若对图片宽度有特定要求,此富文本的图片上传可能适合你,若动手能力强,可自行改造。