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

中间添加一条可以拖拽的分界线,来动态调整两个模块的宽度

在 React 中操作 DOM 元素时,使用 document.querySelector 以及全局事件监听(如 addEventListener)并不推荐,因为这些方法无法与 React 的生命周期很好地协调,可能会导致内存泄漏或影响性能。

可以改为使用 useRefuseEffect 来处理 DOM 元素以及事件监听。

React 代码:

import React, { useRef, useEffect, useState } from 'react';
import styles from './index.module.less';const ComponentName = () => {const containerRef = useRef(null);const leftPanelRef = useRef(null);const rightPanelRef = useRef(null);const dividerRef = useRef(null);const [isDragging, setIsDragging] = useState(false);useEffect(() => {const handleMouseDown = () => {setIsDragging(true);};const handleMouseMove = (e) => {if (!isDragging) return;const containerRect = containerRef.current.getBoundingClientRect();const offsetX = e.clientX - containerRect.left;const leftWidth = (offsetX / containerRect.width) * 100;const rightWidth = 100 - leftWidth;leftPanelRef.current.style.width = `${leftWidth}%`;rightPanelRef.current.style.width = `${rightWidth}%`;};const handleMouseUp = () => {setIsDragging(false);};const divider = dividerRef.current;divider.addEventListener('mousedown', handleMouseDown);document.addEventListener('mousemove', handleMouseMove);document.addEventListener('mouseup', handleMouseUp);// 清理事件监听器return () => {divider.removeEventListener('mousedown', handleMouseDown);document.removeEventListener('mousemove', handleMouseMove);document.removeEventListener('mouseup', handleMouseUp);};}, [isDragging]);return (<div className={styles.container} ref={containerRef}><div className={styles.leftPanel} ref={leftPanelRef}></div><div className={styles.divider} ref={dividerRef}></div><div className={styles.rightPanel} ref={rightPanelRef}></div></div>);
};export default ComponentName;

样式css:

.container {display: flex;width: 100%;height: 100vh; position: relative;
}.leftPanel {width: 50%;background-color: lightblue;
}.rightPanel {width: 50%;background-color: lightgreen;
}.divider {width: 5px;background-color: gray;cursor: ew-resize; position: relative;
}

注释:

  1. useRef:用来获取 DOM 元素引用,如 containerRefleftPanelRefrightPanelRefdividerRef
  2. useState:用来存储拖动的状态 isDragging
  3. useEffect:用于在组件挂载时添加事件监听器,并在组件卸载时清理这些监听器。这样可以避免内存泄漏或重复监听。
  4. 清理事件:确保在组件卸载时移除 mousemovemouseup 的事件监听,避免意外行为。
  5. getBoundingClientRect() 是 JavaScript 中用于获取元素的边界信息的方法。它返回一个 DOMRect 对象,包含该元素相对于视口的位置和大小信息,包括 top, right, bottom, left, width, 和 height 等属性。

相关文章:

中间添加一条可以拖拽的分界线,来动态调整两个模块的宽度

在 React 中操作 DOM 元素时&#xff0c;使用 document.querySelector 以及全局事件监听&#xff08;如 addEventListener&#xff09;并不推荐&#xff0c;因为这些方法无法与 React 的生命周期很好地协调&#xff0c;可能会导致内存泄漏或影响性能。 可以改为使用 useRef 和…...

C++的vector优化

1、C中的动态数组一般是特指vector类 2、vector需要优化的原因之一是当我们push_back元素到数组中时&#xff0c;如果原来分配给动态数组的内存不够用了&#xff0c;那么就会找一块更大的内存空间分配给数组&#xff0c;把旧的内容复制到新的内存中去&#xff0c;这就是导致程…...

基于飞腾平台的OpenCV的编译与安装

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力&#xff0c;聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域&#xff0c;包含了应用使能套件、软件仓库、软件支持、软件适…...

pyside6与协程

目录 一、常见错误 错误一、使用协程函数作为槽函数。 错误二、在Qt循环中创建新的loop 二、解决方法&#xff1a; ①安装库qasync ②修改Qt入口 ③异步槽函数 ④异步函数 ⑤整体示例 一、常见错误 错误一、使用协程函数作为槽函数。 这样是肯定是不行&#xff…...

手机如何五开玩梦幻西游端游?用GameViewer远程手机免费畅玩梦幻西游

用手机就能免费玩梦幻西游端游&#xff0c;还可以随时查看挂机进度&#xff01; 想要实现这一点&#xff0c;就用网易GameViewer远程&#xff0c;而且不光手机可以玩梦幻西游端游&#xff0c;平板也能免费玩&#xff0c;并为你实现五开玩梦幻西游端游。 那么&#xff0c;通过Ga…...

【笔记】X射线物理基础

一、X射线衍射分析简史 1895年X射线发现 1896 年 2 月对骨折的观察&#xff1a;G.和 E. Frost是第一个使用 X 射线进行医疗用途 1897 年法国海关官员的行李扫描。 X射线衍射理论1 X射线衍射理论2 元素的特征X射线 X射线光电子的应用 电磁波的粒子属性 X射线层析成像法 X-ray…...

Vue3与Flask后端Demo

文章目录 准备工作Flask 后端设置Vue3 前端设置跨域问题测试 准备工作 安装开发环境 安装 Python&#xff08;推荐 Python 3.8 或更高版本&#xff09;。安装 Node.js&#xff08;推荐 LTS 版本&#xff09;。安装 PyCharm&#xff08;用于 Flask 开发&#xff09;和 VSCode&am…...

第一本RAG书籍《大模型RAG实战》出版!

随着ChatGPT的爆火&#xff0c;推动了新一轮的AI技术进步。但大模型自身存在幻觉、知识更新难等问题&#xff0c;阻碍了其直接进行落地应用。RAG&#xff08;Retrieval-Augmented Generation&#xff09;技术将LLM与文本信息检索相结合&#xff0c;解决了在一些场景下模型知识不…...

Pandas -----------------------基础知识(四)

自定义函数 Series 加载数据 import pandas as pd df pd.DataFrame({Age: [20, 25, 30, 35, 40]}) df # 目标: 让 Age 列 的每个元素 num1 num2 def add_nums(x,num1,num2):return x num1 num2 df[Age].apply(add_nums,num1 2,num2 3) 法二 df[Age].apply(lambda x ,num1…...

鼎阳加油-IOC关键技术问题的解决记

鼎阳SDS6204示波器EPICS IOC的搭建-CSDN博客 这款示波器在labview下工作的很好&#xff0c;以前搭建逐束团3D系统时连续几个月不间断的工作连接从没断过线&#xff0c;并做过速率测试&#xff0c;单通道时10Hz的波形更新速率都可以达到&#xff1a; 鼎阳SDS6204示波器波形读取…...

【HarmonyOS】TaskPool非阻塞UI

TaskPool方法不会阻塞UI&#xff0c;如果做上传图片的功能加载Loading记得使用TaskPool&#xff0c;Promise、Async/Await都会阻塞UI 【引言】 发现Promise可能会阻塞UI&#xff0c;尝试使用async或await&#xff0c;但发现它们仍然会导致阻塞。后来看到chaoxiaoshu回复的Tas…...

关于使用/bin/sh -c 用于Dockerfile的Entrypoint的问题

问题描述 相同的dockerfile&#xff0c;使用不同的基础镜像制作镜像1号进程不相同 ENTRYPOINT都是&#xff1a; /bin/sh -c pre-start.sh && myblockserver 的形式 就是执行多个命令命令&#xff0c;最后的一个命令是阻塞的 镜像1: 1号进程是 /bin/sh -c pre-start…...

JS---获取浏览器可视窗口的尺寸

innerHeight 和 innerWidth 这两个方法分别是用来获取浏览器窗口的宽度和高度&#xff08;包含滚动条的&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible&q…...

对抗攻击方法详解:梯度攻击、转移攻击与模型集成攻击

对抗攻击方法详解&#xff1a;梯度攻击、转移攻击与模型集成攻击 近年来&#xff0c;随着深度学习模型在各个领域取得惊人突破&#xff0c;对抗攻击&#xff08;Adversarial Attack&#xff09; 逐渐成为研究热点。对抗攻击旨在通过在输入数据上施加精心设计的微小扰动&#x…...

GPU并行效率问题——通过MPS提升GPU计算收益

GPU并行效率问题——通过MPS提升GPU计算收益_gpu mps-CSDN博客...

patch 命令:补丁的应用

一、命令简介 ​diff​ 和 patch​ 是传统的文件比较和应用差异的工具&#xff0c;而 git​ 是一个更现代、功能更全面的版本控制系统&#xff0c;它内置了 diff​ 和 patch​ 的功能&#xff0c;并且提供了更多用于代码管理和协作的高级特性。 diff, patch 和 git 之间的关系…...

仓颉编程语言4,遇到BUG求助

本来准备整仓颉链接Mysql数据库。参考&#xff1a;GitCode - 全球开发者的开源社区,开源代码托管平台 这种方式是拿mysql官方的dll&#xff0c;编译一下&#xff0c;然后再封装成仓颉数据库驱动。这种方式不够逼格&#xff0c;所以准备解析mysql网络协议&#xff0c;从0开始写…...

SpringIOCDI

1.IOC 1.1.IOC概述 IOC&#xff1a; Inversion Of Control&#xff0c;简称IOC&#xff0c;也被称为控制反转。对象的创建权由程序员主动创建转移到容器&#xff0c;由容器创建、管理对象&#xff0c;这种思想称为控制反转。这个容器称为IOC容器或Spring容器被IOC容器创建、管…...

单细胞Seruat和h5ad数据格式互换(R与python)方法学习和整理

SeruatV4数据转化为h5ad格式数据 1、导入(R) rm(list ls()) library(Seurat) library(qs) library(reticulate) library(hdf5r) library(sceasy) library(BiocParallel) register(MulticoreParam(workers 4, progressbar TRUE)) scRNA <- qread("sc_dataset.qs&q…...

分布式难题-三座大山NPC

文章目录 1. 三座大山 NPC 的概念2. NPC 细分理解2.1. Network Delay 网络延迟2.2. Process Pause 进程暂停2.3. Clock Drift 时钟漂移Is the Algorithm Asynchronous? 本文参考&#xff1a; RedLock红锁安全性争论&#xff08;上&#xff09; https://martin.kleppmann.com/…...

3步实现AutoHotkey脚本独立运行:Ahk2Exe编译工具完全指南

3步实现AutoHotkey脚本独立运行&#xff1a;Ahk2Exe编译工具完全指南 【免费下载链接】Ahk2Exe Official AutoHotkey script compiler - written itself in AutoHotkey 项目地址: https://gitcode.com/gh_mirrors/ah/Ahk2Exe 你是否厌倦了每次运行AutoHotkey脚本都需要安…...

制造业数字鸿沟的终结者:零依赖STL到STEP转换引擎的技术突破与应用实践

制造业数字鸿沟的终结者&#xff1a;零依赖STL到STEP转换引擎的技术突破与应用实践 【免费下载链接】stltostp Convert stl files to STEP brep files 项目地址: https://gitcode.com/gh_mirrors/st/stltostp 在数字化制造与工业4.0的浪潮中&#xff0c;制造业企业面临着…...

Netgear路由器终极救援指南:如何用免费开源工具nmrpflash快速修复“变砖“设备

Netgear路由器终极救援指南&#xff1a;如何用免费开源工具nmrpflash快速修复"变砖"设备 【免费下载链接】nmrpflash Netgear Unbrick Utility 项目地址: https://gitcode.com/gh_mirrors/nmr/nmrpflash 当你的Netgear路由器因固件升级失败、意外断电或系统崩…...

别再死记硬背了!用MATLAB手把手教你画根轨迹图(附代码与避坑指南)

MATLAB实战&#xff1a;从零绘制根轨迹图的完整指南与避坑技巧 在控制系统的设计与分析中&#xff0c;根轨迹图是理解系统动态特性的重要工具。传统教学中&#xff0c;学生往往被要求死记硬背绘制规则&#xff0c;却难以理解其实际应用价值。本文将彻底改变这一现状——通过MAT…...

【CH32V307实战】4P OLED屏I2C驱动移植与快速显示指南

1. CH32V307与4P OLED屏的硬件连接指南 第一次拿到CH32V307开发板和4P OLED屏时&#xff0c;最让我头疼的就是接线问题。这种4线制OLED&#xff08;通常标注为4P或4PIN&#xff09;相比传统的7线制简化了不少&#xff0c;但引脚定义各家厂商可能略有差异。经过多次实测&#xf…...

ncmdumpGUI:3分钟解锁网易云音乐ncm格式,让你的音乐无处不在

ncmdumpGUI&#xff1a;3分钟解锁网易云音乐ncm格式&#xff0c;让你的音乐无处不在 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 还在为网易云音乐下载的nc…...

从分布式到可分发:大规模软件制品分发架构设计与实践

1. 项目概述&#xff1a;从“分布式”到“可分发”的思维跃迁最近在梳理团队内部的基础设施时&#xff0c;又翻出了distr-sh/distr这个项目。说实话&#xff0c;第一次看到这个仓库名&#xff0c;我下意识地把它归类为又一个“分布式系统”框架。但当我真正点进去&#xff0c;花…...

Godot游戏自动化构建与发布:基于GitHub Actions与Docker的CI/CD实践

1. 项目概述&#xff1a;当Godot遇上CI/CD如果你是一名独立游戏开发者&#xff0c;或者在一个小团队里负责Godot引擎的项目&#xff0c;那么“构建”和“部署”这两个词&#xff0c;大概率是你开发流程里最头疼的环节之一。手动导出项目到不同平台&#xff08;Windows、Linux、…...

告别手动框选!用SUSTechPOINTS的V键批量标注,5分钟搞定一帧点云

解锁SUSTechPOINTS的V键批量标注&#xff1a;点云处理效率革命 在自动驾驶与机器人研发领域&#xff0c;点云标注是构建高精度感知模型的基础环节&#xff0c;但传统逐帧手动标注方式往往成为项目进度的瓶颈。我曾参与过一个城市级点云数据集标注项目&#xff0c;团队最初采用常…...

Rulebook-AI:用规则引擎为AI智能体构建可控决策框架

1. 项目概述&#xff1a;一个基于规则的AI智能体框架最近在探索如何让AI智能体&#xff08;Agent&#xff09;的行为更可控、更符合业务逻辑时&#xff0c;我遇到了一个挺有意思的开源项目&#xff1a;botingw/rulebook-ai。乍一看这个名字&#xff0c;可能会觉得它又是一个试图…...