首页 > 解决方案 > Vue - 如何从 Vuex 访问组件的属性

问题描述

在我的应用程序中,我使用 Vuex 来执行异步任务。在这种情况下,我使用它将用户登录到我的应用程序。当用户登录并且 axios.then() 正在执行时,我想通知我调用 this.$store.dispatch('login', {username: userObj.username, password: userObj.password}); 的组件 我的组件:


    data() {
        test: false
    },

    methods: {

        login() {
            const userObj = {
                username: this.username,
                password: this.password
            };
            console.log(userObj);
            this.$store.dispatch('login',
                {
                    username: userObj.username, password: userObj.password
                });
        }
    },

Vuex:

const actions = {
    login({ commit }, authData) {
        axios.post('/login', {
            username: authData.username,
            password: authData.password
        })
            .then(resp => {
                console.log(resp);
                localStorage.setItem('token', resp.data.authToken);
                localStorage.setItem('userId', resp.data.id);
                localStorage.setItem('user', resp.data);
                commit('storeUser', resp.data);
                router.replace('/dashboard');
            })
            .catch(e => {
                console.log(e);
                alert('Something went wrong, try again')
            });
    },
}

在这里,在 .then() 方法中,我想以某种方式将组件中的测试属性更改为 true。有人可以帮我解决这个问题吗?

标签: javascriptvue.jsvuex

解决方案


Promise你可以从一个vuex动作中返回一个:

const actions = {
    login({ commit }, authData) {
        return new Promise((resolve, reject) => {
            axios.post('/login', {
                username: authData.username,
                password: authData.password
            })
                .then(resp => {
                    console.log(resp);
                    localStorage.setItem('token', resp.data.authToken);
                    localStorage.setItem('userId', resp.data.id);
                    localStorage.setItem('user', resp.data);
                    commit('storeUser', resp.data);
                    router.replace('/dashboard');
                    resolve(resp);
                })
                .catch(e => {
                    console.log(e);
                    alert('Something went wrong, try again')
                    reject(e);
                });
        })
    },
}

当您调度操作时,您可以将其视为 a Promise(因为返回值是 a Promise):

// inside your component
this.
  $store.
  dispatch('login', {username: userObj.username, password: userObj.password})
  .then(resp => { /* do something with axios response using component data and methods*/);

推荐阅读