为什么我在上面的例子中需要'bind(this)'

问题描述 投票:0回答:2

我开始阅读Reactjs并在示例中遇到一个问题。在构造函数中将添加

this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);

但我无法理解,他们扮演的角色是什么,为什么需要他们?如果方法更改为箭头功能,则代码将起作用。谢谢。

完整示例:

class NameForm extends React.Component {
   constructor(props) {
      super(props);
      this.state = {value: ''};

      this.handleChange = this.handleChange.bind(this);
      this.handleSubmit = this.handleSubmit.bind(this);
    }

    handleChange(event) {
        this.setState({value: event.target.value});
    }

    handleSubmit(event) {
        alert('A name was submitted: ' + this.state.value);
        event.preventDefault();
    }

    render() {
        return (
           <form onSubmit={this.handleSubmit}>
              <label>
                Name:
                   <input type="text" value={this.state.value} onChange={this.handleChange} />
               </label>
               <input type="submit" value="Submit" />
           </form>
        );
    }
   }
reactjs
2个回答
1
投票

因为函数将从全局上下文中调用,所以this不会引用你的类实例,它会是undefined么?因为当change事件发生时,React将简单地调用你的方法,就像这个youHandler(event)一样,你可以看到该函数不具有this值,因为它是从全局上下文中调用的。我给你一个纯javascript(反应范围之外)的例子:

<input id="myInput" type="text" onChange="myFunction()">

<script>
 "use strict";

 function myFunction() {
   console.log(this); // this is undefined here
 }
</script>

所以你需要使用bind方法来设置this的值,它将等于当前的类实例

此外,箭头功能没有自己的this;创建箭头函数时,将使用封闭词汇上下文的此值。你可以阅读doc here,所以如果你写:

handleChange = event => {
   this.setState({value: event.target.value});
}

你必须问自己以​​下问题:当this函数被创建时,handleChange的价值是多少?这里它将等于NameForm类的当前实例,这实际上就是你想要的。


0
投票

它们之间没有区别。

但是,这是箭头函数的建议类字段的一部分,它不是ES6功能。

看看其他answer

© www.soinside.com 2019 - 2024. All rights reserved.