首页 > 其他分享 >Vue组件封装:基于Vue3+wangeditor富文本组件二次封装

Vue组件封装:基于Vue3+wangeditor富文本组件二次封装

时间:2024-03-29 15:57:59浏览次数:12  
标签:Vue 封装 wangeditor content instance editor props 组件

1.简介

        开源 Web 富文本编辑器,开箱即用,配置简单。一个产品的价值,就在于解决用户的问题,提高效率、降低成本、增加稳定性和扩展性。wangEditor 不是为了做而做,也不是单纯的模仿谁,而是经过上述问题分析之后,给出一个系统的解决方案。旨在真正去解决用户的问题,产出自己的价值。更多资料见官网地址:https://www.wangeditor.com/。

2.安装

安装 editor

yarn add @wangeditor/editor
# 或者 npm install @wangeditor/editor --save

 安装 React 组件(可选)

yarn add @wangeditor/editor-for-react
# 或者 npm install @wangeditor/editor-for-react --save

 安装 Vue2 组件(可选)

yarn add @wangeditor/editor-for-vue
# 或者 npm install @wangeditor/editor-for-vue --save

 安装 Vue3 组件(可选)

yarn add @wangeditor/editor-for-vue@next
# 或者 npm install @wangeditor/editor-for-vue@next --save

 CDN

<!-- 引入 css -->
<link href="https://unpkg.com/@wangeditor/editor@latest/dist/css/style.css" rel="stylesheet">

<!-- 引入 js -->
<script src="https://unpkg.com/@wangeditor/editor@latest/dist/index.js"></script>
<script>
    var E = window.wangEditor; // 全局变量
</script>

 3.封装代码

 ./index.vue

 1 <template>
 2   <div class="v-rich-text">
 3     <div v-if="isSplitTool" :id="toolId" class="toolbar-container"></div>
 4     <div v-if="isSplitTool" :id="textId" class="text-container"></div>
 5     <div v-if="!isSplitTool" :id="textId"></div>
 6   </div>
 7 </template>
 8 
 9 <script lang="ts">
