总感觉很多文章都提到闭包陷阱
奇怪的是我平时的开发并没有遇到过
我感觉闭包陷阱并没有必要称为陷阱,而仅仅是闭包特性,来源于 react 的特性(心智负担?)
就如 dan 所说:useEffect 拿到的总是定义它的那次渲染中的 props 和 state。这能够避免一些 bugs,但在一些场景中又会有些讨人嫌。
具体特性可以阅读 dan 佬的博客文章useEffect 完整指南
function Counter() {
const [count, setCount] = useState(0)
useEffect(() => {
setInterval(() => {
console.log('setInterval:', count)
}, 3000)
}, [])
return (
<div>
<p>{count}</p>
<button onClick={() => setCount((pre) => pre + 1)}>加一</button>
</div>
)
}
上面这个案例,一直点击加一按钮,打印的一直是 0,这就是所谓的闭包陷阱
这个问题在于 useEffect 的 deps 填的是[],那只有第一次渲染才会使用闭包保存 state,此时 count 就是 0
更像是对 api 的不正确使用,总不能因为 react 所有的渲染问题都是因为函数组件闭包而叫闭包陷阱吧
react 的函数组件会在每次渲染保存那次渲染的 props 和 state(闭包)
这就是闭包特性,和函数的闭包类似的特性,这就是为什么写 react 像写 js,不仅仅是因为 jsx
23.08.03