You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在使用re-resizable调整大小时禁用dnd-kit拖拽功能

问题修复:调整大小时阻止dnd-kit拖拽触发

你的问题核心在于状态更新的异步性和事件冒泡:点击resize手柄时,mousedown事件会先触发dnd-kit的拖拽逻辑,之后才会执行handleResizeStart更新状态,此时拖拽已经启动,后续状态变化无法阻止已触发的拖拽行为。

正确修复需要同时解决这两个问题:

  • 利用dnd-kit内置的disabled属性直接禁用拖拽,而非移除listeners
  • 在resize开始时阻止事件冒泡,避免触发父元素的拖拽事件

修改后的代码如下:

import React, { useState } from "react";
import { useDraggable } from "@dnd-kit/core";
import { Resizable } from "re-resizable";

const CustomStyle = {
  display: "flex",
  width: "140px",
  height: "140px",
  backgroundColor: "#e8e8a2",
};

export function Draggable({ id, content, styles }) {
  const [isDraggingDisabled, setIsDraggingDisabled] = useState(false);
  
  const { attributes, listeners, setNodeRef, transform } = useDraggable({
    id,
    disabled: isDraggingDisabled, // 通过disabled属性控制拖拽禁用
  });

  const style = transform
    ? {
        transform: `translate3d(${transform.x}px, ${transform.y}px, 0)`,
      }
    : {};

  const handleResizeStart = (e) => {
    e.stopPropagation(); // 阻止事件冒泡到父div,避免触发dnd-kit的mousedown
    setIsDraggingDisabled(true);
  };

  const handleResizeStop = () => {
    setIsDraggingDisabled(false);
  };

  return (
    <div
      ref={setNodeRef}
      style={{ ...style, ...styles }}
      {...listeners}
      {...attributes}
    >
      <Resizable
        style={{ ...CustomStyle }}
        defaultSize={{
          width: 200,
          height: 200,
        }}
        onResizeStart={handleResizeStart}
        onResizeStop={handleResizeStop}
      >
        {content}
      </Resizable>
    </div>
  );
}

关键改动说明:

  1. 将状态改为isDraggingDisabled,直接传给useDraggable的disabled参数,让dnd-kit内部处理禁用逻辑,比动态移除listeners更可靠
  2. 在handleResizeStart中添加e.stopPropagation(),从根源上阻止resize手柄的事件触发父元素的拖拽逻辑
  3. 保留完整的listeners和attributes,依赖dnd-kit的disabled属性实现拖拽禁用,避免状态更新异步带来的延迟问题

内容的提问来源于stack exchange,提问作者user16971617

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 00:59:58