상태가 업데이트되면 데이터가 변경되는 이유는?
나는 vuex와 함께 vue를 사용하고 있고, 나는 단지 문제를 추적하는데 몇 시간을 보냈다.네가 도와줄 수 있을지도 몰라.
내 질문은 왜 내가 새로운 팀을 만든 후에newTeam
CreateTeam에서 메서드.뷔, 더listOfTeams
내 팀원들.Vue도 업데이트되었는가?
- 나는 내 팀 vue에서 구독이나 시계, 감시자를 만든 적이 없다.왜?
listOfTeams
새 팀 추가하면 업데이트되는 겁니까? - 이게 바로 vuex의 정확한 행동인가?제발 나를 이해시켜 주세요.
여기 내 팀이 있다.부에를 하다
data() {
return { listOfTeams: [] }
},
methods: {
loadRecord: async function() {
const response = await this.$store.dispatch("teams/load");
this.$store.commit("teams/intitialize", response.data);
this.listOfTeams = response.data;
}
},
작성팀.부에를 하다
methods: {
newTeam: async function() {
const response = await this.$store.dispatch("team/store", formData);
this.$store.commit("teams/add", response.data);
}
}
그리고 여기 내가 사용하는 팀들.js (모듈)
const state = { record: {}, };
const actions = {
store({commit,state}, payload) { return httpFile().post('/teams', payload); },
load({ commit, state }, payload = "") { return http().get("teams" + payload); }
};
const mutations = {
intitialize(state, payload) { state.record = payload.data.data; },
add(state, payload) { state.record.unshift(payload.data); },
};
Javascript는 참조 기반의 언어(모든 변수와 구성원이 포인터라는 것을 가장 간단하게 생각할 수 있는 방법)이다.
예를 들어, 이 말은
let x = [];
let a = {y: x}; // Doesn't make a copy of x
console.log(a.y.length); // output is 0
x.push(10);
console.log(a.y.length); // output is 1
a.y
생성 직후 비어 있었지만 멤버는 여전히 같은 배열을 가리키고 있다.x
, 그래서 요소 추가x
또한 에 요소를 추가한다.a.y
왜냐하면 둘 다 같은 대상에 대한 포인터가 되기 때문이야
당신의 코드로
this.listOfTeams = response.data;
을 복사하지 않고 있다response.data
그러므로 만약 그 물체가 수정된다면(예: 비우고 새로운 새로운 배열을 만드는 대신 새로운 값이 추가됨) 당신의 멤버도 바뀔 것이다.
해결 방법:
this.listOfTeams = response.data.slice();
이렇게 하면 회원 클래스가 자체 배열을 가질 수 있으며 다른 코드와 혼동하지 않을 수 있다.response.data
네가 배정한 후에 말이야
이것은 JavaScript 객체 참조 문제 입니다.
에 저장된 일부 비동기 HTTP 호출에서 응답을 받는 경우
response
변수(물체)그 대상을 커밋하면(글쎄요, 그것 때문에)
data
에 있는 당신의 상점으로.intitialize
돌연변이state.record = payload.data.data
여기
payload.data
그리고response.data
같은 목적이다그런 다음 팀 목록을 설정하십시오.
data
같은 목적의 재산.this.listOfTeams = response.data
어느 시점에서도 객체 참조를 위반하지 않으므로 다음에 새 팀을 추가할 때add
돌연변이가 있으면, 그것은 직접 그 스토어 데이터를 조작한다.Array.prototype.unshift()
...
state.record.unshift(payload.data)
너는 세가지 모두를 바꾸고 있다.response.data.data
,this.listOfTeams
그리고state.record
왜냐하면 그것들은 모두 같은 목적어 참조이기 때문이다.
직접 할당을 할 때 개체 참조를 끊을 뿐만 아니라 스토어 상태를 불변으로 간주하는 것이 좋은 이유다.
const mutations = {
intitialize (state, { data }) {
state.record = {...data.data} // break reference via spread
},
add(state, { data }) {
state.record = [data, ...state.record] // immutable
}
}
lodash를 사용하거나 사용하려는 경우 _.cloneDeep을 사용하여 참조를 중단하고 이전 값을 기반으로 새 값을 생성해 보십시오.
참조URL: https://stackoverflow.com/questions/63335011/why-does-the-data-change-when-the-state-is-updated
'IT이야기' 카테고리의 다른 글
Vue 2 제공 / 주입 API를 반응적으로 만드는 방법 (0) | 2022.05.19 |
---|---|
size_t의 최대값을 찾기 위한 휴대용 방법은 무엇인가? (0) | 2022.05.19 |
java.sql.timestamp를 LocalDate(java8) java.time으로 변환하는 방법? (0) | 2022.05.18 |
vuejs 2에서 선택 입력 옵션을 동적으로 변경 (0) | 2022.05.18 |
Vuex-module-decorator 스토어를 동적으로 등록 및 등록 취소하려면 어떻게 해야 하는가? (0) | 2022.05.18 |