当前位置: 首页 > 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 等属性。
http://www.lryc.cn/news/447763.html

相关文章:

  • C++的vector优化
  • 基于飞腾平台的OpenCV的编译与安装
  • pyside6与协程
  • 手机如何五开玩梦幻西游端游?用GameViewer远程手机免费畅玩梦幻西游
  • 【笔记】X射线物理基础
  • Vue3与Flask后端Demo
  • 第一本RAG书籍《大模型RAG实战》出版!
  • Pandas -----------------------基础知识(四)
  • 鼎阳加油-IOC关键技术问题的解决记
  • 【HarmonyOS】TaskPool非阻塞UI
  • 关于使用/bin/sh -c 用于Dockerfile的Entrypoint的问题
  • JS---获取浏览器可视窗口的尺寸
  • 对抗攻击方法详解:梯度攻击、转移攻击与模型集成攻击
  • GPU并行效率问题——通过MPS提升GPU计算收益
  • patch 命令:补丁的应用
  • 仓颉编程语言4,遇到BUG求助
  • SpringIOCDI
  • 单细胞Seruat和h5ad数据格式互换(R与python)方法学习和整理
  • 分布式难题-三座大山NPC
  • 两个方法教你设置Excel密码,防止修改和复制Excel表格内容
  • Java解析Excel文件
  • Require:基于雪花算法完成一个局部随机,全局离散没有热点切唯一的数值Id生成器。
  • libevent - Macro function
  • 408算法题leetcode--第17天
  • 机器人顶刊IEEE T-RO发布无人机动态环境高效表征成果:基于粒子的动态环境连续占有地图
  • spring-boot web + vue
  • HDFS分布式文件系统01-HDFS架构与SHELL操作
  • Go语言流程控制
  • 无人机在救灾方面的应用!
  • 面试知识点总结篇一