【问题标题】:Bind in constructor or fat arrow in class在类中的构造函数或胖箭头中绑定
【发布时间】:2016-11-23 09:36:23
【问题描述】:

所以我想知道这之间是否有区别:

import React, { Component, PropTypes } from 'react';

class Example extends Component {
  constructor(props) {
    super(props);
    this.state = {
      page : 1
    };
  }

  nextPage = () => {
    this.setState({ page: this.state.page + 1 });
  }

  previousPage= () => {
    this.setState({ page: this.state.page - 1 });
  }

  render() {
    const { page } = this.state;
    return (
      <div>
        <H1>{page}</H1>
        <Button onClickPrevious={this.previousPage} onClickNext={this.nextPage} />}
      </div>
    );
  }
}

或者

import React, { Component, PropTypes } from 'react';

class Example extends Component {   
    constructor(props) {
         super(props);
         this.nextPage = this.nextPage.bind(this);
         this.previousPage = this.previousPage.bind(this);
         this.state = {
              page: 1
             };
  }

  nextPage() {
    this.setState({ page: this.state.page + 1 });   }

  previousPage() {
    this.setState({ page: this.state.page - 1 });   }

  render() {
    const { page } = this.state;
    return (
      <div>
        <H1>{page}</H1>
        <Button onClickPrevious={this.previousPage} onClickNext={this.nextPage} />}
      </div>
    );   
  }
}

我想知道每个功能的性能是否相同,或者还有其他好处吗?

进一步阅读(https://medium.com/@esamatti/react-js-pure-render-performance-anti-pattern-fb88c101332f#.khf30fuaq)

【问题讨论】:

  • 既不需要绑定也不需要粗箭头,因为您是从Component 扩展的,因此反应会为您绑定这些功能
  • @Dogoku class 方法没有被隐式绑定
  • 我又看了一遍问题,你是对的

标签: javascript reactjs


【解决方案1】:

绑定事件处理程序的最佳位置是您的constructor。这样,您的事件处理程序将其上下文绑定到组件实例。您可以访问 props and state 并从此类绑定处理程序调用 setStateforceUpdate

arrow 函数绑定也有自己的优势。 箭头函数总是从它们被定义的地方获取上下文。所以其实这个例子等价于:

箭头函数语法是一种定义函数的方式,语法如下:

change = (ev) => this.setState({ text: ev.target.value });

这比编写function(ev) { .... } 语句更简洁。如果您没有在=&gt; 箭头之后提供{} 括号,则该函数是一个立即返回的表达式。所以这对类似的东西进行了脱糖:

change = function(ev) { return this.setState({ text: ev.target.value }); }.bind(this);

因此.bind()arrow 函数都会导致创建一个新函数

最后,您要绑定函数的方式取决于您的用例。

更多详情可以阅读this文章:

【讨论】:

  • 好吧,这是有道理的。但是你是说如果你在构造函数中绑定它,你可以访问状态和道具。但是在第一个例子中(我没有隐式绑定我的函数)我可以改变状态。这两个例子都可以正常工作(因为我使用了绑定上下文的胖箭头函数,对吧?)。
  • 在最古老的组件类语法中称为 React.createClass 绑定问题是不存在的。这是因为 React.createClass 在后台执行自动绑定。您在传递给 React.createClass 的对象中定义的所有方法都将自动绑定到组件实例。这意味着您始终可以从这些方法中使用 setState、访问 props 和 state 等。引用:reactkungfu.com/2015/07/…
猜你喜欢
  • 2021-09-26
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
  • 2018-03-04
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多