Как я могу назвать геттер с другого получателя в Vuex?

Рассмотрим простой блог Vue:
Я использую Vuex в качестве хранилища данных, и мне нужно настроить два getPost получения: getPost для извлечения post по идентификатору, а также listFeaturedPosts который возвращает первые несколько символов каждого listFeaturedPosts сообщения. Схема хранилища данных для списка избранных сообщений ссылается на сообщения по их идентификаторам. Эти идентификаторы должны быть преобразованы в фактические сообщения с целью демонстрации выдержек.

магазин /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',
  ]
}

магазин /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);
}

магазин /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
})

Согласно документации, параметр getters может использоваться для доступа к другим геттерам. Однако, когда я пытаюсь получить доступ к getters из listFeaturedPosts, он пуст, и я получаю сообщение об ошибке в консоли из-за getters.getPost что getters.getPost не определен в этом контексте.

Как я могу вызвать getPost как получатель Vuex из listFeaturedPosts в примере выше?

Ответ 1

Ответ Angie близок....

В VueJS 2.0 вы передадите state и getters. Поэтому это должно работать в store/getters.js:

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

Ответ 2

Я протестировал без state и не работал в vuejs 2.5.16. Вот почему state необходимо.

это работает:

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

это не сработало

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

Ответ 3

Передайте getters в качестве второго аргумента для доступа к локальным геттерам и получателям без пространства имен. Для модулей пространства имен вы должны использовать rootGetters (в качестве 4-го аргумента, чтобы получить доступ к геттерам, определенным в другом модуле):

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

Ответ 4

Получатели получают других получателей в качестве второго аргумента

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

Вот ссылка на официальные документы - https://vuex.vuejs.org/guide/getters.html#property-style-access

Ответ 5

вместо передачи состояния, передайте геттеры, а затем вызовите любой другой получатель, который вы хотите. Надеюсь, поможет.

В вашем магазине /getters.js

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