vue集成一个支持图片缩放拖拽的富文本编辑器


Posted in Vue.js onJanuary 29, 2021

需求:

根据业务要求,需要能够上传图片,且上传的图片能在移动端中占满屏幕宽度,故需要能等比缩放上传的图片,还需要能拖拽、缩放、改变图片大小。尝试多个第三方富文本编辑器,很难找到一个完美符合自己要求的编辑器。经过多次尝试,最终选择了wangEditor富文本编辑器。 最初使用的是vue2Editor富文本编辑器,vue2Editor本身是不支持图片拖拽的,但是提供了可配置图片拖拽的方法,需要借助Quill.js来实现图片拖拽。虽然满足了业务需求,但是在移动端展示的效果不是很理想。 此次编辑器主要是上传的富文本需要在移动端进行展示,为了达到理想效果,需要能修改图片百分比,当设置img标签的width属性为100% 时,就可以满足需求。最近发新版本(第四版 v4)的wangEditor可以满足需求,最终选择了它用于实际开发中。

效果图:

vue集成一个支持图片缩放拖拽的富文本编辑器

代码案例及相关配置如下:

安装插件

npm i wangeditor --save
// or
yarn add wangeditor

编辑器配置

<template>
	<div class="w_editor">
		<!-- 富文本编辑器 -->
		<div id="w_view"></div>
	</div>
</template>

<script>
// 引入富文本
import WE from "wangeditor";
// 引入elementUI Message模块(用于提示信息)
import { Message } from "element-ui";

export default {
	name: "WEditor",
	props: {
		// 默认值
		defaultText: { type: String, default: "" },
		// 富文本更新的值
		richText: { type: String, default: "" }
	},
	data() {
		return {
			// 编辑器实例
			editor: null,
			// 富文本菜单选项配置
			menuItem: [
				"head",
				"bold",
				"fontSize",
				"fontName",
				"italic",
				"underline",
				"indent",
				"lineHeight",
				"foreColor",
				"backColor",
				"link",
				"list",
				"justify",
				"image",
				"video"
			]
		};
	},
	watch: {
		// 监听默认值
		defaultText(nv, ov) {
			if (nv != "") {
				this.editor.txt.html(nv);
				this.$emit("update:rich-text", nv);
			}
		}
	},
	mounted() {
		this.initEditor();
	},
	methods: {
		// 初始化编辑器
		initEditor() {
			// 获取编辑器dom节点
			const editor = new WE("#w_view");
			// 配置编辑器
			editor.config.showLinkImg = false; /* 隐藏插入网络图片的功能 */
			editor.config.onchangeTimeout = 400; /* 配置触发 onchange 的时间频率,默认为 200ms */
			editor.config.uploadImgMaxLength = 1; /* 限制一次最多能传几张图片 */
			// editor.config.showFullScreen = false; /* 配置全屏功能按钮是否展示 */
			editor.config.menus = [...this.menuItem]; /* 自定义系统菜单 */
			// editor.config.uploadImgMaxSize = 5 * 1024 * 1024 /* 限制图片大小 */;
			editor.config.customAlert = err => {
				Message.error(err);
			};
			// 监控变化,同步更新数据
			editor.config.onchange = newHtml => {
				// 异步更新组件富文本值的变化
				this.$emit("update:rich-text", newHtml);
			};
			// 自定义上传图片
			editor.config.customUploadImg = (resultFiles, insertImgFn) => {
				/**
				 * resultFiles:图片上传文件流
				 * insertImgFn:插入图片到富文本
				 * 返回结果为生成的图片URL地址
				 * */
				// 此方法为自己封赚改写的阿里云图片OSS直传插件。
				this.$oss(resultFiles[0], resultFiles[0]["name"]).then(url => {
					!!url && insertImgFn(url); /* oss图片上传,将图片插入到编辑器中 */
				});
			};
			// 创建编辑器
			editor.create();
			this.editor = editor;
		}
	},
	beforeDestroy() {
		// 销毁编辑器
		this.editor.destroy();
		this.editor = null;
	}
};
</script>

注: 具体参数配置请参考编辑器文档使用说明。

组件中使用抽离的编辑器:

<template>
	<div class="editor">
		<el-card shadow="never">
			<div slot="header" class="clearfix">
				<span>富文本编辑器</span>
			</div>
			<div class="card_center">
				<WEditor :defaultText="defaultText" :richText.sync="richText" />
			</div>
		</el-card>
	</div>
</template>

<script>
// 引入封装好的编辑器
import WEditor from "@/components/WEditor";

