Oczekuję, że stan załaduje się ponownie po zmianie właściwości, ale to nie działa i user
zmienna nie jest aktualizowana przy następnym useState
wywołaniu, co jest nie tak?
function Avatar(props) {
const [user, setUser] = React.useState({...props.user});
return user.avatar ?
(<img src={user.avatar}/>)
: (<p>Loading...</p>);
}
reactjs
react-hooks
Vitalyster
źródło
źródło
React.useEffect
do ustawienia stanu początkowego za każdym razem.Komponenty funkcjonalne, w których używamy
useState
do ustawiania wartości początkowych naszej zmiennej, jeśli przekażemy wartość początkową przez właściwości, będzie ona zawsze ustawiała tę samą wartość początkową, dopóki nie użyjeszuseEffect
hooka,na przykład w twoim przypadku to wykona twoją pracę
React.useEffect(() => { setUser(props.user); }, [props.user])
Funkcja przekazana do useEffect zostanie uruchomiona po zatwierdzeniu renderowania na ekranie.
Domyślnie efekty są uruchamiane po każdym ukończonym renderowaniu, ale możesz je uruchomić tylko wtedy, gdy zmienią się określone wartości.
jeśli przekażesz tylko jeden argument do useEffect, będzie on uruchamiał tę metodę po każdym renderowaniu, możesz zdecydować, kiedy to uruchomić
FunctionYouWantToRunAfterEveryRender
, przekazując drugi argument do useEffectjak zauważyłeś, przechodzę przez [props.user] teraz
useEffect
uruchomi tęFunctionYouWantToRunAfterEveryRender
funkcję tylko wtedy, gdyprops.user
zostanie zmienionaMam nadzieję, że pomoże to w zrozumieniu, daj mi znać, jeśli wymagane są jakieś ulepszenia, dziękuję
źródło
Parametr przekazany do
React.useState()
jest tylko wartością początkową dla tego stanu. React nie rozpozna tego jako zmiany stanu, ustawi tylko domyślną wartość. Będziesz chciał początkowo ustawić stan domyślny, a następnie wywołać warunkowesetUser(newValue)
, co zostanie rozpoznane jako nowy stan i ponownie wyrenderować komponent.Zalecałbym ostrożność przy aktualizowaniu stanu bez jakiegokolwiek warunku, aby nie był on stale aktualizowany, a zatem ponowne renderowanie za każdym razem, gdy otrzymywane są rekwizyty. Możesz rozważyć przeniesienie funkcji stanu do komponentu nadrzędnego i przekazanie stanu rodzica do tego awatara jako rekwizytu.
źródło
Zgodnie z dokumentacją ReactJS o hookach :
Twoja jedyna interakcja powinna mieć miejsce przy zmianie rekwizytów, która wydaje się nie działać. Możesz (nadal zgodnie z dokumentacją) użyć komponentu componentDidUpdate (prevProps), aby aktywnie przechwytywać każdą aktualizację właściwości.
PS: Nie mam wystarczającej ilości kodu do oceny, ale czy nie mógłbyś aktywnie ustawićUser () wewnątrz funkcji Avatar (props)?
źródło
W świecie reakcji należy w takich przypadkach zaktualizować swój stan w funkcji componentWillRecieveProps (nextProps).
źródło