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

如何在react-beautiful-dnd中绑定多个ref 解决拖拽失效问题

问题原因

你之前的多ref绑定写法ref={provided.innerRef, ref}使用了JavaScript逗号运算符,表达式最终只会返回最后一个值即你的自定义ref,react-beautiful-dnd的provided.innerRef完全没有被绑定到DOM节点上,库无法获取拖拽元素的引用,直接导致拖拽功能失效。

正确实现方式

使用回调ref同时给两个ref赋值,要注意兼容provided.innerRef可能是函数也可能是ref对象的情况,修改对应部分代码即可:

{(provided) => {
  const style = {
    backgroundColor: 'red',
    height: styleHeight,
      ...provided.draggableProps.style
  };

  return (
    <div 
      ref={(node) => {
        // 赋值react-beautiful-dnd的内部ref
        if (typeof provided.innerRef === 'function') {
          provided.innerRef(node);
        } else if (provided.innerRef) {
          provided.innerRef.current = node;
        }
        // 赋值自定义ref
        ref.current = node;
      }}
      {...provided.dragHandleProps}
      {...provided.draggableProps}
      style={style}
      className={classNames(styles.largeEvent,
        { [styles.smallEvent]: events.length > 2 },
        { [styles.hide]: index >= 7 })}
    > 
      <MonthlyEvent eventImageSrc={event.eventImageSrc} channel={event.channel}  />
    </div>
  )
}}

如果项目里有多ref绑定的复用需求,可以封装通用的mergeRefs工具函数:

function mergeRefs(...refs) {
  return (node) => {
    refs.forEach(ref => {
      if (typeof ref === 'function') {
        ref(node);
      } else if (ref) {
        ref.current = node;
      }
    });
  };
}

使用时直接传入需要绑定的所有ref即可,写法更简洁:

<div ref={mergeRefs(provided.innerRef, ref)}
  // 其余属性保持不变
>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:57:03