Я играл с React и получил следующий компонент времени, который просто отображается Date.now()
на экране:
import React, { Component } from 'react';
class TimeComponent extends Component {
constructor(props){
super(props);
this.state = { time: Date.now() };
}
render(){
return(
<div> { this.state.time } </div>
);
}
componentDidMount() {
console.log("TimeComponent Mounted...")
}
}
export default TimeComponent;
Как лучше всего заставить этот компонент обновляться каждую секунду, чтобы перерисовать время с точки зрения React?
javascript
reactjs
снежный убийца
источник
источник
react-interval-rerender
Следующий код представляет собой измененный пример с веб-сайта React.js.
Исходный код доступен здесь: https://reactjs.org/#a-simple-component
источник
updater
@Waisky предложил:
Если вы хотите сделать то же самое, используя хуки:
По поводу комментариев:
Внутрь ничего пропускать не нужно
[]
. Если вы передадитеtime
скобки, это означает, что эффект запускается каждый раз приtime
изменении значения , т. Е. Он вызывает новыйsetInterval
каждый раз,time
changes, что не является тем, что мы ищем. Мы хотим , чтобы вызывать толькоsetInterval
один раз , когда компонент смонтирован , а затемsetInterval
звонятsetTime(Date.now())
каждые 1000 секунд. Наконец, мы вызываем,clearInterval
когда компонент размонтирован.Обратите внимание, что компонент обновляется в зависимости от того, как вы его использовали
time
, каждый раз, когдаtime
изменяется значение . Это не имеет ничего общего с вводомtime
в[]
изuseEffect
.источник
[]
) в качестве второго аргументаuseEffect
?В
componentDidMount
методе жизненного цикла компонента вы можете установить интервал для вызова функции, которая обновляет состояние.источник
источник
Итак, вы были на правильном пути. Внутри себя
componentDidMount()
вы могли бы завершить работу, выполнивsetInterval()
запуск изменения, но помните, что способ обновления состояния компонентов - черезsetState()
, поэтому внутриcomponentDidMount()
вы могли бы сделать это:Кроме того, вы используете то,
Date.now()
что работает, сcomponentDidMount()
реализацией, которую я предложил выше, но вы получите длинный набор обновлений неприятных чисел, которые не читаются человеком, но технически это время, обновляющееся каждую секунду в миллисекундах с 1 января 1970 года, но мы хочу , чтобы на этот раз для чтения , как мы люди чтения времени, поэтому в дополнении к обучению и реализацииsetInterval
вы хотите узнать оnew Date()
иtoLocaleTimeString()
и вы бы реализовать это нравится так:Обратите внимание, что я также удалил
constructor()
функцию, она вам не обязательно нужна, мой рефакторинг на 100% эквивалентен инициализации сайта с помощьюconstructor()
функции.источник
Из-за изменений в React V16, где componentWillReceiveProps () устарел, это методология, которую я использую для обновления компонента. Обратите внимание, что приведенный ниже пример находится в Typescript и использует статический метод getDerivedStateFromProps для получения начального состояния и обновленного состояния при каждом обновлении Props.
источник