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

React-为什么在此示例中不需要绑定?

杭令
2023-03-14
问题内容

试图弄清楚React的基础知识。

查看此页面上的第二个示例:https :
//facebook.github.io/react/
我看到tick()函数设置Timer类的状态,将前一个值加1。

class Timer extends React.Component {
  constructor(props) {
    super(props);
    this.state = {secondsElapsed: 0};
  }

  tick() {
    this.setState((prevState) => ({
      secondsElapsed: prevState.secondsElapsed + 1
    }));
  }

  componentDidMount() {
    this.interval = setInterval(() => this.tick(), 1000);
  }

  componentWillUnmount() {
    clearInterval(this.interval);
  }

  render() {
    return (
      <div>Seconds Elapsed: {this.state.secondsElapsed}</div>
    );
  }
}

ReactDOM.render(<Timer />, mountNode);

但是,当我尝试实现自己的简单Counter类时,它失败了,并且出现控制台错误,提示 无法读取未定义的setState属性。

class Counter extends React.Component {
    constructor(props) {
        super(props);
        this.state = {count: 0};
    }

    increment(prevState) {
        this.setState((prevState) => ({
            count: prevState.count + 1
        }));
    }

  render() {
    return (
            <div className="main">
                <button onClick={this.increment}>{this.state.count}</button>
            </div>
    )
  }
}

一些谷歌搜索显示我必须将其绑定到增量函数。但是,为什么在我看到的第一个示例中不需要这样做?我将代码复制到CodePen,并在React
15.3.1上运行良好,在该示例中找不到任何类似于绑定的内容。只有在构造函数中添加绑定代码后,示例中的内容才开始起作用。

class Counter extends React.Component {
    constructor(props) {
        super(props);
        this.state = {count: 0};

        // THIS ONE LINE FIXED THE ISSUE
        this.increment = this.increment.bind(this);
    }

    increment(prevState) {
        this.setState((prevState) => ({
      count: prevState.count + 1
    }));
    }

  render() {
    return (
            <div className="main">
                <button onClick={this.increment}>{this.state.count}</button>
            </div>
    )
  }
}

问题答案:

回答您的问题:第一个示例使用arrow functions,它会自动执行上下文绑定。从文档:

箭头函数不会创建自己的此上下文,因此它具有来自封闭上下文的原始含义。

实际上,React中有一些绑定方法:

1)您可以绑定构造函数中的所有函数,如您所说:

constructor(props) {
    /* ... */
    this.increment = this.increment.bind(this);
}

2)使用箭头函数调用回调:

<button onClick={(e) => this.increment(e)}>

3).bind每次将其设置为回调时,都将其添加到方法引用的末尾,如下所示:

<button onClick={this.increment.bind(this)}>

4)在您的类中,使用箭头函数定义方法:

increment = (e) => {
  /* your class function defined as ES6 arrow function */
}

/* ... */

<button onClick={this.increment}>

为了对babel使用此语法,您必须启用此插件或使用Stage-2预设。



 类似资料:
  • 问题内容: 我们都知道我们需要在React中绑定函数以使其起作用。我知道为什么我们需要绑定它。 但是我不确定为什么我们不需要绑定箭头功能。 示例:使用箭头功能(无需绑定) }; 现在,使用功能(需要绑定) }; 我不是在问为什么我们需要绑定功能。我只想知道为什么箭头功能不需要绑定。 谢谢。 问题答案: 仅仅因为arrow函数的上下文中没有以下内容: 这个 论点 超 新目标 所以,当你引用此箭头功能

  • 问题内容: 我目前正在研究React JS和React Native 框架。在阅读关于Facebook的Flux和Redux实现的文章时,我遇到了Immutability或Immutable- JS库 。 问题是,为什么不变性如此重要?更改对象有什么问题?它不是使事情变得简单吗? 举个例子,让我们考虑一个简单的 新闻阅读器 应用程序,其打开屏幕是新闻标题的列表视图。 如果我设置说 最初 具有值 的

  • 我目前正在研究React JS和React本机框架。在中途,当我读到Facebook的Flux和Redux实现时,我遇到了不变性或不变性JS库。 问题是,为什么不变性如此重要?变异对象有什么错?这不是让事情变得简单吗? 举个例子,让我们考虑一个简单的新闻阅读器应用程序,它的开头屏幕是新闻标题的列表视图。 如果我设置一个对象数组的值,我不能操作它。这就是不可变原则所说的,对吗?(如果我错了请纠正我。

  • 问题内容: class SomeClass extends Component{ someEventHandler(event){ } render(){ return } } 我看到零件的不同版本。 版本有何不同?还是只是偏爱问题? 问题答案: 绑定不是特定于React的东西,而是在Javascript中的工作方式。每个函数/块都有其自己的上下文,对于函数而言,其功能更特定于其调用方式。当添加E

  • 我的问题是关于StatefulNetworkWordCount的例子: https://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/streaming/StatefulNetworkWordCount.scala Q1)stateDstream RDD由驱动程序或工作节点