用来用去还是用回了ueditor-Vue富文本编辑器二次扩展

用来用去还是用回了ueditor-Vue富文本编辑器二次扩展。我们使用用过UEditor、TinyMCE、CKEditor、wangEditor、Tiptap、Quill项目经历过多次富文本的编辑器的选型使用,发现现在新的富文本编辑总感觉还是没达到我们的要求,果然改回了ueditor。

UEditor 是由百度WEB前端研发部开发的一款所见即所得的开源富文本编辑器。它具有轻量、可定制、用户体验优秀等特点,并且基于MIT开源协议(也有说法是基于BSD协议),所有源代码在协议允许范围内可自由修改和使用。UEditor的推出,有效降低了网站开发者的开发成本,节约了他们在开发富文本编辑器方面所需的大量时间。

一、系统特点
分层架构设计:UEditor在设计上采用了经典的分层架构设计理念,包括核心层、命令插件层和UI层,以实现功能层次之间的轻度耦合。
核心层:提供编辑器底层的方法和概念,如DOM树操作、Selection、Range等。
命令插件层:所有的功能型实现都通过这一层中的命令和插件来完成,各个命令和插件之间基本互不耦合,方便定制与扩展。
UI层:与核心层和命令插件层几乎完全解耦,简单的配置即可为编辑器在界面上添加额外的UI元素和功能。
二、优点
体积小巧,性能优良:UEditor在保证功能全面的同时,尽量减少了体积,提升了性能。
使用简单:对于开发者来说,UEditor易于上手,可以快速集成到项目中。
多浏览器支持:支持Mozilla、MSIE、FireFox、Maxthon、Safari和Chrome等多种浏览器。
丰富完善的中文文档:为开发者提供了详尽的中文文档,方便学习和使用。

vue-ueditor-wrap 是一个Vue组件,它封装了UEditor(百度富文本编辑器)以便更容易地在Vue项目中集成和使用。UEditor是一个功能强大的富文本编辑器,但直接将其集成到Vue项目中可能会遇到一些兼容性和维护性的问题,而vue-ueditor-wrap正是为了解决这些问题而设计的。

如何使用 vue-ueditor-wrap

  1. 安装

    首先,你需要通过npm或yarn来安装vue-ueditor-wrap。打开你的终端或命令提示符,然后运行以下命令之一:

    bash复制代码

    npm install vue-ueditor-wrap --save

    或者

    bash复制代码

    yarn add vue-ueditor-wrap
  2. 扩展组件

    接下来,在你的Vue组件中引入vue-ueditor-wrap。

     

    <template><div style="border: 1px solid #ccc"><vue-ueditor-wrapv-model="data":config="editorConfig":editorDependencies="['ueditor.config.js', 'ueditor.all.js']"ref="editorRef"></vue-ueditor-wrap><diy-storage ref="storageImg" style="display: none" @confirm="getAttachmentFileList"></diy-storage><diy-storageref="storageVideo"type="video"accept=".rm,.rmvb,.wmv,.avi,.mpg,.mpeg,.mp4"style="display: none"@confirm="getAttachmentVideoFileList"></diy-storage></div>
    </template><script setup name="DiyEditor">
    import { ref } from 'vue';
    import { VueUeditorWrap } from 'vue-ueditor-wrap';
    import { useVModel } from '@vueuse/core';
    import DiyStorage from '@/components/upload/storage.vue';
    import { Session } from '@/utils/storage';
    const editorRef = ref();
    const storageImg = ref(null);
    const storageVideo = ref(null);const props = defineProps({modelValue: {type: String,default: '',},height: {type: Number,default: 300,},
    });const emit = defineEmits(['update:modelValue', 'handleBlur']);
    const data = useVModel(props, 'modelValue', emit);const serverHeaders = {Authorization: Session.get('token'),
    };
    const editorConfig = ref({debug: false,UEDITOR_HOME_URL: import.meta.env.MODE == 'development' ? '/public/ueditor/' : import.meta.env.VITE_BUILD_DIR + '/ueditor/',serverUrl: (process.env.NODE_ENV === 'production' ? '' : '/api') + '/sys/storage/upload',serverHeaders,// 编辑器不自动被内容撑高autoHeightEnabled: false,// 初始容器高度initialFrameHeight: props.height,// 初始容器宽度initialFrameWidth: '100%',toolbarCallback: function (cmd, editor) {editorRef.value = editor;if (cmd == 'insertimage') {storageImg.value.handleStorageDlg('', '上传图片');return true;} else if (cmd == 'insertvideo') {storageVideo.value.handleStorageDlg('', '上传视频');return true;}},
    });const getAttachmentFileList = (files) => {if (!files.length) {return;}files.forEach((element) => {editorRef.value?.execCommand('insertHtml', "<img src='" + element.url + "'/>");});
    };const getAttachmentVideoFileList = (files) => {if (!files.length) {return;}files.forEach((element) => {editorRef.value?.execCommand('insertHtml', "<video src='" + element.url + "'/>");});
    };
    </script>
    

    注意:v-model用于双向绑定编辑器的内容,config属性用于传递UEditor的配置选项。

  3. 配置UEditor

    你可以通过:config属性向vue-ueditor-wrap传递UEditor的配置选项。这些选项会直接影响编辑器的行为和外观。UEditor提供了大量的配置项,你可以根据自己的需求进行调整。

  4. 注意事项

    • 确保你已经按照vue-ueditor-wrap的文档和UEditor的官方文档正确配置了编辑器。
    • 如果你在Vue CLI项目中工作,可能需要处理静态资源(如UEditor的JS和CSS文件)的路径问题。
    • vue-ueditor-wrap可能会随着版本的更新而发生变化,因此建议查阅最新的文档和更新日志。
  5. 调试和测试

    在集成vue-ueditor-wrap之后,你应该在多个浏览器和设备上测试你的Vue应用,以确保编辑器能够正常工作并且符合你的要求。

  6. 组件调用实现

