Когда вы определяете свой эффект как
useEffect( () => () => console.log( ["unmount",data1] ), [] );
Вы фактически указываете ему запускаться при начальном рендеринге и, следовательно, data1, на который указывает обратный вызов, является начальным значением, которое он унаследовал от замыкания и никогда не обновляется.так как функция больше не инициализируется
Если вообще, по любой причине вы хотите, чтобы data1 был доступен в useEffect
, вы должны передать его в качестве второго аргумента useEffect
useEffect( () => () => console.log( ["unmount",data1] ), [data1] );
В этом случае эффект будет очищен при любом изменении data1
Вы также можете использовать useRef
для хранения данных и доступа к ним в режиме unmount.
function App() {
const [data1, setData1] = useState(0);
const refAttr = useRef();
useEffect(
() => () => {
console.log("unmount", refAttr.current);
},
[]
);
useEffect(() => {
setInterval(() => {
setData1(data1 => {
refAttr.current = data1 + 1;
return data1 + 1;
});
}, 1000);
}, []);
return (
<div className="App">
<h1>Hello CodeSandbox</h1>
<h2>Start editing to see some magic happen!</h2>
</div>
);
}
Рабочая демоверсия