Я все еще новичок в React, но я медленно продирался и наткнулся на то, на чем застрял.
Я пытаюсь создать компонент «таймер» в React, и, честно говоря, я не знаю, правильно ли я делаю это (или эффективно). В моем коде ниже, я установить состояние , чтобы вернуть объект { currentCount: 10 }
и играл с componentDidMount
, componentWillUnmount
и render
я могу получить только состояние на « обратный отсчет» от 10 до 9.
Вопрос из двух частей: что я ошибаюсь? И есть ли более эффективный способ использования setTimeout (вместо использования componentDidMount
& componentWillUnmount
)?
Заранее спасибо.
import React from 'react';
var Clock = React.createClass({
getInitialState: function() {
return { currentCount: 10 };
},
componentDidMount: function() {
this.countdown = setInterval(this.timer, 1000);
},
componentWillUnmount: function() {
clearInterval(this.countdown);
},
timer: function() {
this.setState({ currentCount: 10 });
},
render: function() {
var displayCount = this.state.currentCount--;
return (
<section>
{displayCount}
</section>
);
}
});
module.exports = Clock;
bind(this)
больше не нужен, react делает это самостоятельно.this.timer.bind(this)
поскольку this.timer сам по себе не работалclass Clock extends Component
не связывает автоматически. Таким образом, это зависит от того, как вы создаете свои компоненты, нужно ли вам связывать.Ответы:
Я вижу 4 проблемы с вашим кодом:
setState
метод для фактического изменения состоянияПопробуем исправить это:
Это приведет к уменьшению таймера с 10 до -N. Если вам нужен таймер, который уменьшается до 0, вы можете использовать слегка измененную версию:
источник
componentDidMount
это подходящее место для запуска событий на стороне клиента, поэтому я бы использовал его для запуска обратного отсчета. О каком еще методе инициализации вы думаете?Обновлен 10-секундный обратный отсчет с использованием
class Clock extends Component
источник
Обновлен 10-секундный обратный отсчет с использованием хуков (предложение новой функции, которое позволяет использовать состояние и другие функции React без написания класса. В настоящее время они находятся в React v16.7.0-alpha).
источник
Если кто-то ищет подход React Hook к реализации setInterval. Об этом Дан Абрамов рассказал в своем блоге . Проверьте это, если вы хотите хорошо прочитать эту тему, включая классовый подход. В основном код представляет собой настраиваемый хук, который превращает setInterval в декларативный.
Также разместите ссылку CodeSandbox для удобства: https://codesandbox.io/s/105x531vkq
источник
Спасибо @dotnetom, @ greg-herbowicz
Если он возвращает "this.state is undefined" - привязать функцию таймера:
источник
Обновление состояния каждую секунду в классе реакции. Обратите внимание, что мой index.js передает функцию, возвращающую текущее время.
источник