10 import { onMounted, onBeforeUnmount, ref, toRefs, watch } from "vue";
11 import WangEditor from "wangeditor";
12 import { basicProps } from "./props";
13 
14 export default {
15   name: "VRichText",
16   props: basicProps,
17   emits: ["change", "update:content"],
18   setup(props, { emit }) {
19     const { toolId, textId, content, isSplitTool } = toRefs(props);
20     let instance: any;
21     const textContent = ref(content.value);
22 
23     watch(
24       () => props.content,
25       (nv) => {
26         if (nv !== instance.txt.html()) {
27           instance.txt.html(nv);
28           textContent.value = nv;
29         }
30       }
31     );
32 
33     onMounted(() => {
34       if (isSplitTool.value) {
35         instance = new WangEditor("#" + toolId.value, "#" + textId.value);
36       } else {
37         instance = new WangEditor("#" + textId.value);
38       }
39       Object.assign(instance.config, {
40         uploadImgShowBase64: true,
41         showFullScreen: false,
42         zIndex: 100,
43         focus: false,
44         onchange() {
45           emit("update:content", instance.txt.html());
46           emit("change", instance.txt.html());
47         },
48 
49     onBeforeUnmount(() => {
50       instance.destroy();
51       instance = null;
52     });
53 
54     return {
55       toolId,
56       textId,
57       textContent,
58       isSplitTool,
59     };
60   },
61 };
62 </script>
63 
64 <style lang="scss" scoped>
65 .v-rich-text {
66   height: 100%;
67   display: flex;
68   flex-direction: column;
69 
70   .text-container {
71     flex: 1;
72     height: 0;
73   }
74 }
75 </style>
76 

  ./props.ts

 1 export const basicProps = {
 2   // 工具栏ID
 3   toolId: {
 4     type: String,
 5     default: "toolbar-container",
 6   },
 7   // 内容ID
 8   textId: {
 9     type: String,
10     default: "text-container",
11   },
12   // 富文本内容
13   content: String,
14   // 是否拆分tool栏
15   isSplitTool: {
16     type: Boolean,
17     default: true,
18   },
19 };

 

 4.组件展示

 

标签:Vue,封装,wangeditor,content,instance,editor,props,组件
From: https://www.cnblogs.com/bk-ajiang/p/18103999

相关文章

  • Storybook version8 智能化构建组件文档与单元测试
    根据官方文档说法,storybook是一个独立构建前端UI组件与页面的车间。StorybookisafrontendworkshopforbuildingUIcomponentsandpagesinisolation.Ithelpsyoudevelopandsharehard-to-reachstatesandedgecaseswithoutneedingtorunyourwholeapp.Th......
  • vue原理的实现
    vue的原理主要从三个方面进行说明,分别是响应式原理、虚拟DOM、模板编译和组件化响应式原理一个普通的JavaScript对象传入Vue实例作为data选项,Vue将遍历此对象所有的property,并使用Object.defineProperty把这些property全部转为getter/setter。这些getter/setter......
  • 14-前端工程化-Vue项目
      这里,我首先安装了一个nvm(node的版本管理工具),可以通过nvm管理多个版本的node.js,解决node.js各种版本存在不兼容的问题参考链接:nvm、node、vue安装教程_nvm安装vue_南柯ღk的博客-CSDN博客1)安装nvm Github的官方安装网址:https://github.com/coreybutler/nvm-windows/rel......
  • vue2当中使用svg
    1、引入依赖npminstall  svg-sprite-loader-D2、在src文件夹下新建文件夹存放svg图 3、封装公共svg组件 3、全局注册使用(避免使用时还需要再去引入封装的svg组件) 4、在vue.config.js当中增加svg配置 5、使用用例 ......
  • 聊聊vue中的vue中的slot与slot-scope
    前言:vue中关于插槽的文档说明很短,语言又写的很凝练,再加上其和methods,data,computed等常用选项使用频率、使用先后上的差别,这就有可能造成初次接触插槽的开发者容易产生“算了吧,回头再学,反正已经可以写基础组件了”,于是就关闭了vue说明文档。实际上,插槽的概念很简单,下面......
  • React组件封装:文字、表情评论框
    1.需求描述根据项目需求,采用Antd组件库需要封装一个评论框,具有以下功能:支持文字输入支持常用表情包选择支持发布评论支持自定义表情包2.封装代码 ./InputComment.tsx1importReact,{useState,useRef,useEffect,forwardRef,useImperativeHandle}from'r......
  • 基于Java+Vue的企业采购系统(供应商、询价、招投标)(附文档+源码)
      前言:供应商招投标管理系统是一个综合性的管理平台,旨在规范供应商的招投标流程,确保采购过程的透明度和公正性,同时提高采购效率。以下是对您提到的各个环节的详细解释:一、供应商准入供应商准入是招投标管理系统的首要环节,它负责审核和管理潜在供应商的资质。具体流程包括......
  • 一个vue3指令,兼容pc与移动端的拖动tab切换,鼠标拖动与触摸拖动触控监听
    <Viewclass="app-tabs-container":class="{appear:state.showTabsTrans}"v-tabs-pointer-event:[state.hasMove]="handleProductChange"><router-viewv-slot="{Component}"><KeepAlive>......
  • Pinia及其优化:Vue状态管理的解决方案
    pinia及其优化目录1.pinia状态管理库2.pinia的使用步骤2.1安装2.2使用pinia2.3定义store2.4使用store3.axios请求拦截器(优化pinia)3.1问题缘由3.2优化方法4.Pinia持久化插件-persist4.1安装4.2使用1.pinia状态管理库Pinia是Vue的专属状态管理库,它......
  • Vue:实现子组件和父组件数据的双向绑定案例和sync修饰符简化
    实现子组件和父组件数据的双向绑定(实现App.vue中的selectId和子组件选中的数据进行双向绑定)代码案例BaseSelect.vue<template><div><select:value="selectId"@change="selectCity"><optionvalue="101">北京</option><op......