정규화된 데이터가 있는 Vuex getter가 반응하지 않음
Vuex 앱에서 데이터를 정규화했지만 데이터 변경 내용을 확인하는 방법에 대한 답을 찾을 수 없습니다.예를 들어, 여기 내 설정의 간단한 버전이 있습니다.
상태:
const state = {
shapes: {
collection: [1, 2, 3],
data: {
1: {
type: 'circle',
isActive: false,
},
},
}
}
취득자:
const getters = {
findShape: (state) => (id) => {
return state.shapes.data[id];
}
allShapes: (state, getters) => {
return state.shapes.collection.map(id => getters.findShape(id));
}
}
내 구성 요소에서 계산된 속성의 allShapes getter를 호출하고 v-for를 통해 모양을 하위 구성 요소로 전달합니다.
computed: {
shapes() {
return this.$store.getters.allShapes;
}
}
도형을 추가 및 삭제하면 정상적으로 동작합니다.문제는 데이터 개체의 속성을 업데이트할 때마다 변경 내용이 내 구성 요소에 반영되지 않는다는 것입니다.다음은 isActive 속성을 설정하는 변환입니다.
const mutations = {
setActive(state, shape) {
Vue.set(state.shapes.data[shape.id], 'isActive', shape.isActive);
}
}
그런 다음 isActive 속성을 참조하는 구성 요소는 업데이트되지 않습니다.이 문제가 발생하는 이유는 알겠지만, 중첩된 어레이 구조로 돌아가는 것 외에는 해결책을 찾지 못했습니다.데이터 개체가 변경될 때 allShapes getter에서 업데이트를 트리거하는 방법이 있습니까?또는 데이터를 컴포넌트로 가져와 반응하도록 하는 다른 방법이 있습니까?
먼저, 에 대한 약간의 배경.Vue.set
.
부르기Vue.set
는 다음 두 가지 작업을 수행합니다.
- 속성이 아직 존재하지 않으면 반응형 속성으로 추가됩니다.
- 속성 값이 업데이트됩니다.
여기 엣지 케이스가 있어요.속성이 이미 존재하지만 반응하지 않는 경우 다음을 사용합니다.Vue.set
반응성을 높이지 않습니다.
디폴트로는 의 속성state
리액티브하게 되어 이 리액티브는 그 안에 있는 모든 오브젝트 및 어레이에 재귀적으로 적용됩니다.state
단, 새로운 속성 추가 시 일반적인 경고가 적용됩니다.새 속성 추가를 Vue에서 감지할 수 없으므로 반응하지 않습니다.이것은 의 사용 사례입니다.Vue.set
새 속성을 추가합니다.
대부분의 경우 데이터를 서버에서 로딩하여 데이터 저장에 사용할 수 있습니다.data
내면의 오브젝트state
이 점이 바로 대응해야 할 중요한 포인트입니다.업데이트하러 올 때까지isActive
너무 늦었을 수도 있어요
다음과 같은 돌연변이가 있을 수 있습니다.
addShape (state, shape) {
state.shapes.data[shape.id] = shape
}
이 지점이 반응성이 떨어지는 지점입니다. 왜냐하면 새로운 속성을 추가되는 것입니다.state.shapes.data
그 결과, 그 결과,shape
물체는 반응성 시스템에 의해 처리되지 않기 때문에 어떤 특성도 반응하지 않습니다.
경우,isActive
자산이 존재하지 않는 경우 실제로 빠져나갈 수도 있습니다.시나리오에서는 「」를 합니다.Vue.set
이 특성이 누락된 것을 발견하고 반응성을 포함하여 추가합니다.그것은 사실 그것보다 더 많은 것을 할 것이다.오브젝트는 아직 반응하지 않기 때문에 오브젝트 전체를 통과하여 모든 속성을 반응시킵니다.하지 않는 은, 「동행하지 않는」의 관련 입니다.state.shapes.data
.
, 속성 「」, 「」, 「」, 「」가 되어 것 .isActive
처음부터 존재합니다.그 결과이다Vue.set
isActive
대신 개체를 캐시에 처음 추가할 때 사용해야 합니다. §:
addShape (state, shape) {
Vue.set(state.shapes.data, shape.id, shape)
}
몇 추측을 .state.shapes.data
하지만 당신의 코드가 제가 설명한 것과 완전히 다르더라도 같은 수정이 적용될 수 있을 정도로 비슷할 것입니다.
【】만 있으면 된다.isActive
되어 있기 때문에 할 필요는 isActive
를 사용합니다.Vue.set
캐시에 쉐이프를 추가하는 것으로 충분합니다.
언급URL : https://stackoverflow.com/questions/59060860/vuex-getters-with-normalized-data-is-not-reactive
'programing' 카테고리의 다른 글
C의 0에 대한 포인터 참조 해제 (0) | 2022.08.15 |
---|---|
캐시가 VUE JS 애플리케이션에서 이전 업데이트된 사진을 표시함 (0) | 2022.08.15 |
상태가 200이고 응답이 있어도 Axios POST는 "Network Error"를 반환한다. (0) | 2022.08.15 |
Perceptron 학습 알고리즘이 0으로 수렴되지 않음 (0) | 2022.08.15 |
Vuex - '변환 핸들러 외부의 vuex 저장소 상태를 변환하지 않음' (0) | 2022.08.15 |