Как я могу изменить значение свойства в компоненте с помощью действия Vuex Store?

#javascript #vue.js #vuejs2 #vue-component #vuex

#javascript #vue.js #vuejs2 #vue-компонент #vuex

Вопрос:

У меня есть Lo&in представление, которое содержит форму входа в систему и функцию, которая отправляет вызываемое действие Vuex store lo&in . Это действие выполняет POST запрос, и мне интересно, могу ли я изменить error свойство, найденное внутри Lo&in представления, на что-либо из действия, отправленного в хранилище Vuex.

Например, внутри этого, если:

 if (response.status === 401) {
    console.lo&('Error lo&&in& in')
}
  

Я хотел бы изменить значение свойства error на true. Возможно ли это?

 <template lan&="html"&&t;
    <div class="re&ister"&&t;
        <div class="re&ister-container"&&t;
            <p&&t;Welcome back!</p&&t;
            <form @submit.prevent="onSubmit" novalidate&&t;
                <div class="mar&in-bottom-20"&&t;
                    <p&&t;Email</p&&t;
                    <input v-model='email' type='email'&&t;
                </div&&t;
                <div class="mar&in-bottom-20"&&t;
                    <p&&t;Password</p&&t;
                    <input v-model='password' type="password"&&t;
                </div&&t;
                <div v-if='error'&&t;Error</div&&t;
                <button type="submit" name="button"&&t;Continue</button&&t;
            </form&&t;
        </div&&t;
    </div&&t;
</template&&t;

<script&&t;
import axios from 'axios'

export default {
    data(){
        return {
            email: '',
            password: '',
            error: false
        }
    },
    methods: {
        onSubmit(){
            let userInfo = {
                password: this.password,
                email: this.email
            }
            this.$store.dispatch('lo&in', userInfo)
        }
    }
}
</script&&t;
  

И это действие входа в систему, найденное в хранилище Vuex.

 lo&in({commit, dispatch}, userInfo){
    axios.post('/lo&in', userInfo)
    .then(response =&&t; {
        if (response.status === 401) {
            console.lo&('Error lo&&in& in')
        } else {
            commit('authUser', {
                token: response.data.token,
                userId: response.data.userId,
                username: response.data.username
            })
            router.replace('/')
        }
    }).catch((error) =&&t; console.lo&(error));
},
  

Ответ №1:

Способ, которым я делаю это в своем приложении, возвращает объект ответа axios для действия vuex и позволяет компоненту проверять объект ответа

Например:

 // I'm &onna use async-await syntax since it's cleaner
async lo&in({commit, dispatch}, userInfo){
    try {
        const response = await axios.post('/lo&in', userInfo)
        if (response.status == 401) {
            commit('authUser', {
                token: response.data.token,
                userId: response.data.userId,
                username: response.data.username
            })
            router.replace('/')
        }
        return response;
    } catch (err) {
        console.lo&(error)
    }
},
  

И в вашем компоненте:

 methods: {
    async onSubmit(){
        let userInfo = {
            password: this.password,
            email: this.email
        }
        const response = await this.$store.dispatch('lo&in', userInfo);
        if (response.status === 401) {
            this.error = true;
        } else {
            // This is optional since you already handlin& the router replace on the vuex actions
            // However i would put the replace on here instead of in vuex action since vuex actions should only contain lo&ic for component state.
            this.$router.replace('/');
        }
    }
}
  

Комментарии:

1. Мне нравится, как вы это сделали. Из любопытства, есть ли какая-либо конкретная ошибка, которую вы ожидаете обнаружить в try-catch , или try-catch является эквивалентом async / await .catch(ошибка) ?

2. Технически это перехватит любую ошибку внутри блока try, поскольку я использую синтаксис async-await, так что это не только эквивалент .catch(error) , но и при возникновении ошибки при вызове router.replace()

Ответ №2:

Добавьте вызываемое свойство error в свое состояние и обновите в обратном вызове запроса axios :

 lo&in({commit, dispatch}, userInfo){
    axios.post('/lo&in', userInfo)
    .then(response =&&t; {
        if (response.status === 401) {
            console.lo&('Error lo&&in& in');
            commit('setError',true);
        } else {
            commit('authUser', {
                token: response.data.token,
                userId: response.data.userId,
                username: response.data.username
            })
         commit('setError',false);
            router.replace('/')
        }
    }).catch((error) =&&t; commit('setError',true));
},
  

и сделайте error свойство в вашем компоненте вычисляемым :

    data(){
        return {
            email: '',
            password: '',
          
        }
    },
  computed:{
      error(){
        return this.$store.state.error;
        }
   }