Если при нажатии кнопки появляется «Не реализовано», это происходит потому, что Example
перерисовывается до нажатия кнопки.Если вы поиграете с песочницей моего кода ниже, вы обнаружите, что кнопка «Тест» работает так, как задумано, до тех пор, пока вы не нажмете «Рендеринг триггера».Ваш массив зависимостей useEffect
настроен на выполнение только при монтировании.При повторном рендеринге создается новый obj
, который никогда не получает переназначенную функцию fetch
.
import React, { useState, useEffect } from "react";
import ReactDOM from "react-dom";
function Example() {
const obj = {
fetch: () => {
console.error("Not implemented!");
}
};
useEffect(() => {
obj.fetch = async () => {
console.log("Implemented");
};
obj.fetch();
}, []);
return (
<button onClick={() => obj.fetch()}>Test</button>
);
}
function App() {
const [renderTrigger, setRenderTrigger] = useState(0);
return (
<>
<Example />
<br />
<button onClick={() => setRenderTrigger(prev => prev + 1)}>
Trigger render
</button>
<br />
{renderTrigger}
</>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
![Edit useEffect](https://codesandbox.io/static/img/play-codesandbox.svg)