当前位置: 首页 > 知识库问答 >
问题:

差异性。bind()到arrow函数()=>在React中的用法

丁曦哲
2023-03-14

假设我有一个函数GenerateList(),它更新状态并将其映射到一个onPoint到一个

<li className="some-classname"}  
    onClick={this.generateList('product')}> Product </li>

有时我会遇到以下错误:

警告:setState(...):无法在现有状态转换期间更新(例如在渲染内)。渲染方法应该是道具的纯粹功能...

诸如此类。我在互联网上寻找答案,得到了这样的答案:

<li className="some-classname"}  
    onClick={this.generateList.bind(this, 'product')}> Product </li>

但我也看到了一个答案(在Github中,但似乎找不到)

<li className="some-classname"}  
    onClick={() => this.generateList('product')}> Product </li>

主要区别是什么?哪个更合适、更有效?我们为什么要使用这样的。绑定()=


共有1个答案

缪修德
2023-03-14

如果你尝试:

<li className="some-classname"}  
    onClick={this.generateList('product')}> Product </li>

该函数将在每个渲染上执行-这会产生额外的渲染,这就是引发错误的原因。我们想要定义的是一个函数,该函数将在以后触发onClick时调用。

第二个是定义方法和。bind将React类this的上下文绑定到方法。请注意,bind函数返回一个函数的副本-因此它不调用函数,只定义它供onClick处理程序使用。

最后一个:

<li className="some-classname"}  
    onClick={() => this.generateList('product')}> Product </li>

这定义了一个匿名函数,但与第二个实现类似,不调用它。只有当触发onClick时,才会调用它。但是,在某些情况下,使用匿名函数可能会导致性能问题。该匿名函数将在每次渲染时定义—如果您有一个组件经常重新渲染,则可能会影响应用程序的性能。如果您确信该组件不会经常呈现,那么为了方便起见,匿名函数应该可以。

此外,使用bind时,您可以在组件类构造函数中声明它,如下所示:

  constructor(props) {
    super(props);
    this.state = {
      // your state
    };
    this.generateList = this.generateList.bind(this);
  }
 类似资料:
  • 问题内容: 我已经开始了一个项目,其中我在前端使用React JS,在后端使用node js。我使用webpack捆绑了JS文件。我将babel与其他必要的东西一起使用。当我在react类中使用箭头函数时,它会给出语法错误,例如: 模块构建失败:SyntaxError:意外令牌 但是我可以在节点中使用Arrow函数,没有任何问题。 这是我的webpack配置文件: 我的React文件: 如何解决这

  • 我有以下Jquery回调函数,我对它有一点怀疑(我不太了解Jquery): 如您所见,该函数只需向后端执行一个AJAX请求,为该请求设置参数。 数据类型呢?什么说?我在HTTP请求中发送的数据类型? 在这种情况下是“text”,因为我发送的是一个文本字符串,它呈现了XML代码?

  • 为什么这在Node.js控制台(在4.1.1和5.3.0中测试)中工作,但在浏览器中不工作(在Chrome中测试)? 这个代码块应该创建并调用一个匿名函数,该函数记录。 另外,当上述操作在节点中工作时。js,这不起作用: 也不是这个: 奇怪的是,当添加参数时,它实际上会在立即调用的部分抛出一个。

  • 本文向大家介绍javascript中call,apply,bind函数用法示例,包括了javascript中call,apply,bind函数用法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了javascript中call,apply,bind函数用法。分享给大家供大家参考,具体如下: 一.call函数 a.call(b); 简单的理解:把a对象的方法应用到b对象上(a里如果有thi

  • 这不是重复我的问题,我查了一下,更多的是关于内部匿名类。 我对Lambda表达式很好奇,并测试了以下内容: 如果给定一个数组中有1000个索引,那么对于一个包含1000个索引的循环,删除哪个条目会更快 最初的结果并不令人惊讶,因为我不知道自己会想出什么: 但后来,我决定将常量改为一百万,结果如下: 为了让阅读更简单,以下是结果: 我有以下问题: > 这背后的魔力是什么?当要使用的索引是*100时,

  • 箭头函数: 正规函数 这两个结果应该是相同的,但是看起来像上面定义的arrowFunc考虑第一个arg列表,而normalFunc考虑第二组arg列表。