我知道闭包是如何工作的,但我无法理解如何在react中创建过时的闭包 useEffect
在没有穷举依赖项数组的情况下。为此,我试图复制一个过时的闭包,就像react的一样 useEffect
不使用 useEffect
,但我无法创建它。我的代码不会创建过时的闭包,而是在每个间隔上记录一个正确的值。请看一下下面的片段并告诉我:
我做错了什么?我应该怎么做才能创建一个像我们在react中得到的那样陈旧的闭包呢 useEffect
当我们不提供完整的依赖项数组时(参考代码在文章末尾)
当我们没有在useeffect中给出详尽的依赖项时,为什么会创建过时的闭包?为什么代码不在 useEffect
hook的回调只使用词法作用域,就像普通函数一样,并打印实际值?
function createIncrement(incBy) {
let value = 0;
function increment() {
value += incBy;
console.log(value);
}
function useEffect(fun) {
fun()
}
useEffect(function() {
setInterval(function log() {
// what should I do to create a stale closure here?
// So that if I change the value it should show me the old value
// as it does when using React's useEffect without exhaustive dependencies array
console.log(`Count is: ${value}`); // prints correct value each time
}, 2000);
});
setTimeout(() => {
increment(); // increments to 5
increment(); // increments to 6
}, 5000);
return [increment];
}
const [increment] = createIncrement(1);
increment(); // increments to 1
increment(); // increments to 2
increment(); // increments to 3
increment(); // increments to 4
为完整起见,以下是使用react的useeffect的代码片段,其中我们没有为react的useeffect提供详尽的依赖项数组,因此创建了一个过时的闭包:
import React, { useState, useEffect } from "react";
import ReactDOM from "react-dom";
import "./styles.css";
function WatchCount() {
const [count, setCount] = useState(0);
useEffect(function () {
setInterval(function log() {
// No matter how many times you increase the counter
// by pressing the button below,
// this will always log count as 0
console.log(`Count is: ${count}`);
}, 2000);
}, []);
return (
<div>
{count}
<button onClick={() => setCount(count + 1)}>Increase</button>
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<WatchCount />, rootElement);
暂无答案!
目前还没有任何答案,快来回答吧!