Bawiłem się Reactem i mam następujący składnik czasu, który po prostu renderuje Date.now()
się na ekranie:
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;
Jaki byłby najlepszy sposób, aby ten komponent aktualizował się co sekundę, aby ponownie narysować czas z perspektywy Reacta?
javascript
reactjs
śnieżynka
źródło
źródło
react-interval-rerender
Poniższy kod jest zmodyfikowanym przykładem ze strony React.js.
Oryginalny kod jest dostępny tutaj: https://reactjs.org/#a-simple-component
źródło
updater
@Waisky zasugerował:
Jeśli chcesz zrobić to samo, używając hooków:
Odnośnie komentarzy:
Nie musisz niczego podawać do środka
[]
. Jeśli umieścisztime
w nawiasach, oznacza to, że efekt jest uruchamiany za każdym razem, gdy wartośćtime
zmian się zmienia, tj. Wywołuje on zasetInterval
każdym razem nowy ,time
zmiany, czego nie szukamy. Chcemy tylko powoływaćsetInterval
raz, gdy składnik zostanie zamontowana, a następniesetInterval
wywołujesetTime(Date.now())
co 1000 sekund. Na koniec wywołujemy,clearInterval
gdy komponent jest odmontowany.Zwróć uwagę, że komponent jest aktualizowany na podstawie tego, jak go użyłeś
time
, za każdym razem, gdytime
zmienia się wartość . To nie ma nic wspólnego z wprowadzeniemtime
w[]
zuseEffect
.źródło
[]
) jako drugi argumentuseEffect
?W
componentDidMount
metodzie cyklu życia komponentu można ustawić interwał wywołania funkcji aktualizującej stan.źródło
źródło
Więc byłeś na dobrej drodze. Wewnątrz
componentDidMount()
mógłbyś zakończyć zadanie, implementując,setInterval()
aby wywołać zmianę, ale pamiętaj, że sposób zaktualizowania stanu komponentów jest za pośrednictwemsetState()
, więc wewnątrzcomponentDidMount()
mógłbyś to zrobić:Używasz również tego,
Date.now()
co działa, zcomponentDidMount()
implementacją, którą zaoferowałem powyżej, ale otrzymasz długi zestaw paskudnych aktualizacji liczb, które nie są czytelne dla człowieka, ale jest to technicznie czas aktualizowany co sekundę w milisekundach od 1 stycznia 1970 r., Ale my chcesz, aby ten czas był czytelny dla tego, jak my, ludzie, czytamy czas, więc oprócz uczenia się i wdrażaniasetInterval
chcesz się o nim dowiedziećnew Date()
itoLocaleTimeString()
wdrożyć go w następujący sposób:Zauważ, że usunąłem również
constructor()
funkcję, niekoniecznie jej potrzebujesz, mój refaktor jest w 100% równoważny z zainicjowaniem strony zconstructor()
funkcją.źródło
Ze względu na zmiany w React V16, w których metoda componentWillReceiveProps () została wycofana, jest to metodologia, której używam do aktualizacji komponentu. Zauważ, że poniższy przykład jest w skrypcie Typescript i używa statycznej metody getDerivedStateFromProps, aby uzyskać stan początkowy i stan zaktualizowany za każdym razem, gdy Props są aktualizowane.
źródło