react报错Error: Too many re-renders. React limits the number of renders to prevent an infinite loop.


一、报错语句是什么意思?

Error: Too many re-renders. React limits the number of renders to prevent an infinite loop.
错误:重新渲染过多。React限制渲染的数量以防止无限循环。

二、复现步骤,及其改法

1.错误代码

代码如下(示例):

  const handlePreview = (url) => {
    setIsModalVisible(true)
    setPreviewUrl(url)
  }
 return (
        <div className="img-item" key={index}>
          <img
            style={{ width: "100%", height: "100%" }}
            src={item.url}
            alt={item.name}
            onClick={handlePreview(item.url)}
          />
         </div>
        );

2.修改方式

代码如下(示例):

  const handlePreview = (url) => {
    setIsModalVisible(true)
    setPreviewUrl(url)
  }
 return (
        <div className="img-item" key={index}>
        method===1?
        // 方法(1)
          <img
            style={{ width: "100%", height: "100%" }}
            src={item.url}
            alt={item.name}
            onClick={()=>handlePreview(item.url)}
          />
          :
          // 方法(2)
          <img
            style={{ width: "100%", height: "100%" }}
            src={item.url}
            alt={item.name}
            onClick={handlePreview.bind(this,item.url)}
          />
         </div>
        );

3.报错原因

在react中 handlePreview(item.url)会直接执行,不是点击触发

4.bind(this,data)

语法:
fun.bind(thisArg[, arg1[, arg2[, …]]])
thisArg 当绑定函数被调用时,该参数会作为原函数运行时的 this 指向。当使用 new 操作符调用绑定函数时,该参数无效。
arg1, arg2, … (可选)当绑定函数被调用时,这些参数加上绑定函数本身的参数会按照顺序作为原函数运行时的参数。

bind后的this指向的是上下文,也就是这个组件,这个组件才有你所需要的方法,不懂没关系看代码↓

	this.all = '外部'
	var obj = {
		all:'内部',
		cb:function(){
			console.log(this.all)
		}
	}
	obj.cb();                         //  内部
	var out = obj.cb;
	out();                            //  外部
	var internal = out.bind(obj)
	internal();                       //  内部

总结

	可以采用箭头函数的方式,也可以采用bind()的方式解决此报错。有时间可以私下拓展一下bind()其他用法。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值