wangEditor富文本插入自定义应用

devtools/2024/11/30 20:31:46/

文章目录

  • 前言
  • Modal插入富文本应用
    • 注册新菜单
    • 在自定义Modal操作Editor实例


前言

最近在业务中被要求用到了富文本的需求,经过调研最终决定使用国产的 wangeditor ,需要在富文本菜单里插入自己的外部应用,本文旨在记录。


Modal插入富文本应用

参考链接官方issue的一篇帖子: modalMenu方案

注册新菜单

ModalMenu的使用需要在内部定义元素,使代码糅合,业务代码与富文本代码不可分离(参考: 官方文档-自定义拓展功能)
所以使用menu栏上的按钮唤起新弹框,因此要注册个ButtonMenu

定义菜单class

import ReactDOM from "react-dom";
import YourModalMenu from "./YourModalMenu";export default class ModalMenu {id = `modal-${Math.random().toString(36).slice(2)}`;title;tag;$ele;ifInit = false;controlShow;constructor() {this.title = '应用';this.iconSvg = `svg`; // 这里是你自己的svgthis.tag = 'button';this.$ele = document.createElement('div');this.$ele.id = this.id;document.body.appendChild(this.$ele);// super();}getValue(editor) {console.log('getValue--------')return <YourModalMenu onInit={this.modalInit} editor={editor} />}modalInit = (method) => {console.log('modalInit----', method)// 这里把控制react的  方法透出this.controlShow = method;}isActive(editor) {return false // or false}isDisabled(editor) {return false // or true}exec(editor, value) {console.log('exec--------', editor, value, this.ifInit)if (this.ifInit) {this.controlShow(true);return;}ReactDOM.render(value, this.$ele);this.ifInit = true;}
}
  • 在react-dom中,通过ReactDOM.render(ele, container)将指定元素(ele)渲染到目标容器(container)上
  • 在打开新菜单时,将首先执行getValue(),在此处将editor实例传给自定义的modal;随后在exec()中将自定义的modal渲染到div容器上

新菜单到处并插入到工具栏

// 导出
export const customModalButton = {key: 'customModalButton',factory() {return new ModalMenu()}
}

在主文件里注册

import { Boot, DomEditor } from '@wangeditor/editor'
import { myModalMenuConf } from './customModalButton'Boot.registerMenu(customModalButton)
// 工具栏配置
const toolbarConfig = {insertKeys: {index: -1, // 菜单位置keys: ['customModalButton'], // show menu in toolbar}
}
  • 菜单注册时机toolbarConfig需要放在最外层,即主函数之外,否则会报错:Uncaught (in promise) Error: Duplicated key ‘xxx’ in menu items

在自定义Modal操作Editor实例

做一个简单应用:记录光标所在富文本的位置,在此处插入后端返回的应用

    const node = {type: 'link', url: 'javascript:void(0);', children: [{ text: AppName, bold: true, clolor: '#eb903a' }]}const iconNode = {type: 'image', src: serviceAppIcon, style: {width: '28px', height: '28px'},children: [{ text: app.AppName, bold: true, clolor: '#eb903a' }]}selectionRef.current && editor.select(selectionRef.current)const nodeList = [iconNode, node ]editor.insertNode(nodeList)

效果

在这里插入图片描述


http://www.ppmy.cn/devtools/138283.html

相关文章

深度学习模型:门控循环单元(GRU)详解

本文深入探讨了门控循环单元&#xff08;GRU&#xff09;&#xff0c;它是一种简化版的长短期记忆网络&#xff08;LSTM&#xff09;&#xff0c;在处理序列数据方面表现出色。文章详细介绍了 GRU 的基本原理、与 LSTM 的对比、在不同领域的应用以及相关的代码实现&#xff0c;…

qt QStyle详解

1、概述 QStyle是Qt框架中用于自定义和绘制控件样式的一个核心类。它提供了一套丰富的API&#xff0c;允许开发者根据应用程序的需求和平台的视觉风格&#xff0c;自定义控件的外观和行为。QStyle的主要职责是处理控件的绘制&#xff08;painting&#xff09;和布局&#xff0…

图论入门编程

卡码网刷题链接&#xff1a;98. 所有可达路径 一、题目简述 二、编程demo 方法①邻接矩阵 from collections import defaultdict #简历邻接矩阵 def build_graph(): n, m map(int,input().split()) graph [[0 for _ in range(n1)] for _ in range(n1)]for _ in range(m): …

软件工程——期末复习(适用于sdut)

名词解释&#xff1a; 名词解释--人月 答案&#xff1a;人月是软件开发工作量的单位&#xff0c;1人月表示1个程序员1个月的工作时间所开发的代码量。 请解释软件缺陷、错误和失败&#xff0c;并简单举例说明。 答案&#xff1a;缺陷&#xff08;defect&#xff09;指系统代…

【设计模式】【行为型模式(Behavioral Patterns)】之策略模式(Strategy Pattern)

1. 设计模式原理说明 策略模式&#xff08;Strategy Pattern&#xff09; 是一种行为设计模式&#xff0c;它允许你定义一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以互换。策略模式让算法的变化独立于使用算法的客户。通过这种方式&#xff0c;客户端可…

服务器如何隐藏端口才能不被扫描?

在服务器上隐藏端口以避免被扫描&#xff0c;是一种增强安全性的措施。虽然完全隐藏端口不太可能&#xff08;因为网络通信本质上需要暴露端口&#xff09;&#xff0c;但可以通过一系列技术手段尽量降低端口被扫描或探测的可能性。以下是详细的实现方法&#xff1a; 1. 更改默…

pytest+allure生成报告显示loading和404

pytestallure执行测试脚本后&#xff0c;通常会在电脑的磁盘上建立一个临时文件夹&#xff0c;里面存放allure测试报告&#xff0c;但是这个测试报告index.html文件单独去打开&#xff0c;却显示loading和404, 这个时候就要用一些办法来解决这个报告显示的问题了。 用命令产生…

家庭事务管理微信小程序ssm+论文源码调试讲解

2系统关键技术 2.1 微信小程序 微信小程序&#xff0c;简称小程序&#xff0c;英文名Mini Program&#xff0c;是一种全新的连接用户与服务的方式&#xff0c;可以快速访问、快速传播&#xff0c;并具有良好的使用体验。 小程序的主要开发语言是JavaScript&#xff0c;它与普…