【发布时间】:2017-12-25 02:28:29
【问题描述】:
假设您有以下 TSX 代码:
render() {
const someParameter = 5;
return (
<div onClick={() => this.doSomething(someParameter)}></div>
);
}
现在,我们知道我们不应该将这样的粗箭头函数传递给 onClick 处理程序,因为它每次都会创建一个新函数,从而强制重新渲染(当我们'将此回调传递给深层组件,而不仅仅是 div)。
那么解决方案是,如果没有参数,将doSomething 绑定到我们类的构造函数中的this,如this.doSomething = this.doSomething.bind(this),然后将绑定的函数作为回调传递。但是,这在我们的例子中并没有削减它,因为我们想将一个参数传递给函数 - someParameter。想象一下, someParameter 不仅仅是一个像上面那样的愚蠢的常量,而是一个数组中的元素,我们在我们的渲染方法中的一个数组上的 map() 中得到它。我们如何处理这种情况?也就是说,我们如何传递一个不是每次都从头开始创建的函数,从而破坏我们仅在必要时才智能地重新渲染的能力?
谢谢!
【问题讨论】:
-
在这种情况下确定
"that we shouldn't pass fat arrow functions"之前,我们确实应该对我们的应用程序进行基准测试。当然,如果 render 被调用 很多 次,那是次优的,但否则它可能没问题。它读起来也很清楚,并且会进行类型检查。 -
我同意 Aluan 的观点。如果您没有性能问题,则可能无需担心这一点。除非您引起大量级联的重新渲染,否则在计算成本方面可能没问题,您可以担心清晰度和简洁性。
-
不过,它破坏了使用 Redux 的很大一部分好处,尤其是当您在高级别传递回调时。另外,我的问题不是“讨论这种性能优化的好处”,而是“我们如何做到这一点?”
标签: javascript reactjs typescript