美文网首页
react-类组件的方法this指向

react-类组件的方法this指向

作者: _成长ing_ | 来源:发表于2021-01-09 15:55 被阅读0次

    实现一个很简单的功能,点击文字“开”“关”文字进行切替。

    class MyComponent extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          isClosed: false,   
        }
      }
      render() {
        const { isClosed } = this.state;
        return (
           <h1 onClick={this.changeToggle} >{isClosed ? '关' : '开'}</h1>
        );
      }
    
      changeToggle() {
        const { isClosed } = this.state;
        this.setState({
          isClosed: !isClosed,
        })
      }
    }
    ReactDOM.render(<MyComponent />, document.querySelector('#app'));
    

    上面代码运行后,点击文字,发现报错了

    错误信息.png
    错误分析
    才开始以为是babel中将方法变为严格模式,所以this指向为undefined,实际不是。

    在javascript的基础知识中,类中的方法中this的指向问题

    1. 类中的方法是挂在类实例的原型对象上的。
    2. 类中的方法中是严格模式的。
      使用类的实例调用类中的方法,this指向的是类的实例
    class Person {
      study() {
         console.warn(this);
      }
    }
    const p = new Person();
    p.study(); // 打印的是实例对象p
    

    把实例对象p的study方法复制给变量x,然后调用x方法(属于直接调用),打印的是undefined,直接调用为什么是undefined,而不是windows。原因就是类中的方法是在严格模式下运行的

    根本原因:在react的类组件中,render中的<h1 onClick={this.changeToggle} >{isClosed ? '关' : '开'}</h1>将MyComponent的实例上的原型上的changeToggle赋值给了点击事件,然后点击的时候调用(属于直接调用严格模式下的方法),所以为undefined

    解决办法:
    改变this的指向

    <h1 onClick={this.changeToggle.bind(this)} >{isClosed ? '关' : '开'}</h1>
    

    相关文章

      网友评论

          本文标题:react-类组件的方法this指向

          本文链接:https://www.haomeiwen.com/subject/sppcaktx.html