redux를 사용하여 항목을 삭제하는 올바른 방법입니까?
입력을 변경해서는 안되며 개체를 복제하여 변경해야한다는 것을 알고 있습니다. 나는 redux 스타터 프로젝트에서 사용되는 규칙을 따르고 있었다.
ADD_ITEM: (state, action) => ({
...state,
items: [...state.items, action.payload.value],
lastUpdated: action.payload.date
})
항목을 추가하기 위해-스프레드를 사용하여 배열에 항목을 추가합니다.
내가 사용한 삭제 :
DELETE_ITEM: (state, action) => ({
...state,
items: [...state.items.splice(0, action.payload), ...state.items.splice(1)],
lastUpdated: Date.now()
})
하지만 이것은 입력 상태 객체를 변경하고 있습니다-새 객체를 반환하더라도 이것이 금지되어 있습니까?
아니요. 상태를 변경하지 마십시오.
새 객체를 반환하더라도, 절대 원하지 않는 이전 객체를 여전히 오염시키고 있습니다. 이것은 이전 상태와 새 상태를 비교할 때 문제가됩니다. 예를 들어 shouldComponentUpdate
react-redux가 내부적으로 사용하는 경우. 또한 시간 여행을 불가능하게 만듭니다 (예 : 실행 취소 및 다시 실행).
대신 변경 불가능한 방법을 사용하십시오. 항상 사용 Array#slice
하고 절대 Array#splice
.
귀하의 코드 action.payload
에서 제거되는 항목의 인덱스 라고 가정합니다 . 더 나은 방법은 다음과 같습니다.
items: [
...state.items.slice(0, action.payload),
...state.items.slice(action.payload + 1)
],
배열 필터 메서드를 사용하여 원래 상태를 변경하지 않고 배열에서 특정 요소를 제거 할 수 있습니다.
return state.filter(element => element !== action.payload);
코드 컨텍스트에서 다음과 같이 보일 것입니다.
DELETE_ITEM: (state, action) => ({
...state,
items: state.items.filter(item => item !== action.payload),
lastUpdated: Date.now()
})
ES6 Array.prototype.filter
메서드는 기준과 일치하는 항목이있는 새 배열을 반환합니다. 따라서 원래 질문의 맥락에서 이것은 다음과 같습니다.
DELETE_ITEM: (state, action) => ({
...state,
items: state.items.filter(item => action.payload !== item),
lastUpdated: Date.now()
})
객체가있는 배열에 대한 변경 불가능한 "DELETED"감속기의 또 다른 변형 :
const index = state.map(item => item.name).indexOf(action.name);
const stateTemp = [
...state.slice(0, index),
...state.slice(index + 1)
];
return stateTemp;
참고 URL : https://stackoverflow.com/questions/34582678/is-this-the-correct-way-to-delete-an-item-using-redux
'Programing' 카테고리의 다른 글
HTML5 입력 유형 범위 표시 범위 값 (0) | 2020.08.19 |
---|---|
vi 편집기에서 현재 커서 위치에서 주어진 줄 번호까지 삭제 (0) | 2020.08.19 |
입력 유형 = "날짜"필드에 대한 자리 표시자가 표시되지 않음 (0) | 2020.08.19 |
분할 lib_main이 여러 번 정의되었습니다. (0) | 2020.08.19 |
int를 NSString으로 어떻게 변환 할 수 있습니까? (0) | 2020.08.19 |