vue3+ts+wangEditor5菜单栏添加自定义图标按钮,自定义弹出界面内容,自定义插入链接 五步走

news2024/11/13 15:01:13

Wangeditor安装:VUE3的安装 ,其它看官网:

npm install @wangeditor/editor --save

npm install @wangeditor/editor-for-vue@next --save

官网:优势 | wangEditor

官方插入自定义内容样例:

https://github.com/wangeditor-team/wangEditor/blob/master/packages/basic-modules/src/modules/link/menu/InsertLink.ts

官方上传附件样例:

GitHub - wangeditor-team/wangEditor-plugin-upload-attachment: wangEditor upload-attachments plugin

参考链接:

wangEditor编辑器在vue使用并自定义菜单功能_wangeditor自定义菜单_陈Joys的博客-CSDN博客

效果图

 

1,定义类:在最复杂的弹出片定义菜单界面为例

import { IDomEditor, IModalMenu, SlateNode } from '@wangeditor/editor'

import { DOMElement } from '@wangeditor/editor/dist/editor/src/utils/dom'

import { shallowRef } from 'vue'

export class BigFileUploadMenu implements IModalMenu {    // TS 语法

    title: string;

    tag: string;

    showModal: boolean;

    modalWidth: number;

    iconSvg: string;

    constructor() {

        this.title = '大文件上传' //按钮文本

        //菜单栏图标

        this.iconSvg = '<svg viewBox="0 0 1024 1024"><path d="M960 896H64A64 64 0 0 1 0 832v-341.321143c0-35.364571 28.672-64 64-64h896a64 64 0 0 1 64 64V832A64 64 0 0 1 960 896z m-21.321143-85.321143V512H85.321143V810.678857h853.357714zM469.321143 341.321143a42.678857 42.678857 0 0 0 5.010286-85.028572l-5.010286-0.292571h-384v-298.678857h384c21.650286 0 39.862857-16.164571 42.386286-37.668572l0.292571-4.973714c0-21.650286-16.201143-39.862857-37.668571-42.386286l-5.010286-0.292571H64a64 64 0 0 0-63.707429 57.856L0-64v341.321143a64 64 0 0 0 57.856 63.707428l6.144 0.292572h405.321143z m234.678857-256a64 64 0 1 1 128 0 64 64 0 0 1-128 0z m184.978286 213.357714h-241.956572l-119.954285-213.357714L647.021714-128h241.956572l119.954285 213.321143-119.954285 213.357714z m-49.956572-85.357714l72.009143-128-72.045714-128h-142.006857l-72.045715 128 71.972572 128h142.116571z m-604.342857 512h42.642286c14.262857 0 21.357714-7.094857 21.357714-21.321143v-85.321143c0-14.262857-7.131429-21.357714-21.357714-21.357714H234.678857c-14.262857 0-21.357714 7.131429-21.357714 21.357714V704c0 14.226286 7.131429 21.321143 21.357714 21.321143z m0-554.642286h42.642286c14.262857 0 21.357714-7.131429 21.357714-21.357714v-85.321143c0-14.226286-7.131429-21.321143-21.357714-21.321143H234.678857c-14.262857 0-21.357714 7.094857-21.357714 21.321143v85.321143c0 14.262857 7.131429 21.357714 21.357714 21.357714z m170.642286 554.642286h42.678857c14.226286 0 21.321143-7.094857 21.321143-21.321143v-85.321143c0-14.262857-7.094857-21.357714-21.321143-21.357714h-42.678857c-14.226286 0-21.321143 7.131429-21.321143 21.357714V704c0 14.226286 7.094857 21.321143 21.321143 21.321143z m0-554.642286h42.678857c14.226286 0 21.321143-7.131429 21.321143-21.357714v-85.321143c0-14.226286-7.094857-21.321143-21.321143-21.321143h-42.678857c-14.226286 0-21.321143 7.094857-21.321143 21.321143v85.321143c0 14.262857 7.094857 21.357714 21.321143 21.357714z"></path></svg>' // 可选

        this.tag = 'button'

        this.showModal = true

        this.modalWidth = 800 //弹出框宽度

    }

    // 菜单是否需要激活(如选中加粗文本,加粗菜单会激活),用不到则返回 false

    isActive(editor: IDomEditor): boolean {    // TS 语法

        // isActive(editor) {                      // JS 语法

        return false

    }

    // 获取菜单执行时的 value ,用不到则返回空 字符串或 false

    getValue(editor: IDomEditor): string | boolean {    // TS 语法

        // getValue(editor) {                               // JS 语法

        return ''

    }

    // 菜单是否需要禁用(如选中 H1 引用菜单被禁用),用不到则返回 false

    isDisabled(editor: IDomEditor): boolean {   // TS 语法

        // isDisabled(editor) {                     // JS 语法

        return false

    }

    // 点击菜单时触发的函数

    exec(editor: IDomEditor, value: string) {   // TS 语法

        editor.insertText(value) // value this.value(editor) 的返回值

    }

