Имея в виду этот код:
var Component = React.createClass({
getInitialState: function () {
return {position: 0};
},
componentDidMount: function () {
setTimeout(this.setState({position: 1}), 3000);
},
render: function () {
return (
<div className="component">
{this.state.position}
</div>
);
}
});
ReactDOM.render(
<Component />,
document.getElementById('main')
);
Разве состояние не должно измениться только через 3 секунды? Это сразу меняется.
Моя основная цель здесь - менять состояние каждые 3 секунды (с setInterval()
), но, поскольку это не работало, я попробовал setTimeout()
, что тоже не работает. Есть свет на этом? Спасибо!
javascript
reactjs
Jbarradas
источник
источник
foo(bar())
тоbar
будет выполнен первый и ее возвращаемое значение передаетсяfoo
.foo()
здесь точно выполняетсяbar
после желаемого тайм-аута. Или я совершенно не прав, и он выполняется сразу, а возвращает значение только через желаемое время?bar
, а не вызывать его и передавать возвращаемое значение. Вы ожидали, что поведение пользователяfoo(bar())
изменится в зависимости от того, чтоfoo
он делает? Это было бы действительно странно.Ответы:
Делать
В противном случае вы передаете результат
setState
вsetTimeout
.Вы также можете использовать стрелочные функции ES6, чтобы избежать использования
this
ключевого слова:источник
setTimeout(() => {this.setState({ position: 1 })}, 3000)
ES6 : @PositiveGuy не уверен, исследовали ли вы это самостоятельно с тех пор, как этот вопрос был опубликован, но если вы этого не сделали: исходный пример Даниэля должен.bind(this)
ограничитьthis
контекстsetState
- иначе ,this
будет автоматически ссылаться на контекст, в котором он вызывается (в данном случае, на анонимныйfunction
объектsetTimeout
). Однако стрелочные функции ES6 имеют лексическую область видимости - они ограничиваютсяthis
контекстом, в котором они вызываются.Вышеупомянутое также будет работать, потому что функция стрелки ES6 не меняет контекст
this
.источник
this
.Каждый раз, когда мы создаем тайм-аут, мы должны очистить его для componentWillUnmount, если он еще не сработал.
источник
Я знаю, что это немного устарело, но важно отметить, что React рекомендует очищать интервал, когда компонент отключается: https://reactjs.org/docs/state-and-lifecycle.html
Поэтому я хотел бы добавить этот ответ к этому обсуждению:
источник
setState
вызывается немедленно из-за скобок! Оберните его анонимной функцией, а затем вызовите:источник
Вы не сказали, кто вызвал setTimeout
Вот как вы вызываете тайм-аут без вызова дополнительных функций.
1. Вы можете сделать это без дополнительных функций.
Использует function.prototype.bind ()
setTimeout принимает местоположение функции и сохраняет его в контексте.
2. Другой способ сделать то же самое, даже написав еще меньше кода.
Возможно, в какой-то момент использует тот же метод привязки
SetTimeout принимает только местоположение функции, а у функции уже есть контекст? Во всяком случае, работает!
ПРИМЕЧАНИЕ. Они работают с любой функцией, которую вы используете в js.
источник
Ваш код scope (
this
) будет вашимwindow
объектом, а не вашим реагирующим компонентом, и именно поэтому онsetTimeout(this.setState({position: 1}), 3000)
выйдет из строя.Это исходит из javascript, а не из React, это закрытие js
Итак, чтобы привязать текущую область действия компонента реакции, сделайте следующее:
Или, если ваш браузер поддерживает es6 или ваши проекты поддерживают компиляцию es6 в es5, попробуйте также стрелочную функцию, так как стрелочная функция предназначена для исправления этой проблемы:
источник
Есть 3 способа получить доступ к области внутри функции setTimeout
Первый,
Во-вторых, использовать стрелочную функцию ES6, потому что стрелочная функция не имеет области действия (это)
Третий - привязать область видимости внутри функции
источник
Вы сделали ошибку объявления синтаксиса, используйте правильное объявление setTimeout
источник
Попробуйте использовать синтаксис ES6 установленного тайм-аута. Обычный javascript setTimeout () не будет работать в React JS
источник