• setInterval中this


      今天使用react做钟表,自然用到了setInterval,但是出现this指向不明的问题。

     1 <html>
     2 <head>
     3 <meta charset="UTF-8" />
     4 <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
     5 <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
     6 <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
     7 </head>
     8 <body>
     9 
    10 <div id="example"></div>
    11 <script type="text/babel">
    12 class Clock extends React.Component {
    13   constructor(props) {
    14     super(props);
    15     this.state = {date: new Date()};
    16   }
    17 
    18   componentDidMount() {
    19     this.timerID = setInterval(
    20       () => this.tick(),
    21       1000
    22     );
    23   }
    24 
    25   componentWillUnmount() {
    26     clearInterval(this.timerID);
    27   }
    28 
    29   tick() {
    30     this.setState({
    31       date: new Date()
    32     });
    33   }
    34 
    35   render() {
    36     return (
    37       <div>
    38         <h1>Hello, world!</h1>
    39         <h2>现在是 {this.state.date.toLocaleTimeString()}.</h2>
    40       </div>
    41     );
    42   }
    43 }
    44 
    45 ReactDOM.render(
    46   <Clock />,
    47   document.getElementById('example')
    48 );
    49 </script>
    50 
    51 </body>
    52 </html>

      在componentDidMount中setInterval使用了ES6的箭头函数,有建议可以使用ES6以前的函数是这样

    1 let that = this;
    2 this.timerID = setInterval(function () {
    3   return that.tick();
    4 },1000);

      这样使可以的,但是过于繁琐,观察了一下,setInterval第一个参数不就是传一个函数就行嘛,干嘛这么费劲,于是我这样写

    1 this.timerID = setInterval(
    2   this.tick,
    3 1000);

      结果报错了

      什么?找不到setState,那就是this不对啊,果然setInterval中第一个参数若果是一个裸函数的话,函数中this指向的是window。

      于是改为

    1 this.timerID = setInterval(
    2   this.tick.bind(this),
    3 1000);

      完美运行!

  • 相关阅读:
    Android资源列表
    GTD资源列表[070826更新] [GTD]
    Table显示滚动条
    html语言中的meta元素
    GridView分页的实现
    图解CSS的padding,margin,border属性
    javascript moveTo() 函数
    IE6 中的最大最小寬度和高度 css 高度 控制(兼容版本)
    enableEventValidation
    window.resizeTo()和window.open()
  • 原文地址:https://www.cnblogs.com/guanghe/p/10711032.html
Copyright © 2020-2023  润新知