    // 弹出框 modal 的定位:1. 返回某一个 SlateNode 2. 返回 null (根据当前选区自动定位)

    getModalPositionNode(editor: IDomEditor): SlateNode | null {  // TS 语法

        // getModalPositionNode(editor) {                             // JS 语法

        return null // modal 依据选区定位

    }

    //定义 modal 内部的 DOM Element

    getModalContentElem(editor: IDomEditor): DOMElement {   // TS 语法

        //这里面的内容除了编辑器里面的函数其它全是html+css动态创建标签,可以任意发挥自己的动手能力

const $content = document.createElement("div");

        const updatabutton1 = document.createElement("button");

        const h2 = document.createElement("h2");

        const updatabutton = document.createElement("button");

        const file1 = document.createElement("imput");

        h2.innerText = "大文件上传";

        updatabutton.innerText = "上传";

        updatabutton1.innerText = "上传1";

        $content.appendChild(h2);

        $content.appendChild(file1);

        $content.appendChild(updatabutton);

        $content.appendChild(updatabutton1);

        //点击后删除事件

        function uploadBtnEvent() {

            editor.focus();//先获得焦点,再插入,就能成功

            editor.dangerouslyInsertHtml("<a href='#'>百度</a>", true);;

            editor.hidePanelOrModal();

        }

        //添加事件

        updatabutton.addEventListener('click', uploadBtnEvent)

        return $content

    }

}

2,引用类

import { BigFileUploadMenu } from './components/BigFileMenu'

3,定义按钮变量

const BigFileUploadMenuButton = {

  key: 'BigFileUploadMenu', // 定义 menu key :要保证唯一、不重复(重要)

  factory() {

    return new BigFileUploadMenu() // `YourMenuClass` 替换为你菜单的 class

  },

}

4,注册到菜单

//4,注册到菜单

Boot.registerMenu(BigFileUploadMenuButton)

5,在菜单中显示按钮

const toolbarConfig = {

  toolbarKeys: [

    ………………

    "BigFileUploadMenu",//用按钮定义里面的key值

    "fullScreen"

  ]

}

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

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

相关文章

XDP入门体验之hello world

本文目录 1、下面这二张图&#xff0c;能非常好的说明XDP在Linux内核里的网络数据处理架构上的位置。2、XDP提供了可编程的灵活处理方式&#xff0c;XDP 程序可以通过 XDP action code来指定驱动程序对报文的后续处理方式&#xff1a;3、一个将收到的报文在XDP里直接丢弃的例子…

一款IP合并和分解工具

一&#xff1a;需求说明 近期在工作中有个需求&#xff0c;需要将七千多个ip地址&#xff08;有的带掩码&#xff0c;有的不带掩码&#xff09;进行合并尝试&#xff0c;看能不能通过合并减少ip的条目数。这就涉及到ip和掩码的计算&#xff0c;举例如下: 192.168.1.0/25 192.16…

第四章 matlab的循环结构

循环(loop)是一种 matlab 结构,它允许我们多次执行一系列的语句。循环结构有两种 基本形式:while 循环和 for 循环。两者之间的最大不同在于代码的重复是如何控制的。在 while 循环中,代码的重复的次数是不能确定的,只要满足用户定义的条件,重复就进行下 去。相对地,在 fo…

前端uniapp+后端springboot 详细教程《实现微信小程序授权登录》(附完整前后端项目demo)

实现微信小程序授权登录 1、前端技术栈1.1、uniapp1.2、前端封装工具1.3、Hbuilderx构建uniapp项目 2、后端技术栈2.1、创建springboot后端项目2.2、数据库准备2.3、创建实体类2.4、后端工具类2.5、mapper和service接口2.5、Service实现类2.6、微信用户的控制层Controller 微信…

怎么将png转jpg在线处理?图片转换格式工具分享

做设计的小伙伴经常需要进行图片格式转换&#xff0c;但是下载安装软件比较耗费时间&#xff0c;操作起来也很不方便&#xff0c;今天就来介绍一个在线格式转换的方法&#xff0c;下面以png转jpg在线&#xff08;https://www.yasuotu.com/geshi&#xff09;处理为例子给大家演示…

基本的排序算法

一、插入排序 基本思想&#xff1a;在待排序的元素中&#xff0c;假设前面n-1(其中n>2)个数已经是排好顺序的&#xff0c;现将第n个数插到前面已经排好的序列中&#xff0c;然后找到合适自己的位置&#xff0c;使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素…

JVM内存模型概述

当谈到Java虚拟机&#xff08;JVM&#xff09;的内存模型时&#xff0c;我们需要了解JVM如何管理内存并执行Java应用程序。理解JVM的内存模型对于编写高效、可靠的Java代码至关重要。本文将介绍JVM的内存模型&#xff0c;并通过图示进行说明。 JVM内存模型概述 JVM内存模型定义…

5年自动化测试经验的一些感悟—愿测试进阶路上的你不在迷茫

