1

React docs implements a clock for demonstrating concepts such as states and lifecycle.

class Clock extends React.Component {
  constructor(props) {
    super(props);
    this.state = {date: new Date()};
  }

  componentDidMount() {
    this.timerID = setInterval(
      () => this.tick(),
      1000
    );
  }

  componentWillUnmount() {
    clearInterval(this.timerID);
  }

  tick() {
    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')
);

I was curious about why componentDidMount's setInterval uses an arrow function. It does't work without it, either by:

Implementation ONE:

setInterval(this.tick(), 1000)

Which passes the return of tick instead of calling it, either by doing:

Implementation TWO:

setInterval(this.tick, 1000)

Which throws an setState is not a function error.

It was asked before on stackoverflow, but the accepted answer is wrong, since it suggests coding IMPLEMENTATION TWO.

I guess the error is caused due to the scope of this. Inside setInterval, there's no this.setState, that's why binding solves it (as one of the others answers point out).

However, I would like to know how an arrow function can solve what otherwise would require binding.

nluizsoliveira
  • 355
  • 1
  • 9
  • 2
    In an arrow function, `this` is lexically scoped like any other variable. So inside the arrow function, `this` refers to `this` of `componentDidMount`. – Felix Kling Feb 16 '21 at 13:04

0 Answers0