当前位置: 首页 > 面试题库 >

React中的闭包

禄光霁
2023-03-14
问题内容

对于事件处理程序,可以在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会不必要地重新渲染对象,因为每次都会有不同的功能。

以下是两篇文章,其中有更多详细信息:

  • https://ryanfunduk.com/articles/never-bind-in-render/
  • https://daveceddia.com/avoid-bind-when-passing-props/


 类似资料:
  • 我正在开发一个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中学习类型,我建议使用流程类型 ,它可以在构建时而不是在运行时使用。这在编辑器中