Vuexの別のゲッターからゲッターを呼び出すにはどうすればよいですか?


105

シンプルVueのを考えてみましょうブログ:
私は私のデータストアとしてVuexを使用してだと私は2つの設定する必要がありゲッターgetPost取得するためのゲッターpostIDでの、だけでなく、listFeaturedPosts各機能のポストの最初の数文字を返します。注目の投稿リストのデータストアスキーマは、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);
}

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

ドキュメントによると、このgettersパラメーターは他のゲッターにアクセスするために使用できます。ただし、getters内部からアクセスしようとするlistFeaturedPostsと、空になりgetters.getPost、そのコンテキストで定義されていないため、コンソールでエラーが発生します。

上記の例で、getPost内部からVuexゲッターとして呼び出すにはどうすればよいlistFeaturedPostsですか?

回答:



18

gettersローカルおよび名前空間のないゲッターにアクセスするための2番目の引数として渡します。名前空間付きモジュールの場合、rootGetters(別のモジュール内で定義されたゲッターにアクセスするために、4番目の引数として)使用する必要があります。

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バージョンでも機能しないことを付け加えたいと思います。オブジェクトの破棄を名前付き引数と混同しないでください(「状態」を省略するための元の提案の回答を参照してください)。それは確かに(州、ゲッター)
Igor Zinken 2018

2
2番目の例では、stateオブジェクトに名前を付けgetters、実際のgettersオブジェクトとなる2番目の引数を無視しています。gettersこの例で内省すると、実際には状態オブジェクトであることがわかります。
mraaroncruz

10

ゲッターは2番目の引数として他のゲッターを受け取ります

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)ドキュメント内の適切な場所へのリンク
KatinkaHesselink19年

1
代わりにこのように書くのは違いですか?ゲッター:{doneTodos:状態=> {戻りstate.todos.filter(TODO => todo.done)}、doneTodosCount:(状態、ゲッタ)=> {戻りthis.getters.doneTodos.length}
Rivo

私の知る限り、@ Rivoはそれができません。あなたは、このようなエラーが発生しますしようとした場合:[Vueが警告]:レンダリングでエラーが発生しました:「TypeError例外を:未定義のプロパティ『ゲッター』を読み取ることができません」
OziOcb

-3

状態を渡す代わりに、ゲッターを渡してから、必要な他のゲッターを呼び出します。それが役に立てば幸い。

あなたのstore / getters.jsで

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

2
オブジェクトの破壊と引数を混同していると思います。関数の最初の引数は状態で、2番目の引数はゲッターオブジェクトです。最初の引数に「getters」という名前を付けることができますが、それでも状態になります。あなたが探しているもの:export default foo =(state、
getters

または export default foo = ({ getters }) => { return getters.anyGetterYouWant }
GaryMcM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.