vuex 디스패치 응답 처리 방법
정답이 눈앞에 있을 것 같은데도 백기를 들고 조언을 구한다.
API(AWS)에 제출하고 결과에 따라 행동하는 로그인 폼이 있습니다.내가 안고 있는 문제는 한때handleSubmit
메서드가 호출됩니다.즉각으로 액세스 합니다.console.log
스테이트먼트...놀랄 것도 없이 돌아온다.dispatch result: undefined
이것이 vue.js의 직접적인 함수가 아니라 javascript set을 어떻게 실행하고 있는지 알고 있습니다.
로그인 컴포넌트는 다음과 같습니다.
// SignInForm.vue
handleSubmit() {
try {
const {username, password} = this.form;
this.$store.dispatch('user/authenticate', this.form).then(res => {
console.log('dispatch result: ', res);
});
} catch (error) {
console.log("Error: SignInForm.handleSubmit", error);
}
},
...
저희 가게에서는 이렇게 하고 있습니다.다음 주소로 보냅니다.UserService
나는 창조했다.모든 게 잘 되고 있어요.올바른 응답을 받고 필요한 모든 것을 로그아웃할 수 있습니다.그UserService
는 Auxios 요구(AWS Amplify)를 발행하여 응답을 반환합니다.
// user.js (vuex store)
authenticate({state, commit, dispatch}, credentials) {
dispatch('toggleLoadingStatus', true);
UserService.authenticate(credentials)
.then(response => {
dispatch('toggleLoadingStatus', false);
if (response.code) {
dispatch("setAuthErrors", response.message);
dispatch('toggleAuthenticated', false);
dispatch('setUser', undefined);
// send error message back to login component
} else {
dispatch('toggleAuthenticated', true);
dispatch('setUser', response);
AmplifyEventBus.$emit("authState", "authenticated");
// Need to move this back to the component somehow
// this.$router.push({
// name: 'dashboard',
// });
}
return response;
});
},
...
에러가 발생했을 경우, 에러를 그 상태로 설정할 수 있습니다만, 다른 컴포넌트에서는 에러에 액세스 하는 방법을 알 수 없습니다.세팅을 해봤는데data
속성을 스토어를 참조하는 계산 메서드로 변환합니다만, 에러가 발생합니다.
인증에 성공하면 vue-router도 사용할 수 없습니다.제가 읽은 바로는 어쨌든 주(州)에서는 그렇게 하고 싶지 않습니다.그러니까 성공 응답을 반환할 필요가 있습니다.SignInForm
vue-router를 사용하여 사용자를 대시보드로 리디렉션할 수 있습니다.
네, SO에 투고하고 모든 것을 재평가하는 데 6시간밖에 걸리지 않았습니다.사실 그것은 다소 어리석은 실수였다.하지만 여기 있는 다른 누군가를 돕기 위해 내가 잘못한 건...
// SignInForm.vue
async handleSubmit() {
try {
await this.$store.dispatch("user/authenticate", this.form)
.then(response => {
console.log('SignInForm.handleSubmit response: ', response); // works
if (response.code) {
this.errors.auth.username = this.$store.getters['user/errors'];
} else {
this.$router.push({
name: 'dashboard',
});
}
}).catch(error => {
console.log('big problems: ', error);
});
} catch (error) {
console.log("Error: SignInForm.handleSubmit", error);
}
},
...
제 첫 번째 실수는 이렇습니다.전화하고 있었어요.async
method to 다른 method - 그러나 그 method를 명령하지 않음async
콜(er) 메서드 응답이 즉시 실행되었습니다.업데이트된 vuex 스토어는 다음과 같습니다.
// user.js (vuex store)
async authenticate({state, commit, dispatch}, credentials) { // now async
dispatch('toggleLoadingStatus', true);
return await UserService.authenticate(credentials)
.then(response => {
console.log('UserService.authenticate response: ', response); // CognitoUser or code
dispatch('toggleLoadingStatus', false);
if (response.code) {
dispatch("setAuthErrors", response.message);
dispatch('toggleAuthenticated', false);
dispatch('setUser', undefined);
} else {
dispatch('toggleAuthenticated', true);
dispatch('setUser', response);
AmplifyEventBus.$emit("authState", "authenticated");
}
return response;
});
},
...
두 번째 오류는 vuex 스토어에서 메서드 결과를 전혀 반환하지 않았다는 것입니다.
이전 방식:
UserService.authenticate(credentials)
더 나은 방법:
return await UserService.authenticate(credentials)
이걸로 누군가 몇 시간을 절약할 수 있길 바랍니다.¯_(ツ)_/¯
이것은 Vue3에서 유효합니다.
export default {
name: 'Login',
methods: {
loginUser: function () {
authenticationStore.dispatch("loginUser", {
email: 'peter@example.com',
})
.then(response => {
if (response.status === 200) {
console.log('Do something')
}
});
},
},
}
스토어에서는 약속인http 응답을 간단하게 전달할 수 있습니다.
const authenticationStore = createStore({
actions: {
loginUser({commit}, {email}) {
const data = {
email: email
};
return axios.post(`/authentication/login/`, data)
.then(response => {
toastr.success('Success')
return response
})
},
}
})
언급URL : https://stackoverflow.com/questions/59915293/how-can-i-handle-a-vuex-dispatch-response
'programing' 카테고리의 다른 글
마지막 이후의 모든 정보를 수집하는 정규 표현식 / (1) | 2022.09.16 |
---|---|
상태가 렌더링되기 전에 Vue.js/vuex getters 오류가 발생했습니다. (0) | 2022.08.28 |
Nuxt Apollo 로컬 상태를 사용하여 Vuex를 완전히 대체할 수 있습니까? (0) | 2022.08.28 |
페이지 로드 시 컴포넌트 '마운트'가 두 번 발생합니다. (0) | 2022.08.28 |
Vue.js - V-For에서 여러 소품을 자녀에게 전달 (0) | 2022.08.28 |