useEffect内部不能修改state的疑问
来源:14-16 Hooks使用中的几个注意事项
weixin_慕圣3479985
2021-06-30
介绍说:
- 依赖为 [] 时: re-render 不会重新执行 effect 函数
- 没有依赖:re-render 会重新执行 effect 函数
那就是说如果依赖为[],rerender的时候,useEffect里的函数不会重新执行。既然都不会重新执行,就触发不了setCount(++countRef.current)
? 那为什么countRef还能不断+1呢?
function UseEffectChangeState() {
const [count, setCount] = useState(0)
const countRef = useRef(0)
useEffect(() => { // 这个函数re-render的时候不会执行,那为什么可以执行到里面的setCount(++countRef.current)呢?
console.log('useEffect...', count)
// 定时任务
const timer = setInterval(() => {
console.log('setInterval...', countRef.current)
// setCount(count + 1)
setCount(++countRef.current)
}, 1000)
return () => clearTimeout(timer)
}, []) // 依赖为 []
// 依赖为 [] 时: re-render 不会重新执行 effect 函数
// 没有依赖:re-render 会重新执行 effect 函数
return <div>count: {count}</div>
}
写回答
2回答
-
慕移动8149343
2022-04-05
在依赖项为 空数组时, 是会修改state的,因为为空数组时, useEffect在初始化时, 会执行一次
老师课程中讲的不能修改, 是因为,useEffect 里边的轮训,每次拿到的count都是最初的值, 然后每次计算完成后, 数据到 渲染return<div>{count}</div>这里count看起来就不会改变 不会改变就不会渲染。应该就是diff算法优化吧
00 -
双越
2021-06-30
你可以在这里插入一行 console.log('exec fn', Date.now()) ,看是否会多次执行?
012022-01-11
相似问题