【问题标题】:this object in React Component using ES6 classes使用 ES6 类的 React Component 中的 this 对象
【发布时间】:2016-12-01 12:24:25
【问题描述】:

我有一个带有textareaMsgInput 组件,其中onKeyUp 触发了一个处理函数。在处理函数内部,我尝试使用this.props 读取道具,但不确定为什么此处未定义道具。当然,解决方法是使用this.handler.bind(this)

export class MsgInput extends React.Component {
  constructor(props) {
        super(props);
  }

  inputHandler(e) {
    if(e.keyCode == 13 && !e.shiftKey) {
      this.props.onNewMessage({content: e.target.value});
      e.target.value = '';
      e.preventDefault();
    }
  }

  render() {
    return (
        <div className="controls">
            <textarea onKeyDown={this.inputHandler.bind(this)} className="msg-input" placeholder="Write something" disabled={!this.props.auth}></textarea>
        </div>
    );
  }
}

【问题讨论】:

标签: javascript reactjs this


【解决方案1】:

使用 ES6 类的 React 不会自动将您的回调绑定到组件实例,因此您必须像已经做的那样自己做。否则 this 在回调中将不可用。


this.inputHandler.bind(this)

这不是一个变通方法,而是它应该的方式。

另一种选择是使用 ES6 箭头函数,它会自动绑定 this

<textarea onKeyDown={(e) => this.inputHandler(e)}></textarea>

警告:在 jsx 中使用 .bind 或箭头函数会在每次渲染时创建一个新函数,这会影响性能。

作为最后的手段,您可以在构造函数中绑定不会有箭头函数性能损失的方法。

constructor(props) {
    super(props);
    this.inputHandler = this.inputHandler.bind(this);
}

【讨论】:

  • 加一个箭头函数。 bind 的调用对我来说似乎很乏味
  • 很好,谢谢;-) 如果解决了问题,您可以接受答案。
  • 为什么要在每次渲染时创建一个新函数?我宁愿在constructor 中使用.bind
  • 是的,这是另一点。每次在 redner 上都会创建函数回调。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 2016-01-16
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
相关资源
最近更新 更多