问题描述
问题代码如下:
export default props => {
const {detail, option = {}} = props.data;
const [info, setInfo] = useState({});
useEffrct(() => {
setInfo({...detail, ...option});
}, [option])
}
当props.data 的值中没有 option 的时候,就死循环了, 报错如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-olv7zpDB-1606299982412)(en-resource://database/544:1)]
原因
虽然后面发现这个问题是因为很蠢的代码造成的,但还是要记录一下!!!警示自己
- 每次state更新,页面就会重新渲染。
- 由于在 useEffect 中使用了setState,执行useEffect 就会重新渲染。
- 获取detail 和 option 的值没有依赖,所以页面渲染就会重新取值。
- 由于给option值赋了默认值,每次重新取值就会重新赋值一个空对象
- 空对象 {} !== {}
- useEffect 依赖于 option, option 更新就会重新执行useEffect中的代码
- 所以每次页面重新渲染,option的值就会变化,导致 再次执行useEffect中的代码,然后再次重新渲染,进入死循环。
解决方案
option不设置默认值,在使用时进行为空判断
版权声明:本文为qq_22836769原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。