J'essaie de comprendre comment faire pour que mon React application SPA maintienne l'état lorsque l'utilisateur navigue avec les boutons du navigateur arrière/avant. Par exemple, l'utilisateur remplit un formulaire, puis il recule et vers l'avant et le formulaire est automatiquement restauré.
J'ai passé en revue de nombreux routeurs JavaScript, mais aucun ne semble résoudre ce problème correctement ... (ou même pas du tout).
Actuellement, j'utilise React Router 4 et c'est le modèle que j'adopte:
history.replace(this.state)
; puis je quitte la page avec history.Push(newLocation)
componentWillMount
) je vérifie this.props.location.state !== undefined
et si c'est le cas, je le restaure avec this.setState(this.props.location.state)
Ma question est: le modèle ci-dessus est-il correct? suggéré? Existe-t-il un moyen meilleur et largement adopté?
après un certain temps, j'ai trouvé une solution de contournement raisonnable:
this.setState()
je garde l'état synchronisé avec l'historique en utilisant window.history.replaceState({ key: history.location.key, state: this.state})
willMount
et willReceiveProps
) je vérifie l'état dans props.params.location.state
: s'il y en a un, je le restaure; s'il n'y en a pas, je crée un nouvel état.this.setState
et window.history.pushState
Cette solution semble bien fonctionner, les seuls inconvénients mineurs sont:
this.setState
Est un piège car il est asynchrone, vous ne pouvez pas utiliser this.state
Après, sauf si vous faites de la supercherie.constructor()
de la Component
Dans l'ensemble, j'ai écrit un PageComponent
qui étend Component
qui fait tout le travail d'initialisation/restauration; il remplace également this.setState
pour le synchroniser automatiquement avec l'historique et évite les désagréments asynchrones.