React:每次渲染都会调用 onClick 处理程序?

Posted

技术标签:

【中文标题】React:每次渲染都会调用 onClick 处理程序?【英文标题】:React: onClick handler is getting called on every render? 【发布时间】:2017-05-31 23:57:54 【问题描述】:

我在学习React,跟着this tutorial做了一个简单的井字游戏,你可以view here in CodePen.

我对箭头函数在 Square 组件的 onClick 属性中的工作方式感到困惑,该属性在 Board 组件的 renderSquare 函数内部返回:onClick=() => this.props.onClick(i)。同样也是我拥有onClick= (i) => this.handleClick(i) 的游戏组件。我以为我可以在没有箭头函数的情况下编写它(就像onClick=this.handleClick(i)),但这会破坏游戏。

【问题讨论】:

粗略解释:onClick 采用在事件触发时执行的函数。当() => this.foobar(blah) 完成时,创建一个箭头函数,它使用参数blah 执行foobar。你不能做this.foobar(blah) 的原因是因为它会执行函数并传递返回值。 onClick 需要一个函数执行,而不是一个值。 看到这个:***.com/questions/29810914/… 您可能还想阅读facebook.github.io/react/docs/handling-events.html 【参考方案1】:

onClick 需要一个函数。箭头函数没有自己的this;使用封闭执行上下文的this 值。 箭头函数是以下的替代品

onClick=this.handleClick.bind(this,i)

当你运行它时它不起作用

onClick=this.handleClick(i) 

因为在这种情况下,它将调用一个函数,并且该函数将传递一个返回值,该返回值将在每次调用 render 时进行评估。因此,如果您在 onClick 函数中执行导致重新渲染的操作,例如 setState,您的应用程序将陷入无限循环。因此onClick 需要一个函数而不是一个值,所以除非你从onClick 处理程序返回一个函数,否则你不应该直接调用它。

上面的箭头函数起到了将参数绑定到函数的作用

【讨论】:

我认为如果不知道handleClick 里面是什么,就无法得出这个结论,它还不如给你一个新的函数回调作为一个值。当然它适合这个问题,但它真的取决于handleClick 函数在做什么 @Icepickle,是的,你是对的,这是我的一个旧答案,没有那个解释,我正在编辑它,提供更多细节。

以上是关于React:每次渲染都会调用 onClick 处理程序?的主要内容,如果未能解决你的问题,请参考以下文章

Reactjs:在onClick方法中传递参数而不会造成性能损失[重复]

为啥我的 onClick 在渲染时被调用? - React.js

React Axios Delete 每次都不渲染

这是在 React js 中的按钮 onClick 中调用功能组件的最简单方法

为啥我没有进入 React 无限重新渲染循环?

每当我输入内容时组件都会重新渲染,但我只想在按钮的 onClick 之后重新渲染