Clause de non-responsabilité - Je viens juste de commencer à utiliser Vuejs et je ne fais qu'extrapoler l'intention de conception.
Le débogage par machine à remonter le temps utilise des instantanés de l'état, et montre une chronologie des actions et des mutations. En théorie, nous aurions pu avoir juste actions
à côté d'un enregistrement de setters et getters d'état pour décrire de manière synchrone la mutation. Mais alors :
- Nous aurions des entrées impures (résultats asynchrones) à l'origine des setters et getters. Cela serait difficile à suivre logiquement et différents setters et getters asynchrones pourraient interagir de manière surprenante. Cela peut encore se produire avec
mutations
mais nous pouvons alors dire que la transaction doit être améliorée plutôt que d'être une condition de course dans les actions. Les mutations anonymes à l'intérieur d'une action pourraient plus facilement faire resurgir ce genre de bogues car la programmation asynchrone est fragile et difficile.
- Le journal des transactions serait difficile à lire car il n'y aurait pas de nom pour les changements d'état. Il ressemblerait beaucoup plus à du code et serait moins anglais, sans les groupements logiques des mutations.
- Il pourrait être plus délicat et moins performant d'instrumenter l'enregistrement de toute mutation sur un objet de données, contrairement à la situation actuelle où il existe des points de différence définis de manière synchrone - avant et après l'appel de la fonction de mutation. Je ne suis pas sûr de l'importance du problème.
Comparez le journal des transactions suivant avec les mutations nommées.
Action: FetchNewsStories
Mutation: SetFetchingNewsStories
Action: FetchNewsStories [continuation]
Mutation: DoneFetchingNewsStories([...])
Avec un journal des transactions qui n'a pas de mutations nommées :
Action: FetchNewsStories
Mutation: state.isFetching = true;
Action: FetchNewsStories [continuation]
Mutation: state.isFetching = false;
Mutation: state.listOfStories = [...]
J'espère que vous pouvez extrapoler à partir de cet exemple la complexité supplémentaire potentielle de l'asynchronisme et de la mutation anonyme dans les actions.
https://vuex.vuejs.org/en/mutations.html
Imaginons maintenant que nous déboguons l'application et que nous regardons les journaux de mutation du devtool. Pour chaque mutation enregistrée, le devtool devra capturer un instantané de l'état "avant" et "après". Cependant, le callback asynchrone dans l'exemple de mutation ci-dessus rend cela impossible : le callback n'est pas encore appelé lorsque la mutation est validée, et le devtool n'a aucun moyen de savoir quand le callback sera effectivement appelé - toute mutation d'état effectuée dans le callback est essentiellement impossible à suivre !
2 votes
Voir "On To Actions", je crois : vuex.vuejs.org/fr/mutations.html#sur-les-actions
0 votes
Discussion connexe : github.com/vuejs/vuex/issues/587
1 votes
Vous ne pouvez pas modifier directement l'état du magasin. Le seul moyen de modifier l'état d'un magasin est de procéder à des mutations de manière explicite. Pour cela, nous avons besoin d'actions pour engager des mutations.
1 votes
@SureshSapkota cette déclaration est très confuse, puisque les deux
mutations
yactions
sont définis dans la documentation de vuex comme des méthodes de changement d'état. Vous n'avez pas besoin d'une action pour effectuer une mutation.1 votes
Les mutations, comme leur nom l'indique, sont utilisées pour modifier/mutater votre objet d'état. Les actions sont assez similaires aux mutations, mais au lieu de modifier l'état, les actions commettent des mutations. Les actions peuvent contenir n'importe quel code asynchrone arbitraire ou logique métier . Vuex recommande que l'objet state ne soit muté qu'à l'intérieur des fonctions Mutation. Il est également recommandé ne pas exécuter de code lourd ou bloquant à l'intérieur des fonctions de mutation puisqu'elles sont synchrones par nature .