当前位置: 代码迷 >> 综合 >> Too many re-renders. React limits the number of renderers to prevent an infinite loop...
  详细解决方案

Too many re-renders. React limits the number of renderers to prevent an infinite loop...

热度:29   发布时间:2023-12-11 23:54:06.0

原因:页面刷新进入了死循环,导致页面崩溃!  然后白屏了,,,

场景描述:

        页面是一个 ip 区间,在区间后面显示  一组数据是否都存在区间内的,都存在显示 ,部分存在显示 ×,并显示不存在区间内的 ip

Console报错信息:Too many re-renders. React limits the number of renderers to prevent an infinite loop...


页面崩溃的代码:

const [ errorIps, setErrorIps]= useState<string[]>([]);//页面
<Row><ipInput> </Input>   //IP区间的控件{                    //状态显示seeError(items[index].value)?<span> √ </span>: <span> × <Popovertitle="错误 IP "content={<div>{ errorIps }</div>}><a>查看</a></Popover></span> }
</Row>//判断方法
const seeError=(value:string[]):string[]=>{let errors:string[]=[];props.List.map((item)=>{value.map((ele)=>{if(ele===item){errors.push();}setErrorIps(errors);});});
}

崩溃原因:每当页面渲染时,会触发seeError方法,方法中每次都会重置errors数组,errors数组状态每次更新会引起页面重新渲染,页面渲染又会触发seeError方法,,,,因此进入了无穷无尽的页面渲染,导致页面崩溃。。。


正确的代码:(不让页面渲染时更新状态)

const [errors, setErrors]= useState<string[]>([]);//页面
<Row><ipInput> </Input>   //IP区间的控件{                    //状态显示seeError(items[index].value).length===0?<span> √ </span>: <span> × <Popovertitle="错误 IP "content={<div>{ seeError(items[index].value).join(',')}</div>}><a>查看</a></Popover></span> }
</Row>//判断方法
const seeError=(value:string[]):string[]=>{let errors:string[]=[];props.List.map((item)=>{value.map((ele)=>{if(ele===item){errors.push();}//setErrors(errors);  //这个就不要了});});//取而代之,return这才是最重要的if( props.List.length === errors.length && errors=== 0){  //条件是业务的需要return [];  }else{return errors;}
}

注:也不是说所有的页面渲染不能 setState(),这个页面是触发了函数,函数里触发了setState,而这个state是个数组,只要触发一定会使页面重新渲染。

有些布尔型或者number、string,基本类型是可以在页面更改的,react本身会判断一下是否相等,不等才更新,才会渲染。

另外,白屏由各种各样的原因导致,比如,内存泄漏、代码死循环,页面崩溃等,那么遇到了白屏我们不要怕,我们一步步来解决,首先先排查哪一块导致了白屏,白屏时Console里有没有报错信息,Network里的接口调用的情况,Performance里的内存变化等,定位到了原因就好解决了。

  相关解决方案