为什么这个 vuex computed getter 不是反应式的?
why is this vuex computed getter not reactive?
<script>
import { computed } from "vue";
import { useStore } from "vuex";
export default {
setup() {
const store = useStore();
const playlists = computed(() => store.getters.allPlaylists);
...
store.dispatch("playlists/getAllPlaylists");
// modules/playlists
const state = () => ({
all: [],
})
// getters
const getters = {
allPlaylists: (state) => state.all,
...
const actions = {
getAllPlaylists: ({ commit }) => { // api calls performing setPlaylists mutation
commit('setPlaylists', playlists)
...
const mutations = {
setPlaylists: (state, playlists) => {
state.all = playlists;
},
...
export default {
namespaced: true,
state,
getters,
actions,
mutations
}
组件中的 playlists
结果是空的。
如果我使用 const playlists = computed(() => store.state.all);
而不是有效,我是不是做错了什么?
是因为getter是函数?
如果我应该改用 store.state.all
,那么 getters 有什么用?
添加的商店:
import { createStore, createLogger } from 'vuex'
import mediafiles from './modules/mediafiles'
import playlists from './modules/playlists'
const debug = import.meta.env.DEV
const store = createStore({
modules: {
mediafiles,
playlists
},
strict: debug,
plugins: debug ? [createLogger()] : []
})
export default store
您不能使用 store.getters
访问模块 getter,因为那是根 getter。
相反,尝试类似于调用 dispatch:
const playlists = computed(() => store.getters['playlists/allPlaylists']);
详情见模块官方文档中命名空间示例中的注释:https://next.vuex.vuejs.org/guide/modules.html#namespacing
<script>
import { computed } from "vue";
import { useStore } from "vuex";
export default {
setup() {
const store = useStore();
const playlists = computed(() => store.getters.allPlaylists);
...
store.dispatch("playlists/getAllPlaylists");
// modules/playlists
const state = () => ({
all: [],
})
// getters
const getters = {
allPlaylists: (state) => state.all,
...
const actions = {
getAllPlaylists: ({ commit }) => { // api calls performing setPlaylists mutation
commit('setPlaylists', playlists)
...
const mutations = {
setPlaylists: (state, playlists) => {
state.all = playlists;
},
...
export default {
namespaced: true,
state,
getters,
actions,
mutations
}
组件中的 playlists
结果是空的。
如果我使用 const playlists = computed(() => store.state.all);
而不是有效,我是不是做错了什么?
是因为getter是函数?
如果我应该改用 store.state.all
,那么 getters 有什么用?
添加的商店:
import { createStore, createLogger } from 'vuex'
import mediafiles from './modules/mediafiles'
import playlists from './modules/playlists'
const debug = import.meta.env.DEV
const store = createStore({
modules: {
mediafiles,
playlists
},
strict: debug,
plugins: debug ? [createLogger()] : []
})
export default store
您不能使用 store.getters
访问模块 getter,因为那是根 getter。
相反,尝试类似于调用 dispatch:
const playlists = computed(() => store.getters['playlists/allPlaylists']);
详情见模块官方文档中命名空间示例中的注释:https://next.vuex.vuejs.org/guide/modules.html#namespacing