react this的问题

用react写component的时候,经常会遇到this的问题,比如setInterval()这个函数。

下面是一个时钟的例子,是正确的写法

class Clock extends React.Component {
  constructor(props){
    super(props);
    this.state={date:new Date()}
  }
  componentDidMount(){
    setInterval(
      function(){
       this.updateDate() 
      }.bind(this),
      1000
    );
  }
  updateDate(){
    this.setState({date:new Date()}
  }
  render() {
    return (
      <div>
        <h1>Hello, world!</h1>
        <h2>It is {this.state.date.toLocaleTimeString()}.</h2>
      </div>
    );
  }
}


ReactDOM.render(
  <Clock />,
  document.getElementById('root')
);

容易出错的点有

    setInterval(
      function(){
       this.updateDate() 
      }.bind(this),
      1000
    );

这里会遗漏bind(this)

遗漏之后,会报错。
如果不用bind(this),也可以用es6写法

setInterval(()=>this.updateDate(),1000)

最好是给setInterval()赋值给一个变量,当该component unmount的时候,取消该定时器。所以更加完善的代码如下。

var timer=setInterval(()=>this.updateDate(),1000);
componentWillUnmount(){
  clearInterval(this.timer)
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 深入JSX date:20170412笔记原文其实JSX是React.createElement(componen...
    gaoer1938阅读 12,471评论 2 35
  • 本笔记基于React官方文档,当前React版本号为15.4.0。 1. 安装 1.1 尝试 开始之前可以先去co...
    Awey阅读 12,313评论 14 128
  • 关于JSX 考虑这样一段代码:const element = Hello, world! ;这段代码既不是字符串...
    带三本书阅读 2,939评论 0 1
  • 1.必须要把该做的事情最在前面 万事俱备 如:施压准备工作。商品信息电脑里有全面的。水电工政策。。签约协议。流程。...
    chrisgd阅读 981评论 0 0
  • 前言最近在无意中看到一篇关于ConstraintLayout的文章,文章着重介绍了最新的ConstraintLay...
    LiaoJason阅读 7,838评论 6 12