Kann nicht anrufen, setState auf einer nicht gemounteten Komponente
Erhalte immer folgende Fehlermeldung Reagieren Nativen, wirklich nicht verstehen, wo es herkommt
Warnung: Kann nicht anrufen setState (oder forceUpdate) auf einer nicht gemounteten
Komponente. Dies ist ein no-op, aber es gibt ein memory leak in your
- Anwendung. Zu beheben, kündigen Sie alle Abonnements und asynchrone tasks
in der componentWillUnmount Methode.
Habe ich die folgende einfache Komponente:
class App extends React.Component {
constructor(props) {
super(props)
this.state = {
isLoggedIn: false,
}
}
componentDidMount(){
this.fetchToken()
}
async fetchToken(){
const access_token = await AsyncStorage.getItem('access_token')
if (access_token !== null) {
this.setState({ isLoggedIn: true })
}
}
render() {
const login = this.state.isLoggedIn
if (login) {
return <NavigatorLoggedIn />
} else {
return <Navigator/>
}
}
}
- Sie sollen zur Initialisierung der Staat innerhalb der Konstruktor, der nicht außerhalb. Und verwenden
this.state
, nicht nurstate
. Ich würde auch nicht gelten, dieasync
Attribut zu Reagieren, die Standard-lifecycle-Methoden, am besten lassen, wie Sie sind. Erstellen Sie eine separateasync/await
Komponente Funktion um dies zu tun, dann rufen Sie es incomponentDidMount
- Danke für die Antwort! Aktualisiert die Komponente mit Ihren Anregungen. Original-Warnung ist immer noch da ;(
componentDidMount()
läuft nach dem Rendern so aktualisierten Zustand nicht sichtbar/verfügbar inrender()
. Dann nehme ich diese Komponente wird ausgehängt, überrender()
in jedem Fall und so ruftfetchToken()
nach der Tat verursacht einen Speicherverlust, pro den Fehler messgage.- dachte so an! irgendwelche Vorschläge für eine Lösung? Versucht eine Lösung zu finden, mich zu
- aus der hand: (1) tun Sie es in
render()
an der Spitze. (2) im Konstruktor. In beiden Fällen verwenden Sie die andere formsetState()
, die es braucht, Funktion; weilsetState()
ist grundsätzlich asynchron - Möglich, Duplikat der Reagieren Warnung über setState im unmontierten Komponente
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie es verwenden:
Oder rufen Sie
function
imconstructor
.Ich hoffe, dies wird Ihnen helfen,...
componentDidMount
.Es werden arbeiten:
müssen Sie verwenden isMounted variable.
Oder verwenden Sie den Axios, können Sie mit cancel request-Funktion des axios
diese hier: https://github.com/axios/axios#cancellation
&& this.isMounted
funktioniert nichtFür mich, ich habe es behoben, indem Sie den server neu starten, indem Sie "Garn start" oder "npm start"
Können Sie versuchen, diese:
Mithilfe _isMounted, setState wird nur aufgerufen, wenn die Komponente montiert ist, Die das unmounten nicht warten, bis der async-Aufruf fertig. Schließlich, wenn der async-Aufruf wird über die Komponente bereits ausgehängt, und so ist es nicht der Zustand. Um dies zu tun, ist die Antwort einfach eine überprüfung, um zu sehen, wenn die Komponente montiert ist, bevor Sie den Staat.
Abbrechen alle asynchronen operation ist eine der Lösung