레독스 저장소의 중첩된 데이터 업데이트
redux를 사용하여 저장소에 중첩된 데이터 배열을 업데이트하는 가장 좋은/올바른 방법은 무엇입니까?
저희 가게는 다음과 같습니다.
{
items:{
1: {
id: 1,
key: "value",
links: [
{
id: 10001
data: "some more stuff"
},
...
]
},
...
}
}
비동기 작업 쌍이 있어 이 작업을 완료하면items
오브젝트는 갱신하고 싶은 다른 액션쌍이 있다.links
어레이를 설정합니다.
현재 리듀서는 다음과 같습니다만, 이것이 올바른 어프로치인지 어떤지 잘 모르겠습니다.
switch (action.type) {
case RESOURCE_TYPE_LINK_ADD_SUCCESS:
// TODO: check whether the following is acceptable or should we create a new one?
state.items[action.resourceTypeId].isSourceOf.push(action.resourceTypeLink);
return Object.assign({}, state, {
items: state.items,
});
}
Jonny의 답변은 맞지만(당신에게 주어진 상태를 변형시키지 마세요!) 저는 그것에 한 가지 포인트를 더하고 싶었습니다.모든 개체에 ID가 있는 경우 일반적으로 상태 모양을 중첩된 상태로 유지하는 것은 좋지 않습니다.
이것은, 다음과 같습니다.
{
items: {
1: {
id: 1,
links: [{
id: 10001
}]
}
}
}
업데이트하기 어려운 모양입니다.
이럴 필요는 없어!대신 다음과 같이 저장할 수 있습니다.
{
items: {
1: {
id: 1,
links: [10001]
}
},
links: {
10001: {
id: 10001
}
}
}
모든 엔티티의 표준 복사본이 하나만 있기 때문에 업데이트하기가 훨씬 쉽습니다.사용자가 링크를 편집할 수 있도록 해야 하는 경우 업데이트해야 하는 곳은 한 곳뿐입니다.또한 이 링크는 완전히 독립되어 있습니다.items
또는 다른 것을 언급하는 것links
.
API 응답을 이러한 형태로 가져오려면 정규화를 사용합니다.서버 액션내의 엔티티가 정규화되면, 그것들을 현재의 상태로 Marge 하는 간단한 리듀서를 작성할 수 있습니다.
import merge from 'lodash/object/merge';
function entities(state = { items: {}, links: {} }, action) {
if (action.response && action.response.entities) {
return merge({}, state, action.response.entities);
}
return state;
}
이러한 접근 방식의 데모는 Redux의 예를 참조하십시오.
React의 불변성 도우미는 변환 없이 오래된 JavaScript 객체의 업데이트 버전을 만들 수 있는 편리한 방법입니다.
업데이트해야 하는 소스 개체와 업데이트해야 하는 조각 및 변경에 대한 경로를 설명하는 개체를 제공합니다.
예를 들어, 어떤 행동이id
그리고.link
프로퍼티와 그 프로퍼티에서link
를 사용하여 키 입력된 항목의 일련의 링크에 액세스합니다.id
:
var update = require('react/lib/update')
// ...
return update(state, {
items: {
[action.id]: {
links: {$push: action.link}
}
}
})
(예에서는 ES6 계산 속성명을 사용하고 있습니다).action.id
)
언급URL : https://stackoverflow.com/questions/32135779/updating-nested-data-in-redux-store
'programing' 카테고리의 다른 글
동작합니다.php가 테마 업데이트에서 덮어쓰게 되나요? (0) | 2023.02.23 |
---|---|
커스텀 에이잭스를 적절히 구현하는 방법 (0) | 2023.02.23 |
가상화 리스트:업데이트 속도가 느린 목록이 많습니다. (0) | 2023.02.23 |
Angular에서의 $modal 조롱JS 유닛 테스트 (0) | 2023.02.23 |
.forEach()가 완료될 때까지 기다리는 가장 좋은 방법 (0) | 2023.02.23 |