【问题标题】:Using multiple refs on a single React element在单个 React 元素上使用多个 ref
【发布时间】:2020-02-17 21:32:37
【问题描述】:

我正在使用this recipe 中定义的useHover() 反应钩子。该钩子返回一个ref 和一个布尔值,指示用户当前是否悬停在此ref 标识的元素上。可以这样用……

function App() {
  const [hoverRef, isHovered] = useHover();

  return (
    <div ref={hoverRef}>
      {isHovered ? 'Hovering' : 'Not Hovering'}
    </div>
  );
}

现在假设我想使用另一个名为useDrag 的(假设的)钩子,它返回一个ref 和一个布尔值,指示用户是否在页面周围拖动当前元素。我想像这样在与以前相同的元素上使用它...

function App() {
  const [hoverRef, isHovered] = useHover();
  const [dragRef, isDragging] = useDrag();

  return (
    <div ref={[hoverRef, dragRef]}>
      {isHovered ? 'Hovering' : 'Not Hovering'}
      {isDragging ? 'Dragging' : 'Not Dragging'}
    </div>
  );
}

这不起作用,因为 ref 属性只能接受一个引用对象,而不是上面示例中的列表。

如何解决这个问题,以便在同一个元素上使用多个这样的钩子?我找到了一个package,看起来可能就是我要找的东西,但我不确定我是否遗漏了什么。

【问题讨论】:

  • 能否将 hoverRef 包装在一个 dragRef 组件中,并将forward the hoverRef 包装到一个子元素中?

标签: javascript reactjs typescript react-hooks


【解决方案1】:

React ref 实际上只是一些可变数据的容器,存储为current 属性。有关详细信息,请参阅React docs

{
  current: ... // my ref content
}

考虑到这一点,您应该可以手动解决:

function App() {
  const myRef = useRef(null);

  const [hoverRef, isHovered] = useHover();
  const [dragRef, isDragging] = useDrag();

  useEffect(function() {
    hoverRef.current = myRef.current;
    dragRef.current = myRef.current;
  }, [myRef.current]);

  return (
    <div ref={myRef}>
      {isHovered ? 'Hovering' : 'Not Hovering'}
      {isDragging ? 'Dragging' : 'Not Dragging'}
    </div>
  );
}

【讨论】:

  • 正确的想法,但是分配给 ref 不会导致渲染,所以 useEffect 不会被正确调用。分配应该发生在回调中。
猜你喜欢
  • 1970-01-01
  • 2018-04-27
  • 2020-07-26
  • 2012-11-11
  • 2020-10-12
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 2016-03-29
相关资源
最近更新 更多