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

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

场景描述:

        页面是一个 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> × 
             <Popover
                 title="错误 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> × 
             <Popover
                 title="错误 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里的内存变化等,定位到了原因就好解决了。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Vue中,当你需要修改一个组件的prop属性时,最好不要直接修改,因为这个值在父组件重新渲染时会被覆盖。相反,你应该基于prop的值使用一个data或computed属性来进行修改。这样做可以确保你的代码更加可靠,并且可以避免出现一些意想不到的问题。 ### 回答2: 在Vue.js中,我们可以通过props来向子组件传递数据。然而,当我们在子组件中直接对props进行修改时,这是不可取的。这是因为,props是通过父组件向子组件传递数据的,当父组件重新渲染时,props的值也会被重写,而这样会导致我们在子组件中对props的修改被覆盖,从而导致一些意想不到的问题。 为了避免这种问题,Vue.js的开发者建议我们不要直接对props进行修改。相反,我们应该使用数据或计算属性来基于props的值创建相应的组件内部数据,并对这些数据进行操作。这样,我们就能够避免对props进行直接修改,从而保证组件在重新渲染时不会出现问题。 使用数据或计算属性来创建内部数据的好处在于,数据和计算属性会自动更新,同时也会受到响应式系统的跟踪和管理。这意味着,当props的值发生改变时,组件内部的数据和计算属性也会自动更新,从而确保组件渲染的正确性。而这样的操作也更符合Vue.js的数据流管理规则,同时也能提高代码的可复用性和可维护性。 在实际开发中,我们应该尽量避免对props进行直接修改,而是采用数据或计算属性的方式来处理数据。这样能够确保组件的正确性和稳定性,并且可以提高代码的健壮性和可扩展性。 ### 回答3: 组件中的 props 是用来传递数据的,但是我们应该避免直接修改 props 的值,因为这个值会在父组件重新渲染时被覆盖掉。取而代之的是,我们可以使用一个基于 props 值的 data 或 computed 属性来使用这个值。 为什么要这样做呢?因为组件中的 props 具有单向数据流的特性,即只能由父组件传递到子组件,子组件不应该对 props 的值进行修改。如果几个子组件都对同一个 prop 进行了修改,那么就会导致这个 prop 的值在父组件重新渲染时被覆盖掉,从而引起不必要的 bug。 使用 data 或 computed 属性则可以避免这个问题。我们可以把需要对 prop 进行修改的值存放到一个 data 属性中,然后在组件内部使用修改过的值。当父组件重新渲染时,data 属性中的值不会被覆盖,从而可以避免后续的问题。 另外,使用 computed 属性也可以避免直接修改 prop 的问题。computed 属性可以根据 prop 的值计算得出一个新的值,这样就可以避免直接修改 prop 的值,同时又能够使用修改过的值。 综上所述,为了避免直接修改 prop 的问题,我们应该尽可能地使用 data 或 computed 属性来使用 prop 的值,这样才能保证组件的数据流是清晰的,避免出现不必要的 bug。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值