如何在Vuex中将另一个吸气剂称为吸气剂?


104

考虑一个简单的Vue博客:
我正在使用Vuex作为数据存储,我需要设置两个getter:一个getPost用于post通过ID检索ID的getter ,以及一个listFeaturedPosts用于返回每个精选文章的前几个字符的getter 。特色帖子列表的数据存储架构通过其ID引用帖子。为了显示摘录,这些ID必须解析为实际帖子。

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

商店/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在该上下文中未定义而在控制台中收到错误。

在上面的示例中,如何getPost从内部调用Vuex吸气剂listFeaturedPosts

Answers:



18

getters作为第二个参数传递,以访问本地和非命名空间的getter。对于命名空间模块,应该使用rootGetters(作为第四个参数,以便访问在另一个模块中定义的getter):

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

3
这对于需要从另一个vuex模块获取吸气剂的人很有用。我只是想强调,参数必须按照答案中显示的特定顺序,且不省略任何参数,以使其起作用。
LJH

13

我测试了没有state,没有工作。这就是为什么state有必要。

这有效:

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

这没用

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

1
我想补充一点,它在任何Vue版本中均不起作用。对象解构不应与命名参数混淆(请参阅原始建议中的答案以省略“状态”)。确实是这样(州,吸气剂)
伊戈尔·辛肯

2
在第二个示例中,您将命名该state对象,getters而忽略第二个参数,该参数将是实际的getters对象。如果getters在此示例中进行内省,您将看到它实际上是您的状态对象。
mraaroncruz

10

吸气剂将其他吸气剂作为第二个参数

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


2
赞成:a)一个清晰的代码示例b)链接到文档中的正确位置
Katinka Hesselink,

1
像这样写有区别吗?getters:{doneTodos:state => {return state.todos.filter(todo => todo.done)},doneTodosCount:(state,getters)=> {返回this.getters.doneTodos.length}}
里沃

据我所知,@ Rivo无法做到这一点。如果尝试尝试,将出现如下错误:[Vue警告]:渲染错误:“ TypeError:无法读取未定义的属性'getters'”
OziOcb

-3

而不是传递state,而是传递getter,然后调用您想要的任何其他getter。希望能帮助到你。

在您的store / getters.js中

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

1
我认为您将对象解构与参数混淆了。该函数的第一个参数是状态,第二个是getters对象。您可以将第一个参数命名为“ getters”,但仍然是状态!您正在寻找:导出默认值foo =(状态,获取方法)=> ...
Igor Zinken

export default foo = ({ getters }) => { return getters.anyGetterYouWant }
GaryMcM
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.