作为一个测试人&#xff0c;我们或多或少都听过或用过自动化&#xff0c;我们都曾在初入测试行业时&#xff0c;满怀期待的以为测试的尽头是不用测试员点点了&#xff0c;项目一提测&#xff0c;小手点下自动化的开关&#xff0c;瞬间测试的工作就完成了。 这就是我一开始从开…

Python-增加b站视频播放量

前言 本文是该专栏的第1篇&#xff0c;后面会持续更新对应平台干货知识&#xff0c;记得关注。 需求背景和说明&#xff1a;实现获取真实播放量&#xff0c;以及增加播放量 废话不多说&#xff0c;跟着笔者直接往下看正文&#xff0c;在文中将结合代码进行详细说明。&#xf…

【数据结构】从数据结构角度深入探究队列

队列是计算机科学中的一种基本数据结构&#xff0c;用于存储和管理数据。在计算机程序中&#xff0c;队列被广泛应用于任务调度、进程管理等场景。本文将介绍队列的概念、特点、常见操作以及应用。 文章目录 队列的概念队列的应用队列的存储结构队列接口的实现队列的初始化队尾…

plt.plot(x,y,color,linestyle,marker)函数参数详解

一、plt.plot()函数详解 plt.plot()函数是matplotlib库中用于绘制线条图的函数&#xff0c;它有多个参数可以控制绘图的各个方面。以下是常用的一些参数及其作用&#xff1a; x: x轴数据的列表或数组y: y轴数据的列表或数组linewidth: 线条的宽度&#xff0c;从0到无穷大的浮…

( 动态规划) 115. 不同的子序列 ——【Leetcode每日一题】

❓115. 不同的子序列 难度&#xff1a;困难 给你两个字符串 s 和 t &#xff0c;统计并返回在 s 的 子序列 中 t 出现的个数。 题目数据保证答案符合 32 位带符号整数范围。 示例 1&#xff1a; 输入&#xff1a;s “rabbbit”, t “rabbit” 输出&#xff1a;3 解释&…

智能变电站远程监控解决方案

智能变电站远程监控解决方案 一、项目背景 变电站是改变电压、控制和分配电能的场所&#xff0c;为了加强对变电站的监管力度&#xff0c;抓好供电作业的动态管理&#xff0c;及时、实时的掌握变电站的安全隐患的整改消除情况&#xff0c;确保安全生产贯穿于供电的全过程&…

如何禁用烦人的“insert”键

在我们日常的电脑使用中&#xff0c;有些按键可能会让我们感到非常烦恼&#xff0c;其中最常见的就是“insert”键。这个键位于键盘的右上角&#xff0c;通常会在我们不经意间被按下&#xff0c;导致我们的输入出现了一些奇怪的问题。如果你也曾经遇到过这个问题&#xff0c;那…

在网络安全领域中,主要有哪些技术方向?

入门Web安全、安卓安全、二进制安全、工控安全还是智能硬件安全等等&#xff0c;每个不同的领域要掌握的技能也不同。 当然入门Web安全相对难度较低&#xff0c;也是很多人的首选。主要还是看自己的兴趣方向吧。 本文就以下几个问题来说明网络安全大致学习过程&#x1f447; 网…

Vue3项目初始配置(更新中ing)

文章目录 别名路径联想配置方法 element plus按需引入并使用风格定制 eslint文件名不强制检测编辑.eslintrc.cjs 别名路径联想 在编写代码的过程中&#xff0c;一旦 输入 / , VSCode会立刻 联想出src下的所有子目录和文件, 统一文件路径访问不容易出 配置方法 在项目的根目…

相亲交友App开发解决方案及功能框架

相亲APP开发功能 1、注册登录&#xff1a;相亲APP开发平台是一款真实的交友软件&#xff0c;所以需要用户提交身份信息进行注册认证&#xff0c;也是为了保障用户的安全! 2、搜索功能&#xff1a;在线、新注册、距离近、同城老乡、星族速配等&#xff0c;都可以在相亲APP内进行…

详解GitHub

详解GitHub 什么是GitHub&#xff1f;GitHub能干什么&#xff1f;1.托管代码、历史版本管理2.搜索开源项目3.分享的同时会得到社区的回馈4.使用Github Pages服务&#xff0c;你可以免费搭建一个博客网站5.学习&#xff0c;能力提升6.提升自己的影响力 GitHub和Git的关系与区别敲…

MySQL基础(三十八)数据库备份与恢复

1 物理备份与逻辑备份 物理备份&#xff1a;备份数据文件&#xff0c;转储数据库物理文件到某一目录。物理备份恢复速度比较快&#xff0c;但占用空间比较大&#xff0c;MySQL中可以用 xtrabackup 工具来进行物理备份。 逻辑备份&#xff1a;对数据库对象利用工具进行导出工作…

Android如何自定义输入文本对话框?

文章目录 0.引言1.创建示例工程2.输入文本对话框布局和功能设计3.主程序调用输入文本对话框 0.引言 笔者研究的课题涉及到安卓软件开发&#xff0c;在开发过程中&#xff0c;发现普通的显示消息对话框一般可以调用android自带包实现&#xff0c;而要通过文本框输入交互&#xf…