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开发中常见的套路和技巧总结
Nov 24 Vue.js
Vue如何实现验证码输入交互
Dec 07 Vue.js
Vue在H5 项目中使用融云进行实时个人单聊通讯
Dec 14 Vue.js
vue 通过base64实现图片下载功能
Dec 19 Vue.js
Vue+Bootstrap实现简易学生管理系统
Feb 09 Vue.js
关于vue中如何监听数组变化
Apr 28 Vue.js
vue+spring boot实现校验码功能
May 27 Vue.js
解决vue $http的get和post请求跨域问题
Jun 07 Vue.js
Vue过滤器(filter)实现及应用场景详解
Jun 15 Vue.js
vite+vue3.0+ts+element-plus快速搭建项目的实现
Jun 24 Vue.js
三种方式清除vue路由跳转router-link的历史记录
Apr 10 Vue.js
vue3.0 数字翻牌组件的使用方法详解
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
mysql 的 like 问题,超强毕杀记!!!
2007/01/18 PHP
php实现图片按比例截取的方法
2017/02/06 PHP
ThinkPHP防止重复提交表单的方法实例分析
2018/05/10 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
PHP代码加密的方法总结
2020/03/13 PHP
传智播客学习之JavaScript基础篇
2009/11/13 Javascript
Javascript之旅 对象的原型链之由来
2010/08/25 Javascript
使用Firebug对js进行断点调试的图文方法
2011/04/02 Javascript
使用基于jquery的gamequery插件做JS乒乓球游戏
2011/07/31 Javascript
javascript中自定义对象的属性方法分享
2013/07/12 Javascript
jQuery验证元素是否为空的两种常用方法
2015/03/17 Javascript
javascript简单实现类似QQ头像弹出效果的方法
2015/08/03 Javascript
Svg.js实例教程及使用手册详解(一)
2016/05/16 Javascript
纯JS实现简单的日历
2017/06/26 Javascript
基于Vue过渡状态实例讲解
2017/09/14 Javascript
bootstrap 通过加减按钮实现输入框组功能
2017/11/15 Javascript
JS数组去重常用方法实例小结【4种方法】
2018/05/28 Javascript
详解在vue-cli中使用graphql即vue-apollo的用法
2018/09/08 Javascript
angularjs中判断ng-repeat是否迭代完的实例
2018/09/12 Javascript
Vue中全局变量的定义和使用
2019/06/05 Javascript
layer扩展打开/关闭动画的方法
2019/09/23 Javascript
JS使用H5实现图片预览功能
2019/09/30 Javascript
收藏整理的一些Python常用方法和技巧
2015/05/18 Python
python hook监听事件详解
2018/10/25 Python
python自动化生成IOS的图标
2018/11/13 Python
django模板结构优化的方法
2019/02/28 Python
python实现logistic分类算法代码
2020/02/28 Python
医学生实习自荐信
2013/10/01 职场文书
应届医学毕业生求职信分享
2013/12/02 职场文书
法律进企业活动方案
2014/03/04 职场文书
职务任命书范本
2014/06/05 职场文书
2016年全国助残日活动总结
2016/04/01 职场文书
农村房屋租赁合同(范本)
2019/07/23 职场文书
Python中如何处理常见报错
2022/01/18 Python
python自动化测试之Selenium详解
2022/03/13 Python
Mysql中@和@@符号的详细使用指南
2022/06/05 MySQL