当前位置: 首页 > news >正文

React Hooks 封装可粘贴图片的输入框组件(wangeditor)

需求是需要一个文本框 但是可以支持右键或者ctrl+v粘贴图片,原生js很麻烦,那不如用插件来实现吧~我这里用的wangeditor插件,初次写初次用,可能不太好,但目前是可以达到实现需求的一个效果啦!后面再改进吧~

封装了个文本框组件,上代码吧直接:

import React, {useRef,useEffect,forwardRef,useImperativeHandle
} from "react";
import WangEditor from "wangeditor";
import { handleFetchPostJson } from "../../service/request";
import "./editimg.scss";// 过滤所有标签及属性
let reHtml =/(&lt;|<(?!img|p|\/p|h1|h2|h3|h4|h5|h6|\/h1|\/h2|\/h3|\/h4|\/h5|\/h6|span|\/span|br).*?>|&gt;)/gi;const EditorImgComponent = forwardRef(({ isPlot, onContentChange, editorConfig, isDialog }, ref) => {let wangEditor = useRef();const editorRef = useRef(null);useEffect(() => {if (editorRef.current) {wangEditor.current = new WangEditor(editorRef.current);const editor = wangEditor.current;editor.config.menus = editorConfig;// 允许粘贴图片editor.config.showLinkImg = false;editor.config.pasteFilterStyle = true;// 监控变化,同步更新到 textareaeditor.config.onchange = (html) => {onContentChange(html);};editor.config.placeholder ="<div>为了更加快速的定位查找问题,请您按照如下方式反馈相关信息:<br/>  # 云分析请提供项目编号、章节名称、问题描述;<br/># 云分析请提供分析参数和提示信息截图;<br/> # 云图汇工具 请描述问题,附上相关作图数据;<br/>支持粘贴图片,为了更好的展示效果,请将文案和图片换行展示</div>";// 粘贴时去掉标签editor.config.pasteTextHandle = (content) => {content = content.replace(/[\r\n]/g, "");content = content.replace(/\'/g, '"');content = content.replace(reHtml, "");return content;};editor.config.zIndex = 1;editor.config.customUploadImg = function (files, insert) {if (files[0].size / 1024 / 1024 > 2) {message.error("上传图片最大不超过2M!");return;}let formData = new FormData();formData.append("image", files[0]);handleFetchPostJson("v1/message/mess_pic/", formData, {"Content-Type": "multipart/form-data"}).then((res) => {if (res.code === 2000) {let time = new Date().getTime();insert(res.info + "?time=" + time);} else {message.error("上传失败,请重新上传!");}});};editor.create();return () => {editor.destroy();};}}, []);useImperativeHandle(ref,() => {return {editor: wangEditor.current};},[wangEditor.current]);return (<divref={editorRef}className={isPlot? "work-center-plot-content-editor": isDialog? "work-center-dialog-editor": "work-center-content-editor"}/>);}
);export default EditorImgComponent;

稍微微的描述一下吧
因为我在其他页面(也就是父组件)调用的话需要子组件和父组件的值保持一致,也就是说当父组件值清空时,子组件也要相应清空,父组件值变化时,子组件也要同样变化,所以用到forwardRef和useImperativeHandle,用法可以看下react官方文档。


父组件调用:

定义:

赋值:

我这里只需要图片所以只配置了图片 想要什么往里面加什么就好了 百度和wangediter文档都可以搜到配置项具体有哪些

父组件控制子组件的同步的重新赋值:

父组件控制子组件的同步的内容清空


效果展示:

操作展示 !!!话不多说了直接行动证明

完成!!!小马同学又进步啦~

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MPC+WBC多任务优先级控制例子
  • Ubuntu 22.04安装cuda及Pytorch教程
  • 刚刚❗️德勤2025校招暑期实习测评笔试SHL测评题库已发(答案)
  • 快速安装Windows和Ubuntu双系统
  • 同盾中文点选验证码识别方法
  • 【python/pytorch】已解决ModuleNotFoundError: No module named ‘torch‘
  • 【Python入门与进阶】常见问题与解决方法
  • 服务器数据恢复—强制上线raid5阵列离线硬盘导致raid不可用的数据恢复案例
  • 双Token方案实现Token自动续期(基于springboot+vue前后端分离项目)
  • 利用ffmpeg把视频分解成图片(每秒x张图)再图片合成视频
  • liquibase做数据库版本管理
  • MySQL系列-安装配置使用说明(MAC版本)
  • BIO,NIO,AIO
  • 【图解IO与Netty系列】Netty核心组件解析
  • 地图元素。
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • mysql外键的使用
  • zookeeper系列(七)实战分布式命名服务
  • 基于axios的vue插件,让http请求更简单
  • 入口文件开始,分析Vue源码实现
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 我从编程教室毕业
  • 一、python与pycharm的安装
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​Spring Boot 分片上传文件
  • ​插件化DPI在商用WIFI中的价值
  • #Linux(权限管理)
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (二)springcloud实战之config配置中心
  • (分布式缓存)Redis分片集群
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (十)c52学习之旅-定时器实验
  • (四)汇编语言——简单程序
  • (原)本想说脏话,奈何已放下
  • (轉貼) UML中文FAQ (OO) (UML)
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .Net IE10 _doPostBack 未定义
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET程序集编辑器/调试器 dnSpy 使用介绍
  • .NET构架之我见
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .Net实现SCrypt Hash加密
  • .net中应用SQL缓存(实例使用)
  • /bin/bash^M: bad interpreter: No such file or directory
  • /etc/motd and /etc/issue
  • @RequestParam,@RequestBody和@PathVariable 区别
  • [ C++ ] STL_list 使用及其模拟实现
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [Contiki系列论文之2]WSN的自适应通信架构
  • [Docker]十.Docker Swarm讲解