VueJ + Vuex + map Actions
문서에는 동작을 통해 호출된 돌연변이를 제외하고 상태는 불변이라고 쓰여 있습니다.네 알겠습니다.
컴포넌트 mapGetters, mapActions에서 사용하고 있습니다.
스토어:
export default {
namespaced: true,
state: {
color: "violet"
},
mutations: {
changeColor(state, newColor) {
state.color = newColor
},
},
actions: {
changeColor({ commit }, newColor) {
commit('changeColor', newColor)
}
}
컴포넌트:
...
methods: {
...mapActions({
setColor: 'store/changeColor',
}),
myMethodCallByButton(){
this.setColor("blue").then(response => {
console.log("change Color done")
},err => {
console.log("change Color error")
})
}
...
console.log()가 수신되지 않는 것을 제외하고, 메서드는 정상적으로 동작하고 스토어는 갱신됩니다.
매뉴얼에는 mapActions가 이와 동등하다고 기재되어 있습니다.$store.discl.discl.discl.s
- 왜 메시지를 받지 못하는 거죠?
- 다른 해결책이 있나요?
PS: mapGetters map, mapActions를 유지하고 싶습니다.나는 이것을 부르는 것을 좋아하지 않는다.$store.displays($store.syslogs)
PS2: 매장 내 모듈 사용
감사합니다.
모든 Vuex 작업은 를 반환합니다.
Vuex는 작업 기능의 결과를 로 정리합니다.그래서...changeColor
액션 위치:
actions: {
changeColor({ commit }, newColor) {
myAsyncCommand();
}
}
a를 반환한다.Promise
으로 해결되다undefined
그리고 그것은 완료를 기다리지 않을 것이다.myAsyncCommand();
의 비동기 코드(비동기 코드가 포함되지 않은 경우 대기할 필요가 없습니다).
이 문제는 위의 코드가 다음 코드와 동일하기 때문에 발생합니다.
changeColor({ commit }, newColor) {
myAsyncCommand();
return undefined;
}
그리고 언제.dispatch('changeColor', ...)
그러면 Vuex가 돌아옵니다.Promise.resolve(undefined)
.
필요한 경우Promise
대기 액션에 의해 반환됩니다.반환할 필요가 있습니다.Promise
자신을 기다리는 게 아니라다음과 같은 것들이 있습니다.
changeColor({ commit }, newColor) {
return new Promise((resolve, reject) => {
myAsyncCommand().then(resolve);
});
// or, simply: return myAsyncCommand();
}
상세한 것에 대하여는, 이하의 데모 실장을 참조해 주세요.
const myStore = {
namespaced: true,
state: { color: "violet" },
mutations: {
changeColor(state, newColor) {
state.color = newColor
}
},
actions: {
changeColor_SIMPLE({ commit }, newColor) {
commit('changeColor', newColor)
},
changeColor_COMPLICATED_NO_PROMISE({ commit }, newColor) {
setTimeout(() => {
commit('changeColor', newColor)
}, 2000)
},
changeColor_COMPLICATED_WITH_PROMISE({ commit }, newColor) {
return new Promise((resolve, reject) => {
setTimeout(() => {
commit('changeColor', newColor)
resolve();
}, 2000)
});
}
}
};
const store = new Vuex.Store({
modules: {
store: myStore,
}
});
new Vue({
store,
el: '#app',
methods: {
...Vuex.mapActions({
setColorSimple: 'store/changeColor_SIMPLE',
setColorComplicatedNoPromise: 'store/changeColor_COMPLICATED_NO_PROMISE',
setColorComplicatedWithPromise: 'store/changeColor_COMPLICATED_WITH_PROMISE',
}),
myMethodCallByButton(){
this.setColorSimple("blue")
.then(response => console.log("SIMPLE done"),err => console.log("SIMPLE err"));
this.setColorComplicatedNoPromise("blue")
.then(response => console.log("NO_PROMISE done"),err => console.log("NO_PROMISE err"));
this.setColorComplicatedWithPromise("blue")
.then(response => console.log("WITH_PROMISE done"),err => console.log("WITH_PROMISE err"));
}
}
})
<script src="https://unpkg.com/vue@2.5.16/dist/vue.min.js"></script>
<script src="https://unpkg.com/vuex"></script>
<div id="app">
<p>color: {{ $store.state.store.color }}</p>
<button @click="myMethodCallByButton">click me and WAIT for 2s</button>
</div>
업데이트/댓글 단위:
mapAction/dispatch가 약속을 반환하더라도 저는 "변환"의 종료를 기다리는 약속을 추가해야 합니다.매뉴얼에서 mapAction을 통해 정확하게 관리되고 있다고 생각했습니다.정확한가요?
액션이 다음과 같은 변환만을 호출하는 경우:
actions: {
changeColor({ commit }, newColor) {
commit('changeColor', newColor)
return undefined; // added for clarity
}
}
그리고 돌아온 사람들은Promise
다음 시간 이후에만 실행됩니다.commit()
완료됩니다.
Vuex가 돌연변이를 대기하기 때문에 이 문제는 발생하지 않습니다.commit
s)
기다릴 필요가 없기 때문에 그렇게 되는 것입니다.이는 Vuex가 요구하기 때문입니다: 돌연변이는 동기 조작이어야 합니다.
돌연변이는 동기적이기 때문에, 그 선은return
위의 명령어는 앞의 행의 코드 뒤에만 실행됩니다.commit('changeColor', newColor)
).
주의: 돌연변이가 비동기 코드를 가지고 있는 경우, Vuex가 올바르게 동작하는 방법에 반하여 모든 종류의 예기치 않은 동작이 발생할 수 있으므로 동기화할 필요가 있습니다.
언급URL : https://stackoverflow.com/questions/49280576/vuejs-vuex-mapactions
'source' 카테고리의 다른 글
프로젝트 오일러와의 속도 비교: C vs Python vs Erlang vs Haskell (0) | 2022.08.19 |
---|---|
컴파일 가드가 다중 정의 포함을 방지하지 못하는 이유는 무엇입니까? (0) | 2022.08.19 |
Nuxt.js에서 Rails로 전송된 데이터를 저장하고 싶다. (0) | 2022.08.19 |
Vue: 템플릿은 키를 입력할 수 없지만 템플릿을 div로 바꿀 수 없음 - 래퍼 div 요소가 없는 v-for, 중첩된 v-for 루프가 필요합니다. (0) | 2022.08.18 |
외부에서 처리되는 요소를 Vue.js에 추가하시겠습니까? (0) | 2022.08.18 |