我可以在getter函数内调度vuex操作吗?

时间:2019-02-17 09:53:08

标签: vue.js vuex

我想在getter函数内调度动作。
1.是否可能和正确。
2.如果可以,我该怎么办?

我想这将是这样的调度('GET_BOOKS');

const getters = {
    getAllBooksDispatch: (state, getters, dispatch) => {
        if (state.books === null) {
            dispatch('GET_BOOKS');
        }
        return state.books
    },
};

但是它不起作用。
所以我的商店文件看起来像这样。

const initialState = {
    books: null
};

const getters = {
    getAllBooksDispatch: (state, getters, dispatch) => {
        if (state.books === null) {
            dispatch('GET_BOOKS');
        }
        return state.books
    },
};

const mutations = {
    SET_BOOKS: (state,{data}) => {
        console.log('SET_BOOKS mutations')
        state.books = data;
    },
};

const actions = {
    GET_BOOKS: async ({ commit }) => {
        let token = users.getters.getToken;

        let query = new Promise((resolve, reject) => {
            axios.get(config.api + 'books', {token}).then(({data}) => {
                if (data) {
                    commit('SET_BOOKS', {data: data})
                    resolve()
                } else {
                    reject(data.message);
                }
            }).catch(() => {
                reject('Error sending request to server!');
            })
        })

    },
};

1 个答案:

答案 0 :(得分:1)

不,您不能。至少不是您想要的方式。使用模块而不是rootState时,getter中的第三个参数是dispatch对象。即使您找到了一种在getter中分派动作的方法,也无法按您期望的方式工作。 Getter必须是同步的,但动作可以是异步的(在此示例中是异步的)。在您的示例中,将分派GET_BOOKS,但是getter仍将state.books返回为空。

我建议在Vuex存储之外处理这种延迟加载。