Ich erwarte, dass der Status beim Ändern der Requisiten neu geladen wird, aber dies funktioniert nicht und die user
Variable wird beim nächsten useState
Aufruf nicht aktualisiert . Was ist falsch?
function Avatar(props) {
const [user, setUser] = React.useState({...props.user});
return user.avatar ?
(<img src={user.avatar}/>)
: (<p>Loading...</p>);
}
reactjs
react-hooks
Vitalyster
quelle
quelle
React.useEffect
, um den Anfangszustand jedes Mal festzulegen.Funktionskomponenten, mit denen wir
useState
Anfangswerte für unsere Variable festlegen. Wenn wir den Anfangswert über Requisiten übergeben, wird immer der gleiche Anfangswert festgelegt, bis Sie keinenuseEffect
Hook verwenden.Zum Beispiel wird Ihr Fall Ihren Job machen
React.useEffect(() => { setUser(props.user); }, [props.user])
Die an useEffect übergebene Funktion wird ausgeführt, nachdem das Rendern auf dem Bildschirm festgeschrieben wurde.
Standardmäßig werden Effekte nach jedem abgeschlossenen Rendering ausgeführt. Sie können sie jedoch nur dann auslösen, wenn sich bestimmte Werte geändert haben.
Wenn Sie nur ein Argument an useEffect übergeben, wird diese Methode nach jedem Rendern ausgeführt. Sie können entscheiden, wann dies
FunctionYouWantToRunAfterEveryRender
ausgelöst werden soll, indem Sie das zweite Argument an useEffect übergebenWie Sie bemerken, übergebe ich [props.user] jetzt
useEffect
wird dieseFunctionYouWantToRunAfterEveryRender
Funktion nur ausgelöst, wenn sieprops.user
geändert wirdIch hoffe, dies hilft Ihrem Verständnis. Lassen Sie mich wissen, wenn Verbesserungen erforderlich sind. Danke
quelle
Der übergebene Parameter
React.useState()
ist nur der Anfangswert für diesen Zustand. React erkennt dies nicht als Änderung des Status, sondern setzt nur den Standardwert. Sie möchten zunächst den Standardstatus festlegen und dann unter bestimmten BedingungensetUser(newValue)
einen Status aufrufen , der als neuer Status erkannt wird, und die Komponente erneut rendern.Ich würde empfehlen, den Status ohne irgendeine Bedingung zu aktualisieren, um zu verhindern, dass er ständig aktualisiert wird, und daher jedes Mal neu zu rendern, wenn Requisiten empfangen werden. Möglicherweise möchten Sie die Statusfunktionalität auf eine übergeordnete Komponente übertragen und den Status des übergeordneten Elements als Requisite an diesen Avatar weitergeben.
quelle
Laut der ReactJS-Dokumentation zu Hooks :
Ihre einzige Interaktion hier sollte bei einem Requisitenwechsel stattfinden, der anscheinend nicht funktioniert. Sie können (immer noch laut Dokument) ein componentDidUpdate (prevProps) verwenden, um proaktiv alle Aktualisierungen der Requisiten abzufangen.
PS: Ich habe nicht genug Code, um zu beurteilen, aber konnten Sie Benutzer () nicht aktiv in Ihre Avatar (Requisiten) -Funktion setzen?
quelle
In der Reaktionswelt sollten Sie in solchen Fällen Ihren Status in der Funktion componentWillRecieveProps (nextProps) aktualisieren.
quelle