对于事件处理程序,可以在react中使用闭包吗?例如,我在导航中有一些功能和很多菜单,在导航组件中我使用的是这样的:
handleMenuClick(path) {
return () => router.goTo(path)
}
...
<MenuItem
handleTouchTap={this.handleMenuClick('/home')}
>
还是我应该只喜欢箭头功能?
<MenuItem
handleTouchTap={() => router.goTo('/home')}
>
第一个变种确实使代码更清洁,但是我担心大量此类元素的性能
两者都应避免。
虽然它们都可以工作,但是它们都具有相同的弱点,即它们会导致不必要的渲染,因为该函数是动态创建的,因此将呈现为不同的对象。
您不希望使用任何一种方法,而是要以静态方式创建函数,然后将其传递。对于类似your的东西MenuItem
,它应该只获取路径的字符串,然后使用代码在内部进行路由。如果需要路由器,则应将其传递。
然后,该函数应该是一个前置bind
函数(通常在构造函数中)并刚刚传入。
export class MenuItem extends React.Component {
constructor() {
this.handleClick = () => this.props.router.go(this.props.path);
}
render() {
return (
<Button onClick={ this.handleClick }>Go to link</Button>
);
}
}
您可以在构造函数中使用箭头函数。这样,它不会重新创建每个渲染函数,因此可以避免不必要的渲染。该模式适用于单行简单功能。对于更复杂的函数,还可以将它们创建为单独的函数,然后bind
在构造函数中创建。
export class MenuItem extends React.Component {
handleClick() {
this.props.router.go(this.props.path);
}
constructor() {
this.handleClick = this.handleClick.bind(this);
}
render() { /* same as above */ }
}
关键是每次处理程序都是相同的功能。如果不同(您上面描述的两种方法都不同),那么React会不必要地重新渲染对象,因为每次都会有不同的功能。
以下是两篇文章,其中有更多详细信息:
我正在开发一个react本机应用程序,我想自动重新加载一个页面,有人能告诉我如何在react本机代码中做到这一点吗,我有三个组件,其中一个组件必须下拉,我只想重新加载当前屏幕这是我的页面图像,当有人更改语言时,我想重新加载页面
我有以下返回语句,即给出错误任何想法是错误的?
请教一下,闭包在 react 中不注意就会产生,尤其是传递 方法的时候,有什么解决闭包的方法吗?
问题内容: 我听说闭包可能会在计划于明年夏天发布的下一个Java标准中引入。 这种语法是什么样的? 我在某个地方读到,在Java中引入闭包比在Java 5中引入泛型要大得多。这是真的吗?利弊? (到目前为止,我们肯定知道下一个Java版本将不包含闭包) 要么 编辑: http://puredanger.com/tech/2009/11/18/closures-after- all/ :D edit
问题内容: 我有一个包装,其中包含一些表单输入,并保存数据并关闭。 我有,并且我的回调函数已执行,但是我看不到手动关闭叠加层的方法。我正在尝试使用Bootstrap 中的属性(可预测)不起作用。 问题答案: 向该元素添加一个ref,并在呈现元素后调用该方法。尚未测试,但应该可以工作:
问题内容: 在某些示例中,我看到了类似以下内容: 这些到底在做什么?它们是必备品吗? 问题答案: 正如finalFreq所指出的,我已经纠正了!“提供的示例将在React的未来版本中正常工作。不赞成使用React的方法,直接调用proptypes函数,但对组件进行注释将在当前和将来的版本中正常工作。” 如果您只是在JS中学习类型,我建议使用流程类型 ,它可以在构建时而不是在运行时使用。这在编辑器中