react经验13:使用非react封装的富文本组件

应用场景

已知开源社区已经有react封装的富文本组件,一般的文本编辑需求足够满足,但是当有特殊需求无法满足时,可能需要用到非react封装的富文本组件。
当使用非react封装的富文本编辑器时,react组件内的state与编辑器的内容交换有点小毛病,本经验给出解决思路。

实施过程

这里以代码编辑组件"ace"为例。

npm i ace-builds

定义编辑器的容器

<div ref={setDom_editor_main}/>
const [dom_editor_main, setDom_editor_main] = useState<HTMLElement | null>()

定义内容交换的state

const [content,setContent]=useState('')
const [codeEditor, setCodeEditor] = useState<ace.Ace.Editor>()
function handleEditorValueChange() {if (codeEditor) {const val = codeEditor.getValue()if (content!== val) {setContent(val)}}
}

初始化编辑器

const otherState = useRef({isInit: true//标识页面首次载入
})
useEffect(() => {//赋值给编辑器if (otherState.current.isInit && codeEditor) {codeEditor?.off('change', handleEditorValueChange)codeEditor?.on('change', handleEditorValueChange)//绑定事件codeEditor.setValue(content)otherState.current.isInit = false}
}, [codeEditor, content])
//编辑器初始化
useEffect(() => {if (!dom_editor_main) {return}const editor = ace.edit(dom_editor_main)editor.session.setMode('ace/mode/sql')editor.setTheme('ace/theme/github')editor.setOptions({enableBasicAutocompletion: true,enableLiveAutocompletion: true,showPrintMargin: false,wrap: 120})setCodeEditor(editor)
}, [dom_editor_main])
useEffect(() => {return () => {//销毁编辑器codeEditor?.off('change', handleEditorValueChange)codeEditor?.destroy()}
}, [])

当页面有初始化加载数据时

async function loadData(id:string){//示范从API读取数据const data=await api_loadData(id)//赋值给编辑器setContent(data)
}
//假设你的组件接受id属性用来加载数据
useEffect(()=>{if(props.id){otherState.current.isInit = trueloadData(props.id)}
},[props.id])

由于编辑器通过change事件传值给content,那么保存时可以直接取content或者调用编辑器的getValue

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

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

相关文章

图像处理之Retinex算法(C++)

图像处理之Retinex算法&#xff08;C&#xff09; 文章目录 图像处理之Retinex算法&#xff08;C&#xff09;前言一、单尺度Retinex&#xff08;SSR&#xff09;1.原理2.代码实现3.结果展示 二、多尺度Retinex&#xff08;MSR&#xff09;1.原理2.代码实现3.结果展示 三、带色…

Axure设计美观友好的后台框架页

使用Axure设计后台框架页 优点介绍&#xff1a; **1、使用中继器灵活配置菜单项&#xff1b; 2、二级菜单面板跟随一级菜单位置显示&#xff1b; 3、菜单链接打开后&#xff0c;联动添加tab标签&#xff1b; 4、标签页与iframe内容联动&#xff0c;可关闭&#xff1b; 5、左侧…

2024-04-23 问AI: 在深度学习中,介绍一下u-net模型。

文心一言 U-Net模型是一种在深度学习中广泛应用的卷积神经网络结构&#xff0c;主要用于图像分割任务。这种模型最初在生物医学图像处理中得到了广泛应用&#xff0c;但由于其高效且可靠的性能&#xff0c;U-Net也逐渐被用于遥感图像分割等领域。 U-Net模型的结构对称&#x…

DNS 服务器不同类型有什么作用?

所有 DNS 服务器都属于以下四个类别之一&#xff1a;递归解析器、根域名服务器、TLD 域名服务器和权威性域名服务器。在典型 DNS 查找中&#xff08;当没有正在进行的高速缓存时&#xff09;&#xff0c;这四个 DNS 服务器协同工作来完成将指定域的 IP 地址提供给客户端的任务&…

JVM--Java对象到底存在哪?

Java对象存放在堆中&#xff0c;但堆又分为新生代和老年代&#xff0c;新生代又细分为 Eden、From Survivor、To Survivor。那我们创建的对象到底在哪里&#xff1f; 堆分为新生代和老年代&#xff0c;新生代用于存放使用后就要被回收的对象&#xff08;朝生夕死&#xff09;&a…

iOS - 多线程的安全隐患

文章目录 iOS - 多线程的安全隐患1. 卖票案例2. 多线程安全隐患的解决方案2.1 iOS中的线程同步方案2.2 同步方案的使用2.2.1 OSSpinLock2.2.1.1 使用方法&#xff1a;2.2.1.2 案例 2.2.2 os_unfair_lock2.2.2.1 使用方法&#xff1a;2.2.2.2 案例 2.2.3 pthread_mutex2.2.3.1 使…

【Ne4j图数据库入门笔记1】图形数据建模初识

1.1 图形建模指南 图形数据建模是用户将任意域描述为节点的连接图以及与属性和标签关系的过程。Neo4j 图数据模型旨在以 Cypher 查询的形式回答问题&#xff0c;并通过组织图数据库的数据结构来解决业务和技术问题。 1.1.1 图形数据模型介绍 图形数据模型通常被称为对白板友…

【大模型】大模型时代的语音合成:音频的离散化表示

&#x1f512;文章目录 &#x1f4ca;什么是音频离散化&#x1f3ac;音频离散化是什么 &#x1f308;SoundStream、Encodec&#x1f302; SoundStream&#x1f680;Encodec &#x1f4ca;什么是音频离散化 &#x1f3ac;音频离散化是什么 在自然语言处理&#xff08;NLP&…

Amazon云计算AWS之[2]弹性计算云EC2

文章目录 说明EC2基本架构Amazon机器映象&#xff08;AMI&#xff09;实例&#xff08;Instance&#xff09;弹性块存储&#xff08;EBS&#xff09; EC2关键技术地理区域和可用区域EC2通信机制弹性负载均衡监控服务自动缩放服务管理控制台 EC2安全及容错机制EC2弹性IP地址 说明…

KingbaseES数据库copy导入导出

数据库版本&#xff1a;KingbaseES V008R006C008B0014 文章目录如下 1. 语法说明 2. 导出数据 2.1. 基本用法 2.2. 只导出某列 2.3. 指定分隔符 2.4. 导出为二进制格式 2.5. 替换导出的NULL数据 2.6. 导出SELECT查询结果 3. 导入数据 3.1. 基本用法 3.2. 只导入某列…

恒峰智慧科技—森林消防泵:既可灭除火灾,又可清理水患

在广袤的森林中&#xff0c;火灾与水患如同潜伏的猛兽&#xff0c;时刻威胁着生态的安全。然而&#xff0c;随着科技的进步&#xff0c;我们有了更强大的武器来对抗这些威胁——森林消防泵。这款神奇的设备不仅能迅速扑灭火灾&#xff0c;还能在雨季到来时清理水患&#xff0c;…

Linux:进程与计划任务

文章目录 Linux&#xff1a;进程与计划任务一、进程1、进程是什么2、进程状态 二、列出进程命令1、查看静态的进程统计信息——“ps”Play1&#xff1a;“ps aux”Play2:ps -elf 2、查看静态的进程统计信息——“top”段首解析进程信息区解释 三、运行与终止进程3.1、运行进程3…

spring的跨域问题

跨域问题 什么是跨域解决跨域 什么是跨域 跨域问题本质是浏览器的一种保护机制&#xff0c;它的初衷是为了保证用户的安全&#xff0c;防止恶意网站窃取数据。如果出现了以下情况中的任意一种&#xff0c;那么它就是跨域请求&#xff1a; 1、协议不同&#xff0c;如 http 和 h…

Redis入门到通关之Redis数据结构-List篇

文章目录 ☃️概述☃️数据结构☃️源码☃️其他 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平衡&#xff0c;0与1的延伸的后端…

8、案例实战【处理百万级交易无压力】:支付系统JVM调优实战指南

8.1、前文回顾 本文将以一个日交易量达百万次的支付系统为背景,为大家深入分析在上线部署一个系统时,如何根据系统的业务量来合理设置JVM的堆内存大小。 通过阅读之前的文章,相信大家已经对编写的代码如何在JVM中运行的基本原理有了一定的了解,同时也知道如何通过参数来设…

数据结构(Wrong Question)

一、绪论 1.1 数据结构的基本概念 D 因为抽象数据类型&#xff08;ADT&#xff09;描述了数据的逻辑结构和抽象运算&#xff0c;通常用&#xff08;数据对象&#xff0c;数据对象&#xff0c;基本操作集&#xff09;这样的三元组来表示&#xff0c;从而可构成一个完整的数据结…

虚拟化+docker概念

一&#xff0e;虚拟化简介 通过虚拟化技术将一台计算机虚拟为多台逻辑计算机&#xff0c;在一台计算机上同时运行多个逻辑计算机&#xff0c;同时每个逻辑计算机可运行不同的操作系统&#xff0c;应用程序都可以在相互独立的空间内运行而互相不影响&#xff0c;从而提高计算机…

3节点ubuntu24.04服务器docker-compose方式部署高可用elk+kafka日志系统并接入nginx日志

一&#xff1a;系统版本: 二&#xff1a;部署环境&#xff1a; 节点名称 IP 部署组件及版本 配置文件路径 机器CPU 机器内存 机器存储 Log-001 10.10.100.1 zookeeper:3.4.13 kafka:2.8.1 elasticsearch:7.7.0 logstash:7.7.0 kibana:7.7.0 zookeeper:/data/zookeep…

(Oracle)SQL优化案例:组合索引优化

项目场景 项目上的ETL模型里有如下SQL语句。执行速度非常慢&#xff0c;每次只查询200条数据&#xff0c;但却需要20多秒的时间。再加上该SQL查询出的数据同步频率很高&#xff0c;这个速度是完全不能忍受的。 因为项目隐私&#xff0c;所以对表及字段做了改写。 SELECT ID…

DaVinci Fusion Studio 19 for Mac/win:影视后期特效合成的巅峰之作

在影视后期制作的广袤天地里&#xff0c;一款强大的特效合成软件如同一位技艺高超的魔法师&#xff0c;能够化腐朽为神奇&#xff0c;将普通的影像素材转变为震撼人心的视觉盛宴。而DaVinci Fusion Studio 19&#xff0c;正是这样一款备受影视从业者推崇的巅峰之作。 无论是Ma…