181 votes

Comment appeler un getter à partir d'un autre getter dans Vuex ?

Considérons un simple blog Vue :
J'utilise Vuex comme base de données et j'ai besoin de mettre en place deux systèmes de gestion des données. getters : a getPost pour récupérer un post par ID, ainsi qu'un listFeaturedPosts qui renvoie les premiers caractères de chaque article vedette. Le schéma du datastore pour la liste des articles vedettes référence les articles par leurs ID. Ces ID doivent être résolus en articles réels afin d'afficher les extraits.

magasin/état.js

export const state = {
  featuredPosts: [2, 0],
  posts: [
    'Lorem et ipsum dolor sit amet',
    'Lorem et ipsum dolor sit amet',
    'Lorem et ipsum dolor sit amet',
    'Lorem et ipsum dolor sit amet',
    'Lorem et ipsum dolor sit amet',
  ]
}

magasin/getters.js

export default getPost = (state) => (postID) => {
  return state.posts[postID]
}

export default listFeaturedPosts = (state, getters) => () => {
  console.log(getters) // {}

  return state.featuredPosts.map(postID => getters.getPost(postID).substring(0, EXCERPT_LENGTH);
}

magasin/index.js

import Vue from 'vue'
import Vuex from 'vuex'
import state from './state'
import * as getters from './getters'
import * as mutations from './mutations'

Vue.use(Vuex)

export default new Vuex.Store({
  state,
  getters,
  mutations
})

Selon la documentation, le getters peut être utilisé pour accéder à d'autres getters. Cependant, lorsque j'essaie d'accéder à getters de l'intérieur listFeaturedPosts il est vide, et j'obtiens une erreur dans la console en raison de getters.getPost étant indéfini dans ce contexte.

Comment puis-je appeler getPost comme un getter Vuex à l'intérieur listFeaturedPosts dans l'exemple ci-dessus ?

296voto

whusterj Points 1139

Dans VueJS 2.0, vous devez transmettre les deux éléments suivants state y getters .

Les getters sont transmis à d'autres getters en tant qu'éléments d'information. 2eme Argument :

export default foo = (state, getters) => {
    return getters.yourGetter
}

Documentation officielle : https://vuex.vuejs.org/guide/getters.html#property-style-access

41voto

Radik Nurgaliev Points 344

Passez getters comme deuxième argument pour accéder aux getters locaux et non-nominatifs. Pour les modules à espacement de noms, vous devez utiliser rootGetters (comme le 4ème afin d'accéder à des getters définis dans un autre module) :

export default foo = (state, getters, rootState, rootGetters) => {
    return getters.yourGetter === rootGetters['moduleName/getterName']
}

7 votes

Ceci est utile pour les personnes qui ont besoin d'un getter d'un autre module vuex. Je voulais juste souligner que les arguments doivent être dans l'ordre spécifique montré dans la réponse, sans aucun argument omis, pour que cela fonctionne.

29voto

OziOcb Points 21

Les getters reçoivent d'autres getters comme le 2ème argument

getters: {
  doneTodos: state => {
    return state.todos.filter(todo => todo.done)
  },
  doneTodosCount: (state, getters) => {
    return getters.doneTodos.length
  }
}

Voici un lien vers la documentation officielle. https://vuex.vuejs.org/guide/getters.html#property-style-access

4 votes

Bravo pour : a) un exemple de code clair b) un lien vers le bon endroit dans la documentation

1 votes

Est-il différent d'écrire comme ceci à la place ? getters : { doneTodos : state => { return state.todos.filter(todo => todo.done) }, doneTodosCount : (state, getters) => { return this.getters.doneTodos.length } }

0 votes

@Rivo Pour autant que je sache, vous ne pouvez pas faire cela. Si vous essayez, vous obtiendrez une erreur comme celle-ci : [Vue warn] : Error in render : "TypeError : Cannot read property 'getters' of undefined".

22voto

Jose Seie Points 394

J'ai testé sans state et n'a pas fonctionné. C'est pourquoi state est nécessaire.

ça marche :

export default foo = (state, getters) => {
    return getters.yourGetter
}

cela n'a pas fonctionné

export default foo = (getters) => {
    return getters.yourGetter
}

1 votes

J'aimerais ajouter que cela ne fonctionne dans aucune version de Vue. La déstructuration des objets ne doit pas être confondue avec les arguments nommés (voir la réponse à la suggestion originale d'omettre "state"). C'est en effet (state, getters)

3 votes

Dans le deuxième exemple, vous nommez le state objet getters et en ignorant le deuxième argument qui serait le véritable getters objet. Si vous deviez faire une introspection getters dans cet exemple, vous verriez que c'est en fait votre objet d'état.

-6voto

Angie Points 75

Au lieu de passer état , passe getters et ensuite appeler n'importe quel autre getter que vous voulez. J'espère que cela vous aidera.

Dans votre magasin/getters.js

export default foo = (getters) => {
   return  getters.anyGetterYouWant
}

3 votes

Je pense que vous confondez la déstructuration des objets avec les arguments. Le premier argument de la fonction est l'état, le second est l'objet getters. Vous pouvez nommer le premier argument 'getters', mais il s'agira toujours de l'état ! Vous cherchez : export default foo = (state, getters) => ...

0 votes

Ou export default foo = ({ getters }) => { return getters.anyGetterYouWant }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X