Перехват ссылки пользователя

#javascript #reactjs #use-ref

#javascript #reactjs #использовать-ссылка

Вопрос:

Мне нужно иметь ссылку на переменную, чтобы я мог изменять значение этой переменной как в Canvas , так и ToolsMenu . Поэтому я сделал что-то похожее на это…

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

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

Но когда я изменяю canvas.current значение в <ToolsMenu /> , значение в <Canvas /> не обновляется.
Могу ли я каким-либо образом получить что-то вроде указателя C в React?

Я не думаю useState , что перехват сработает, потому что я изменяю значение canvas через методы ( canvas.getCommandStack().undo() ), а не через setCanvas

 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>
    </>
  );
}
 

Или это все равно будет работать?

Комментарии:

1. @EmileBergeron Я обновил вопрос дополнительной информацией.

2. Спасибо, теперь это имеет больше смысла!

Ответ №1:

Я сам исправил проблему. Это не имеет ничего общего с useRef перехватом.

Я просто забыл , [] внутри useEffect перехвата <Canvas /> , который инициализировался canvas.current . Поэтому я продолжал повторно инициализировать canvas после изменения его значения.

Комментарии:

1. Я просматривал фрагмент в вашем вопросе и не обнаружил очевидной проблемы, так что в конце концов это была не проблема XY. Рад, что вы узнали, что это было!

Ответ №2:

Вы не можете этого сделать?

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

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