useRef 反应钩子

Posted

技术标签:

【中文标题】useRef 反应钩子【英文标题】:useRef React Hook 【发布时间】:2021-03-02 18:28:06 【问题描述】:

我需要一个变量的引用,这样我就可以在CanvasToolsMenu 中更改该变量的值。因此我做了类似的东西......

function App() 
  const canvas = useRef(); // Value assigned in <Canvas />

  return (
    <>
      <Canvas canvas=canvas />
      <ToolsMenu canvas=canvas />
    </>
  );

但是当我更改&lt;ToolsMenu /&gt; 中的canvas.current 值时,&lt;Canvas /&gt; 中的值不会更新。 有什么方法可以让我在 React 中获得类似 C++ 指针的东西?

我不认为 useState 挂钩会起作用,因为我通过方法 (canvas.getCommandStack().undo()) 而不是通过 setCanvas 来更改 canvas 的值

function App() 
  const [canvas, setCanvas] = useState(); // Assign in <Canvas />

  return (
    <>
      <Canvas canvas=canvas setCanvas=setCanvas/>
      <ToolsMenu canvas=canvas/>
    </>
  );


function Canvas( canvas, setCanvas ) 
  useEffect(() => 
    setCanvas(new draw2d.Canvas("canvas"));
  , []);

  // ...

  return <div id="canvas"></div>;


function ToolsMenu( canvas ) 
  const undo = () => canvas?.getCommandStack().undo();
  const redo = () => canvas?.getCommandStack().redo();

  return (
    <>
      <button onClick=undo>Undo</button>
      <button onClick=redo>Redo</button>
    </>
  );

或者它仍然有效?

【问题讨论】:

@EmileBergeron 我用更多信息更新了这个问题。 谢谢,现在更有意义了! 【参考方案1】:

我自己解决了这个问题。它与useRef 挂钩无关。

我只是忘记了useEffect 钩子中的, [],在&lt;Canvas /&gt; 中,它正在初始化canvas.current。所以我在更改其值后不断重新初始化canvas

【讨论】:

我在看你问题中的sn-p,没有发现明显问题,所以最终不是XY问题。很高兴你发现它是什么!【参考方案2】:

你不能这样做吗?

function App() 
    const [ref, setRef] = usestate();

    return (
    <>
        <Comp1 value=ref onChange=setRef(value)/>
        <Comp2 value=ref onChange=setRef(value)/>
    </>
    );

【讨论】:

以上是关于useRef 反应钩子的主要内容,如果未能解决你的问题,请参考以下文章

反应 useRef / useEffect HTMLCanvasElement 不可分配

反应 useEffect 和 useRef

为子组件(useRef)反应滑轮事件?

如何使用 jest.mock 模拟 useRef 和反应测试库

如何解决反应js中的“useRef不是函数错误”

用 useRef 移动一个反应 <div>