2016-12-23 3 views
0

Я пытаюсь начать с реагирования. Изучив примеры кода, я встретил довольно странную вещь. Это ссылка [React tutorial]. Это код из раздела lifecycles;-js- Реагент «компонент сделал монтирование» пример

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

Таким образом, при установке интервала, для которого используется функция стрелки? Я попробовал иначе (this.tick()), но он не работал должным образом.

+2

[Функции стрелок не переустанавливают 'this'.] (Https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions #No_binding_of_this) –

+0

Спасибо! –

ответ

1

setInterval необходимо передать ссылку на функцию, так что вы могли бы написать

setInterval(() => this.tick(), 1000 ); 

Это не работает this.tick, он просто говорит setInterval запустить клеща, когда он выбирает. Функция стрелки связывает «это» как ваш компонент.

Однако setInterval( function() { this.tick(); }, 1000 ); не связывает это с вашим компонентом, так что вам нужно будет написать setInterval(this.tick.bind(this), 1000 );

Если вы пишете setInterval( this.tick(), 1000 ); то тик запускается до того, как передается setInterval, а возвращаемое значение клеща является то, что будет использоваться setInterval.

Я надеюсь, что это ясно. setInterval просто хочет ссылку на функцию :)

+0

Отсутствие различия между -this.tick() - и -this.tick-. Я думаю, это потому, что сказал Дэн принц. Это воспринимается как глобальный объект, поэтому он не может получить доступ к этим «вещам»: d Спасибо людям! –

+0

oh да, this.tick не работает, если вызывается внутри setInterVal, потому что когда setInterval вызывает this.tick, он использует контекст внутри setInterval. Так что ЭТО не будет вашим компонентом, но это будет любой контекст setInterval. –