自家製のストアオブジェクトの代わりにVuexの使用に切り替えようとしていますが、Vue.jsの世界の他の場所ほど明確なドキュメントを見つけられないと言わなければなりません。独自の状態、ミューテーション、ゲッターなどを備えた「製品」と呼ばれるVuexモジュールがあるとします。「clearWorking Data」と呼ばれるそのモジュール内のアクションを参照するにはどうすればよいですか?ドキュメントには、モジュールの状態にアクセスする次の例があります。
store.state.a // -> moduleA's state
しかし、ゲッター、突然変異、アクションなどについては何もわかりません。
あなたの例では、store.dispatch('products/clearWorkingData')
になります。何らかの方法でアクション/突然変異をファイルシステムと考えることができます。モジュールがより深くネストされるほど、それらはより深いツリーになります。
したがって、3レベルの深さのツリーがある場合は、store.commit('first/second/third/method')
に行くことができます。
受け入れられた回答に加えて、回答にないゲッターの回避策を提供したいと思います。
ストアのデバッグ
いずれの場合でも、console.log(this.$store)
を呼び出してストアをデバッグできます。
そうすると、ゲッターの名前に名前空間の接頭辞が付いていることがわかります。
名前空間ゲッターにアクセスthis.$store.getters['yourModuleName/someGetterMethod']
名前空間のディスパッチthis.$store.dispatch('yourModuleName/doSomething')
paramsで名前空間をディスパッチしますthis.$store.getters['yourModuleName/someGetterMethod'](myParam)
結論
キーは、ジャスティンが説明したようなファイルシステムのような名前空間を処理することです。
編集:vuexストアを処理するための素敵なライブラリを見つけました
。 https://github.com/davestewart/vuex-pathify .
非常に面白く、設定の大部分を考慮し、vuexで2waybindingを直接処理することもできます。
**Edit:他の回答に感謝します。全体性のためのparamsを使用したDispatchingメソッドが追加されました。
受け入れられた答えへの別の追加として、パラメータをゲッターに渡す必要がある場合(たとえば、ストアコレクションから特定のアイテムを取得するため)、次のように渡す必要があります。
this.$store.getters['yourModuleName/someGetterMethod'](myParam)
私はこの表記法があまり好きではないと思いますが、それはそうです-少なくとも今のところは。
MapGettersヘルパーは、ストアのゲッターをローカルの計算されたプロパティに単にマップします。
import { mapGetters } from 'vuex'
export default {
// ...
computed: {
// mix the getters into computed with object spread operator
...mapGetters([
'doneTodosCount',
'anotherGetter',
// ...
])
}
}
If you want to map a getter to a different name, use an object:
...mapGetters({
// map `this.doneCount` to `this.$store.getters.doneTodosCount`
doneCount: 'doneTodosCount'
})
Vuex mapGettersとmapActionsを使用すると、これを非常に簡単に行うことができます。しかし、私は同意します、それはまだドキュメントであまり明白ではありません。
ストアモジュール「products」に「mostPopular」と呼ばれるゲッターと「clearWorkingData」と呼ばれるアクションがあると仮定します。
<template>
<div>
<p>{{mostPopularProduct}}<p>
<p><button @click="clearProductData">Clear data</button></p>
</div>
</template>
<script>
import { mapGetters, mapActions } from "vuex";
export default {
computed: mapGetters({
mostPopularProduct: "products/mostPopular"
}),
methods: mapActions({
clearProductData: "products/clearWorkingData"
})
}
</script>