当前位置:首页 > React

react实现拖拽调整宽度

2026-01-27 16:37:58React

实现拖拽调整宽度的基本思路

在React中实现拖拽调整宽度功能,可以通过监听鼠标事件来控制元素的宽度变化。核心是利用onMouseDownonMouseMoveonMouseUp事件来跟踪拖动操作。

使用useState和useEffect管理状态

定义一个状态变量来存储当前宽度,并通过事件处理函数更新它。useEffect用于添加和清理全局事件监听器。

import React, { useState, useEffect } from 'react';

const ResizableComponent = () => {
  const [width, setWidth] = useState(200);
  const [isDragging, setIsDragging] = useState(false);

  const handleMouseDown = (e) => {
    setIsDragging(true);
    e.preventDefault(); // 防止文本选中等副作用
  };

  useEffect(() => {
    const handleMouseMove = (e) => {
      if (!isDragging) return;
      setWidth(e.clientX); // 根据鼠标位置更新宽度
    };

    const handleMouseUp = () => {
      setIsDragging(false);
    };

    if (isDragging) {
      document.addEventListener('mousemove', handleMouseMove);
      document.addEventListener('mouseup', handleMouseUp);
    }

    return () => {
      document.removeEventListener('mousemove', handleMouseMove);
      document.removeEventListener('mouseup', handleMouseUp);
    };
  }, [isDragging]);

  return (
    <div style={{ display: 'flex' }}>
      <div style={{ width: `${width}px`, border: '1px solid #ccc' }}>
        可调整宽度的区域
      </div>
      <div
        style={{ width: '10px', cursor: 'col-resize', background: '#eee' }}
        onMouseDown={handleMouseDown}
      />
    </div>
  );
};

export default ResizableComponent;

优化拖动体验

添加边界检查和拖动限制,避免宽度超出合理范围。可以在handleMouseMove中增加条件判断:

const handleMouseMove = (e) => {
  if (!isDragging) return;
  const newWidth = e.clientX;
  if (newWidth > 100 && newWidth < 500) { // 限制宽度范围
    setWidth(newWidth);
  }
};

使用自定义Hook封装逻辑

将拖拽逻辑抽象为自定义Hook,提高代码复用性:

const useResizable = (initialWidth, minWidth, maxWidth) => {
  const [width, setWidth] = useState(initialWidth);
  const [isDragging, setIsDragging] = useState(false);

  const handleMouseDown = (e) => {
    setIsDragging(true);
    e.preventDefault();
  };

  useEffect(() => {
    const handleMouseMove = (e) => {
      if (!isDragging) return;
      const newWidth = e.clientX;
      if (newWidth >= minWidth && newWidth <= maxWidth) {
        setWidth(newWidth);
      }
    };

    const handleMouseUp = () => {
      setIsDragging(false);
    };

    if (isDragging) {
      document.addEventListener('mousemove', handleMouseMove);
      document.addEventListener('mouseup', handleMouseUp);
    }

    return () => {
      document.removeEventListener('mousemove', handleMouseMove);
      document.removeEventListener('mouseup', handleMouseUp);
    };
  }, [isDragging, minWidth, maxWidth]);

  return { width, handleMouseDown };
};

// 使用示例
const ResizableComponent = () => {
  const { width, handleMouseDown } = useResizable(200, 100, 500);

  return (
    <div style={{ display: 'flex' }}>
      <div style={{ width: `${width}px`, border: '1px solid #ccc' }}>
        内容区域
      </div>
      <div
        style={{ width: '10px', cursor: 'col-resize', background: '#eee' }}
        onMouseDown={handleMouseDown}
      />
    </div>
  );
};

处理性能问题

频繁的mousemove事件可能导致性能问题。可以通过节流(throttle)或防抖(debounce)来优化:

import { throttle } from 'lodash';

// 在useEffect中
const handleMouseMove = throttle((e) => {
  if (!isDragging) return;
  const newWidth = e.clientX;
  if (newWidth >= minWidth && newWidth <= maxWidth) {
    setWidth(newWidth);
  }
}, 16); // 约60fps

支持垂直拖拽调整高度

类似的方法可以用于调整高度,只需修改事件处理逻辑和样式:

react实现拖拽调整宽度

const handleMouseMove = (e) => {
  if (!isDragging) return;
  const newHeight = e.clientY;
  setHeight(newHeight);
};

// 样式调整
<div style={{ height: `${height}px`, position: 'relative' }}>
  <div
    style={{ height: '10px', cursor: 'row-resize', background: '#eee' }}
    onMouseDown={handleMouseDown}
  />
</div>

标签: 宽度拖拽
分享给朋友:

相关文章

vue实现拖拽实现布局

vue实现拖拽实现布局

Vue 实现拖拽布局的方法 使用 Vue.Draggable 库 Vue.Draggable 是基于 Sortable.js 的 Vue 组件,适合实现列表或网格的拖拽排序。 安装依赖: npm…

jquery 拖拽

jquery 拖拽

jQuery 拖拽实现方法 使用 jQuery 实现拖拽功能可以通过多种方式完成,以下是常见的几种方法: 使用 jQuery UI 的拖拽功能 jQuery UI 提供了 draggable 方法,…

js实现图片拖拽

js实现图片拖拽

实现图片拖拽的基本步骤 HTML 结构需要包含可拖拽的图片元素,并设置 draggable 属性为 true: <img id="dragImage" src="image.jpg" drag…

div拖拽实现vue

div拖拽实现vue

实现 Vue 中的 div 拖拽功能 在 Vue 中实现 div 拖拽功能可以通过原生 HTML5 的拖拽 API 或第三方库如 vuedraggable 完成。以下是两种方法的详细实现: 使用 H…

vue实现简单拖拽

vue实现简单拖拽

Vue 实现简单拖拽功能 在 Vue 中实现拖拽功能可以通过 HTML5 的拖放 API 或第三方库(如 vuedraggable)来完成。以下是两种常见的实现方式: 使用 HTML5 拖放 API…

vue实现元素拖拽

vue实现元素拖拽

Vue 实现元素拖拽的方法 使用 HTML5 原生拖拽 API HTML5 提供了原生拖拽 API,可以通过 draggable 属性结合事件监听实现拖拽功能。 <template>…