J'ai travaillé avec des mises à jour optimistes dans une application React + Flux et j'ai vu deux choses:
Je travaille donc sur ceci et crée un ActionStore pour gérer l'état des actions déclenchées par les composants. Voici le code source et voici une démo en direct.
Cela fonctionne plus ou moins comme ceci:
Je l'ai fait principalement pour séparer l'état des «entités» de l'état des actions, mais permet également des actions de redéclenchement avec la même charge utile (cela pourrait être utile lorsque nous recevons un état de réponse 500 si le serveur est temporairement en panne ou si Le signal détaché de l'utilisateur).
En outre, avoir un stock d'actions permet de demander facilement s'ils sont en attente d'actions avant que l'utilisateur ne se déconnecte ou ne ferme la fenêtre.
Remarque: Je travaille avec une application Web de la page d'application unique contre une API de repos, je ne pense pas l'utiliser sur le rendu côté serveur
C'est une option viable de créer un ActionStore ou je brise des fondations de Redux / Flux? Cela pourrait mettre fin à la possibilité d'utiliser Réagir de recharge à chaud et de temps de déplacement?
Vous devriez répondre sans pitié, j'ai probablement fait un tas de choses moche, mais j'apprends React / Redux.
Pour les futurs lecteurs qui pourraient être un peu déconcertés: nous n'appelons plus ces fonctions "magasins": nous les appelons réducteurs . La question porte donc sur des actions de rappel réducteur .
Personnellement, je n'aime pas l'approche que vous proposez là-bas. Vous mettez la logique dans les actions et utilisez l'héritage pour cela. Au contraire, Redux prescrit des actions pour être des objets simples sans logique. Ils ne devraient pas «savoir» comment mettre à jour certains états, et ils ne devraient pas le retenir – au lieu de cela, ils devraient décrire ce qui s'est passé.
Je pense que l'approche pour la mise en œuvre de mises à jour optimistes dans Redux est similaire à la façon dont vous implémentiez Annuler dans Redux , qui à son tour s'inspire de l' architecture Elm . L'idée est que vous devriez écrire une fonction qui prend un réducteur (et quelques options) et renvoie un réducteur:
function optimistic(reducer) { return function (state, action) { // do something? return reducer(state, action); } }
Vous l'utilisez comme un réducteur normal:
export default combineReducers({ something: optimistic(something) // wrap "something" reducer })
À l'heure actuelle, il passe l'état et l'action au reducer
qu'il enveloppe, mais il peut aussi se rappeler des actions:
function optimistic(reducer) { return function (state = { history: [] }, action) { // do something with history? return { history: [...state.history, action], present: reducer(state.history[state.history.length - 1], action) }; } }
Maintenant, il accumule toutes les actions dans le domaine de l' history
.
Encore une fois, cela n'est pas très utile en soi, mais vous pouvez probablement voir comment vous pouvez implémenter un réducteur d'ordre supérieur qui:
status: 'request'
; status: 'done'
, réinitialise l'historique; status: 'fail'
, ajuste l'historique pour ne pas inclure l'action initiale avec l' status: 'request'
et ré-exécute le réducteur pour recalculer l'état actuel comme si la demande ne s'est jamais produite. Bien sûr, je n'ai pas fourni la mise en œuvre, mais cela devrait vous donner une idée de la façon d'implémenter des mises à jour optimistes de manière Redux.
Mise à jour: selon le commentaire de l'OP, redux-optimist semble faire exactement cela.