zoukankan      html  css  js  c++  java
  • 富文本编辑器vue2-editor

    富文本编辑器vue2-editor

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

    插件安装

    • vue2-editor:富文本编辑器
    yarn add vue2-editor
    
    • quill-image-drop-module:图片拖拽
    • quill-image-resize-module:图片大小调整
    yarn add quill-image-drop-module --dev
    yarn add quill-image-resize-module --dev
    

    封装Editor组件

    <template>
    	<div class="editor">
    		<vue-editor
    			:customModules="customModulesForEditor"
    			:editorOptions="editorSettings"
    			:editorToolbar="customToolbar"
    			useCustomImageHandler
    			@image-added="handleImageAdded"
    			@blur="onEditorBlur"
    			v-model="editorHtml"
    		/>
    	</div>
    </template>
    
    <script>
    // 引入vue2wditor
    import { VueEditor } from "vue2-editor";
    // 导入图片操作相关插件
    import { ImageDrop } from "quill-image-drop-module";
    import ImageResize from "quill-image-resize-module";
    
    export default {
    	name: "Vue2Editor",
    	components: { VueEditor },
    	props: {
    		defaultText: { type: String, default: "" },
    		richText: { type: String, default: "" }
    	},
    	watch: {
    		// 监听默认值回调
    		defaultText(nv, ov) {
    			if (nv != "") {
    				this.editorHtml = nv;
    				this.$emit("update:rich-text", nv);
    			}
    		}
    	},
    	data() {
    		return {
    			editorHtml: "",
    			// 菜单栏
    			customToolbar: [
    				[{ header: [false, 1, 2, 3, 4, 5, 6] }],
    				["bold", "underline"],
    				[{ align: "" }, { align: "center" }, { align: "right" }, { align: "justify" }],
    				[{ list: "ordered" }, { list: "bullet" }, { list: "check" }],
    				[{ indent: "-1" }, { indent: "+1" }],
    				["color", "background"],
    				["link", "image", "video"]
    			],
    			// 调整图片大小和位置
    			customModulesForEditor: [
    				{ alias: "imageDrop", module: ImageDrop },
    				{ alias: "imageResize", module: ImageResize }
    			],
    			// 设置编辑器图片可拖拽
    			editorSettings: {
    				modules: { imageDrop: true, imageResize: {} }
    			}
    		};
    	},
    	mounted() {},
    	methods: {
    		// 自定义图片上传
    		handleImageAdded(file, Editor, cursorLocation, resetUploader) {
    			// 文件上传:$oss图片文件上传插件是自己封装的阿里云oss文件直传,此处代码自定义
    			this.$oss(file, file.name).then(url => {
    				if (!!url) {
    					Editor.insertEmbed(cursorLocation, "image", url);
    					resetUploader();
    				}
    			});
    		},
    		// 失去焦点
    		onEditorBlur(quill) {
    			this.$emit("update:rich-text", this.editorHtml);
    		}
    	}
    };
    </script>
    
    <style scoped>
    /* 处理添加视频链接标签位置 */
    .editor >>> .ql-snow .ql-tooltip {
    	top: 0 !important;
    	left: 40% !important;
    }
    </style>
    

    使用Editor组件

    <template>
    	<div class="home">
    		<el-card shadow="never">
    			<div slot="header" class="clearfix">
    				<h1>Editor 编辑器</h1>
    			</div>
    			<!-- 编辑器 -->
    			<Editor :defaultText="defaultText" :richText.sync="richText" />
    		</el-card>
    	</div>
    </template>
    
    <script>
    // 导入插件
    import Editor from "../components/Editor";
    
    export default {
    	name: "Home",
    	components: { Editor },
    	data() {
    		return {
    			defaultText: "",
    			richText: ""
    		};
    	}
    };
    </script>
    

    参考图:
    editor.png
    注意事项:
    当引入调整的图片的两个插件时,vue控制台会报无法找到Quill.jsvue2editor官方给的解决办法是基于webpack4.x的,如果报错,说明当前项目使用的webpack版本较高,现在的解决办法就是针对高版本webpack的即vue-cli版本>4.x。
    解决办法:
    修改vue.config.js文件,在文件顶部导出webpack模块,然后根据修改要求对webpack进行相应的调整和设置。代码如下:

    // webpack
    const webpack = require("webpack");
    // gzip
    
    module.exports = {
    	chainWebpack: config => {
    		// 压缩代码
    		config.optimization.minimize(true);
    		// 分割代码
    		config.optimization.splitChunks({ chunks: "all" });
    		// 用cdn方式引入
    		config.externals({
    			//vue: "Vue"
    		});
    		// Quill.js文件引入失败配置
    		config.plugin("provide").use(webpack.ProvidePlugin, [
    			{
    				"window.Quill": "quill/dist/quill.js",
    				Quill: "quill/dist/quill.js"
    			}
    		]);
    	}
    };
    

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

  • 相关阅读:
    如何锻炼出最牛程序员的编码套路
    如果仔细观察他们,你会发现他们时时都在锻炼
    单纯地每天埋头于工作并不能算是真正意义上的锻炼
    把全世界的人们都联系在一起,提升人们的社交参与度
    HTML5十五大新特性
    html5的八大特性
    【贪心】【二维偏序】【权值分块】bzoj1691 [Usaco2007 Dec]挑剔的美食家
    【分块】【链表】bzoj2738 矩阵乘法
    【分块】bzoj3343 教主的魔法
    【线段树】bzoj3747 [POI2015]Kinoman
  • 原文地址:https://www.cnblogs.com/zxk5211/p/13554787.html
Copyright © 2011-2022 走看看