Come posso chiamare un getter da un altro getter in Vuex?


105

Considera un semplice blog Vue:
sto usando Vuex come datastore e ho bisogno di impostare due getter : un getPostgetter per il recupero di un postID, così come un listFeaturedPostsche restituisce i primi pochi caratteri di ogni post in primo piano. Lo schema del datastore per l'elenco dei post in primo piano fa riferimento ai post in base al loro ID. Questi ID devono essere risolti in post effettivi allo scopo di mostrare gli estratti.

store / state.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',
  ]
}

store / 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);
}

store / 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
})

Secondo la documentazione, il gettersparametro può essere utilizzato per accedere ad altri getter. Tuttavia, quando provo ad accedere gettersdall'interno listFeaturedPosts, è vuoto e ricevo un errore nella console perché getters.getPostnon è definito in quel contesto.

Come posso chiamare getPostcome getter Vuex dall'interno listFeaturedPostsnell'esempio sopra?

Risposte:



18

Passa getterscome secondo argomento per accedere ai getter locali e senza spazio dei nomi. Per i moduli con spazio dei nomi, dovresti usare rootGetters(come quarto argomento, per accedere ai getter definiti all'interno di un altro modulo):

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

3
Questo è utile per le persone che richiedono un getter da un altro modulo vuex. Volevo solo sottolineare che gli argomenti devono essere nell'ordine specifico mostrato nella risposta senza omissioni di argomenti, affinché funzioni.
LJH

13

Ho provato senza statee non ha funzionato. Ecco perché stateè necessario.

questo funziona:

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

questo non ha funzionato

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

1
Vorrei aggiungere che non funziona in nessuna versione di Vue. La destrutturazione degli oggetti non deve essere confusa con argomenti denominati (vedere la risposta nel suggerimento originale di omettere lo "stato"). È infatti (stato, getters)
Igor Zinken

2
Nel secondo esempio si nomina l' stateoggetto getterse si ignora il secondo argomento che sarebbe l' gettersoggetto effettivo . Se dovessi introspettare gettersin questo esempio, vedresti che era effettivamente il tuo oggetto di stato.
mraaroncruz

10

I getter ricevono altri getter come secondo argomento

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

Ecco un collegamento ai documenti ufficiali: https://vuex.vuejs.org/guide/getters.html#property-style-access


2
Complimenti per: a) un chiaro esempio di codice b) collegamento alla posizione corretta nei documenti
Katinka Hesselink,

1
È diverso invece scrivere così? getter: {doneTodos: state => {return state.todos.filter (todo => todo.done)}, doneTodosCount: (state, getters) => {return this.getters.doneTodos.length}}
Rivo

@ Rivo per quanto ne so non puoi farlo. Se ci provi, otterrai un errore come questo: [Vue warn]: Error in render: "TypeError: Cannot read property 'getter' of undefined"
OziOcb

-3

invece di passare lo stato , passa i getter e quindi chiama qualsiasi altro getter che desideri. Spero che sia d'aiuto.

Nel tuo negozio / getters.js

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

2
Penso che tu stia confondendo la destrutturazione di oggetti con gli argomenti. Il primo argomento della funzione è lo stato, il secondo è l'oggetto getters. Puoi chiamare il primo argomento "getter", ma sarà comunque lo stato! Stai cercando: export default foo = (state, getters) => ...
Igor Zinken

Oppureexport default foo = ({ getters }) => { return getters.anyGetterYouWant }
GaryMcM
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.