export default {
	name: "Editor",
	components: { WEditor },
	data() {
		return {
			// 默认值
			defaultText: "",
			// 富文本更新的值
			richText: ""
		};
	},
	created() {
		// 等待组件加载完毕赋值
		this.$nextTick(() => {
			this.defaultText = `<p style="text-align: center; "><img src="https://tr-mba.oss-cn-beijing.aliyuncs.com/picture/202010/20_222430_8011.png" width="30%" style="text-align: center; max-width: 100%;"></p>`;
		});
	}
};
</script>

以上就是vue集成一个支持图片缩放拖拽的富文本编辑器的详细内容,更多关于vue 富文本编辑器的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
vue使用vant中的checkbox实现全选功能
Nov 17 Vue.js
Vue如何循环提取对象数组中的值
Nov 18 Vue.js
vuex Module将 store 分割成模块的操作
Dec 07 Vue.js
浅析vue中的nextTick
Dec 28 Vue.js
如何在vue 中使用柱状图 并自修改配置
Jan 21 Vue.js
详解Vue的七种传值方式
Feb 08 Vue.js
vue实现可移动的悬浮按钮
Mar 04 Vue.js
vue3中的组件间通信
Mar 31 Vue.js
Element-ui Layout布局(Row和Col组件)的实现
Dec 06 Vue.js
Vue+Flask实现图片传输功能
Apr 01 Vue.js
vue中div禁止点击事件的实现
Apr 02 Vue.js
vue封装数字翻牌器
Apr 20 Vue.js
Vue 事件的$event参数=事件的值案例
Jan 29 #Vue.js
Vue 3自定义指令开发的相关总结
Jan 29 #Vue.js
vue 中this.$set 动态绑定数据的案例讲解
Jan 29 #Vue.js
vue穿梭框实现上下移动
Jan 29 #Vue.js
vue使用transition组件动画效果的实例代码
Jan 28 #Vue.js
Vue ​v-model相关知识总结
Jan 28 #Vue.js
Vue 数据响应式相关总结
Jan 28 #Vue.js
You might like
phpmyadmin打开很慢的解决方法
2014/04/21 PHP
php中钩子(hook)的原理与简单应用demo示例
2019/09/03 PHP
Javascript根据指定下标或对象删除数组元素
2012/12/21 Javascript
JavaScript中“基本类型”之争小结
2013/01/03 Javascript
调试Javascript代码(浏览器F12及VS中debugger关键字)
2013/01/25 Javascript
js中通过父级进行查找定位元素
2014/06/15 Javascript
jQuery过滤HTML标签并高亮显示关键字的方法
2015/08/07 Javascript
javascript如何操作HTML下拉列表标签
2015/08/20 Javascript
js操作cookie保存浏览记录的方法
2015/12/25 Javascript
vue2.0+webpack环境的构造过程
2016/11/08 Javascript
js倒计时小实例(多次定时)
2016/12/08 Javascript
node实现定时发送邮件的示例代码
2017/08/26 Javascript
JavaScript屏蔽Backspace键的实现代码
2017/11/02 Javascript
基于vue手写tree插件的那点事儿
2019/08/20 Javascript
javascript(基于jQuery)实现鼠标获取选中的文字示例【测试可用】
2019/10/26 jQuery
vue2.0 watch里面的 deep和immediate用法说明
2020/10/30 Javascript
[44:09]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第二局
2016/02/25 DOTA
[52:05]EG vs OG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
python根据unicode判断语言类型实例代码
2018/01/17 Python
Python3.6实现带有简单界面的有道翻译小程序
2019/04/16 Python
Django 缓存配置Redis使用详解
2019/07/23 Python
python:批量统计xml中各类目标的数量案例
2020/03/10 Python
Pycharm配置PyQt5环境的教程
2020/04/02 Python
500行python代码实现飞机大战
2020/04/24 Python
详解Python中的编码问题(encoding与decode、str与bytes)
2020/09/30 Python
纯CSS3代码实现文字描边
2016/04/25 HTML / CSS
CSS3中Animation动画属性用法详解
2016/07/04 HTML / CSS
Canvas中设置width与height的问题浅析
2018/11/01 HTML / CSS
canvas生成带二维码海报的踩坑记录
2019/09/11 HTML / CSS
宝宝周岁宴答谢词
2014/01/26 职场文书
会计电算化大学生职业规划书
2014/02/05 职场文书
给校长的一封检讨书
2014/09/20 职场文书
机票销售员态度不好检讨书
2014/09/27 职场文书
个人整改措施书面材料
2014/10/24 职场文书
关于职业道德的心得体会
2016/01/18 职场文书
解决Vue+SpringBoot+Shiro跨域问题
2021/06/09 Vue.js