반응형
vuex에서 반응하지 않는 getter
팔로워가 있다store
정의:
state: () => ({
infoPackCreationData: null,
infoPackCreationTab: null,
}),
getters: {
infoPackImage(state: any) {
return state.infoPackCreationTab && state.infoPackCreationTab.infopackContents
? state.infoPackCreationTab.infopackContents.filter((item: any) => item.type === "IMAGE")
: [];
}
},
mutations: {
setImageData(state:any, infopackImageData: any) {
state.infoPackCreationTab.infopackContents.filter((item: any) => {if(item.type === "IMAGE")
item = infopackImageData
console.log(item , 'this is items');
return item})
}
},
actions: {
setImageData(context: any, payload: any) {
context.commit('setImageData', payload)
}
}
내 컴포넌트에서는,computed
을 손에 넣다imageList
:
computed: {
...mapGetters("creationStore", ["infoPackImage"]),
imageList: {
get() {
return this.infoPackImage ?? [];
},
set(value) {
this.$store.dispatch('creationStore/setImageData', value);
}
}
},
문제는 이 값을 편집하고 싶다는 것입니다.imageList
타고index
드래그 가능한 libarary를 사용하지만 imageList는 반응하지 않고 이미지를 이동할 뿐 이전 인덱스의 다른 이미지는 표시하지 않습니다.
async imageChange(e) {
this.loading = true
let newIndex = e.moved.newIndex;
let prevOrder = this.imageList[newIndex - 1]?.order ?? 0
let nextOrder = this.imageList[newIndex + 1]?.order ?? 0
const changeImageOrder = new InfopackImageService();
try {
return await changeImageOrder.putImageApi(this.$route.params.infopackId,
this.$route.params.tabId,
e.moved.element.id, {
title: e.moved.element.title,
infopackAssetRef: e.moved.element.infopackAssetRef,
order: nextOrder,
previousOrder: prevOrder,
}).then((res) => {
let image = {}
let infopackAsset = e.moved.element.infopackAsset
image = {...res, infopackAsset};
Vue.set(this.imageList, newIndex , image)
this.loading = false
return this.imageList
});
} catch (e) {
console.log(e, 'this is put error for tab change')
}
},
Array.protype.필터는 어레이를 인플레이스 상태로 수정하지 않고 새 어레이를 반환합니다.그래서 이 돌연변이는 어떤 상태도 바꾸지 않습니다.
mutations: {
setImageData(state:any, infopackImageData: any) {
state.infoPackCreationTab.infopackContents.filter((item: any) => {if(item.type === "IMAGE")
item = infopackImageData
console.log(item , 'this is items');
return item})
}
},
그래서, 만약 당신이 바꿀 생각이 있다면state.infoPackCreationTab.infopackContents
filter()의 결과를 할당해야 합니다.
mutations: {
setImageData(state:any, infopackImageData: any) {
state.infoPackCreationTab.infopackContents = state.infoPackCreationTab.infopackContents.filter(...)
하지만, 그 이후로는state.infoPackCreationTab
가지고 있지 않았다infopackContents
초기화 시 Vue.set()을 사용하거나 전체를 바꾸지 않으면 반응하지 않습니다.infoPackCreationTab
새 개체(반응성 돌연변이에 대한 Vuex 참조):
mutations: {
setImageData(state:any, infopackImageData: any) {
state.infoPackCreationTab = {
...state.infoPackCreationTab,
infopackContents: state.infoPackCreationTab.infopackContents.filter(...)
};
언급URL : https://stackoverflow.com/questions/66441246/getters-not-reactive-in-vuex
반응형
'programing' 카테고리의 다른 글
하위 컴포넌트에서 부모 메서드를 호출합니다(Vue.js). (0) | 2022.08.29 |
---|---|
자기 참조 구조 정의? (0) | 2022.08.29 |
플렉스-컬럼을 사용하여 다른 항목을 고정하는 동안 하나의 플렉스박스 항목만 스크롤 (0) | 2022.08.29 |
문자 포인터가 int*에서 캐스트된 후 유효하지 않은 값을 가리키고 있습니다. (0) | 2022.08.29 |
Java에서 시프트 연산자는 어떻게 작동합니까? (0) | 2022.08.29 |