<template><div class="container"><div class="flex diygw-col-24"><el-form-item prop="editor" class="diygw-el-rate" label="多行输入" label-width="80px"><diy-editor v-model="editor"></diy-editor></el-form-item></div><div class="clearfix"></div></div>
</template><script>import { useRouter, useRoute } from 'vue-router';import { storeToRefs } from 'pinia';import { useUserInfo } from '@/stores/userInfo';import { ElMessageBox, ElMessage } from 'element-plus';import DiyEditor from '@/components/editor/index.vue';export default {components: {DiyEditor},data() {return {globalOption: {},userInfo: {},roleDatas: {rows: [{status: '',flag: '',remark: '',roleId: 0,roleName: '',roleKey: '',dataScope: '',roleSort: 0,createTime: '',updateTime: '',deleteTime: null,userId: null,updateUserId: null}],total: 0,code: 0,msg: ''},editor: ''};},methods: {getParamData(e, row) {row = row || {};let dataset = e.currentTarget ? e.currentTarget.dataset : e;if (row) {dataset = Object.assign(dataset, row);}return dataset;},navigateTo(e, row) {let dataset = this.getParamData(e, row);let { type } = dataset;if (type == 'page' || type == 'inner' || type == 'href') {this.router.push({path: dataset.url,query: dataset});} else if (typeof this[type] == 'function') {this[type](dataset);} else {ElMessage.error('待实现点击事件');}},async init() {},// 新增接口 API请求方法async roleDatasApi(param, data) {param = param || {};param = this.getParamData(param);let http_url = '/sys/role/all';let http_data = {tt: param.tt || '1',te: param.te || this.t523 || '123'};let http_header = {'Content-Type': 'application/json','Content-Length': '123'};let roleDatas = await this.$http.post(http_url, http_data, http_header, 'json');this.roleDatas = roleDatas;}},async mounted() {this.router = useRouter();this.globalOption = useRoute().query;const stores = useUserInfo();const { userInfos } = storeToRefs(stores);this.userInfo = userInfos;await this.init();},beforeUnmount() {}};
</script><style lang="scss" scoped>.container {font-size: 12px;}
</style>

通过使用vue-ueditor-wrap,你可以轻松地将UEditor集成到你的Vue项目中,从而为用户提供一个功能丰富的文本编辑体验。

 扩展组件代码已开源至https://gitee.com/diygw/diygw-ui-admin

大家可以前往下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143124.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

PMP与CMMI:两种管理方法的对比

PMP与CMMI&#xff1a;两种管理方法的对比 PMP&#xff1a;专注于项目管理CMMI&#xff1a;组织过程改进的框架总结&#xff1a;互补而非替代 在现代企业管理中&#xff0c;项目管理和组织能力成熟度模型集成&#xff08;CMMI&#xff09;是两个经常被提及的概念。虽然它们都是…

java线程池编程示例

程序功能 这段代码展示了如何使用 Java 线程池 来并发执行多个任务。通过创建一个固定大小为 3 的线程池&#xff0c;程序提交了 5 个任务&#xff0c;并让线程池中的线程并发处理这些任务。每个任务模拟了一个耗时操作&#xff0c;最后程序等待所有任务完成后关闭线程池。 …

『功能项目』按G键持续显示对话内容【61】

本章项目成果展示 我们打开上一篇60靠近Npc显示可对话标识的项目&#xff0c; 本章要做的事情是当靠近Npc按G键显示内容后&#xff0c;再按G键实现两个人的对话显示功能 首先将以下资源图片放进Art文件夹中并设置为精灵模式 在桌面上创建一个文本 讲一下对话内容复制到文本中 …

day22JS-npm中的部分插件使用方法

1. 静态资源目录 静态资源目录就是访问服务器的某些路劲时候&#xff0c;服务器可以吐出一个写好的指定页面。 实现思路&#xff1a; 1、先判断要找的路径是否是文件&#xff0c;如果是文件&#xff0c;就加载发给对方。 2、如果是文件夹&#xff0c;找到这个文件夹所在路径中…

『功能项目』窗口可拖拽脚本【59】

本章项目成果展示 我们打开上一篇58第三职业弓弩的平A的项目&#xff0c; 本章要做的事情是给坐骑界面挂载一个脚本让其显示出来的时候可以进行拖拽 创建脚本&#xff1a;DraggableWindow.cs using UnityEngine; using UnityEngine.EventSystems; public class DraggableWindo…

Tesseract:在线高性能表结构变更方法(VLDB23)

文章目录 背景表结构变更的必要性现有技术的不足Tesseract&#xff08;超立方体&#xff09;&#xff1a;一种在MVCC系统中支持非阻塞、事务性的表结构变更的方法动机 基础的DDaM&#xff08;被作为数据修改的数据定义&#xff09;对DDL操作的分类的两个维度表结构版本&#xf…

探索未来游戏边界:AI驱动的开放世界RPG引擎与UGC平台

在游戏产业的浩瀚星空中,一项革命性的技术正悄然升起,它不仅重塑了游戏开发的传统模式,更将玩家的创造力推向了前所未有的高度。今天,让我们一同走进这个由AI驱动的开放世界RPG游戏引擎与UGC(用户生成内容)平台的奇幻世界,探索其背后的无限可能。 产品定位:AI赋能,重…

信息安全工程师(8)网络新安全目标与功能

前言 网络新安全目标与功能在当前的互联网环境中显得尤为重要&#xff0c;它们不仅反映了网络安全领域的最新发展趋势&#xff0c;也体现了对网络信息系统保护的不断加强。 一、网络新安全目标 全面防护与动态应对&#xff1a; 目标&#xff1a;建立多层次、全方位的网络安全防…

《沈阳体育学院学报》

《沈阳体育学院学报》创刊于1982年&#xff0c;是由沈阳体育学院主办&#xff0c;面向国内外公开发行的体育类学术期刊&#xff1b;国际标准刊号为ISSN 1004-0560&#xff0c;国内刊号为CN 21-1081/G8&#xff1b;双月刊&#xff0c;单月中旬出版。 《沈阳体育学院学报》是中文…

使用CUBE_MX使用I2C通信,实现对EEPROM的读写

一、使用CUBE_MX配置 1.配置I2C 2.配置USART1 3.重中之重(在KEIL5打开串口使用的库) 二、KEIL5配置 #include "main.h" #include "i2c.h" #include "gpio.h" #include "usart.h"#include <stdio.h>void SystemClock_Config(vo…

【他山之石】优化 JavaScript 的乐趣与价值(上)

前言 这是前几天偶然看到的一篇硬核推文。作者一口气分了 12 个主题探讨了 JavaScript 在优化时应该注意的要点&#xff0c;读后深受启发。由于篇幅较长&#xff0c;分两篇发表。本篇为上篇。 文章目录 Optimizing Javascript for fun and for profit0. Avoid work1. Avoid str…

苍穹外卖Day01-2

导入接口文档 yApi接口管理平台http://api.doc.jiyou-tech.com/ 创建项目 导入接口文件 导入结果界面 Swagger 介绍 使用Swagger你只需要按照它的规范去定义接口及接口相关的信息&#xff0c;就可以做到生成接口文档&#xff0c;以及在线接口调试页面。 官网&#xff1a;ht…

redis群集三种模式:主从复制、哨兵、集群

redis群集有三种模式 redis群集有三种模式&#xff0c;分别是主从同步/复制、哨兵模式、Cluster&#xff0c;下面会讲解一下三种模式的工作方式&#xff0c;以及如何搭建cluster群集 ●主从复制&#xff1a;主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制…

【运行】错误分析error: stray ‘\302’ 和 error: stray ‘\240’

您遇到的编译错误主要是由于代码中出现了不受支持的字符&#xff0c;例如 UTF-8 编码下的不可见字符。这通常是由于在代码中使用了特定的空格或格式化字符。 错误分析 error: stray ‘\302’ 和 error: stray ‘\240’ 提示您在文件中发现了无法识别的字符&#xff0c;通常是因…

常耀斌:AI赋能企业数字化转型(清华社发行)

新书地址&#xff1a; 清华出版社&#xff1a;清华大学出版社-图书详情-《AI赋能企业数字化转型》 京东&#xff1a;《AI赋能企业数字化转型 常耀斌 清华大学出版社 9787302669081》【摘要 书评 试读】- 京东图书 内容简介&#xff1a; 在数字经济时代&#xff0c;企业发…

VMware Tools系列三:图解安装完成VMware Tools测试

一、 VMware Tools测试安装是否成功 1. 菜单项检查 VMware Tools 是否已安装&#xff1a; 在 VMware Workstation 中&#xff0c;查看虚拟机的菜单栏&#xff0c;通常在“虚拟机”菜单下会有“重新安装 VMware Tools”的选项&#xff0c;说明 VMware Tools 已经安装。如图所示…

网络设备登录——《路由与交换技术》实验报告

目录 一、实验目的 二、实验设备和环境 三、实验记录 1.通过 Console 登录 步骤1:连接配置电缆。 步骤2:启动PC,运行超级终端。 步骤3:进入Console 配置界面 2.通过 Telnet 登录 步骤1:通过 Console 接口配置 Telnet 用户。 步骤2:配置 super 口令 步骤3:配置登录欢迎…

动手学深度学习(pytorch)学习记录31-批量规范化(batch normalization)[学习记录]

目录 批量规范化&#xff08;batch normalization&#xff09;从头开始实现一个具有张量的批量规范化层简明实现 批量规范化&#xff08;batch normalization&#xff09; 可持续加速深层网络的的收敛速度。再结合残差块&#xff0c;批量规范化使得研究人员可以训练100层以上的…

Java项目实战II基于Java+Spring Boot+MySQL的校园社团信息管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在当今高校…

回归预测|2024年2月最新优化算法角蜥优化HLOA|基于角蜥优化BP神经网络数据回归Matlab程序HLOA-BP【优化效果好】

回归预测|2024年2月最新优化算法角蜥优化HLOA|基于角蜥优化BP神经网络数据回归Matlab程序HLOA-BP【优化效果好】 文章目录 一、基本原理1. 角蜥优化算法&#xff08;HLOA&#xff09;简介2. BP 神经网络&#xff08;BP Neural Network&#xff09;简介3. HLOA-BP 回归预测流程总…