안녕하세요! 저는 리듀서 공급자로서 리듀서의 중첩 상태를 업데이트하는 방법에 대한 질문을 자주 받습니다. 다소 까다로울 수 있는 주제이지만, 일단 익숙해지면 훨씬 쉬워집니다. 이 블로그 게시물에서는 중첩된 상태 업데이트를 효과적으로 처리하는 방법에 대한 몇 가지 팁과 요령을 공유하겠습니다.
먼저 중첩 상태가 무엇인지 이해해 봅시다. 리듀서에서 상태는 다른 객체나 배열을 포함하는 객체일 수 있습니다. 예를 들어, 사용자 프로필을 나타내는 상태 개체가 있을 수 있고 해당 개체 내에 연락처 정보, 기본 설정 등을 위한 하위 개체가 있을 수 있습니다. 이 중첩 구조의 특정 부분을 업데이트해야 하는 경우 Redux(또는 리듀서를 사용하는 다른 상태 관리 라이브러리)가 불변성에 의존하므로 상태를 직접 변경하지 않도록 주의해야 합니다.
불변성이 중요한 이유
불변성은 리듀서를 사용할 때 매우 중요합니다. 상태를 업데이트할 때 기존 상태 개체를 수정하는 대신 새 상태 개체를 반환해야 합니다. 왜냐하면 리듀서는 순수한 함수이고 상태를 변경하면 구성 요소가 올바르게 다시 렌더링되지 않는 등 예상치 못한 동작이 발생할 수 있기 때문입니다.
다음과 같이 중첩된 상태를 갖는 간단한 리듀서가 있다고 가정해 보겠습니다.


constinitialState = { 사용자: { 이름: 'John Doe', 연락처: { 이메일: 'johndoe@example.com', 전화번호: '123 - 456 - 7890' } } }; function userReducer(state =initialState, action) { switch (action.type) { case 'UPDATE_EMAIL': // 여기서 이메일을 업데이트하는 방법을 알아 보겠습니다. return state; 기본값: 상태를 반환합니다. } }
중첩 상태 업데이트 - 얕은 복사본
중첩된 상태를 업데이트하는 한 가지 방법은 상태 개체의 얕은 복사본을 만드는 것입니다. 이를 달성하려면 JavaScript의 스프레드 연산자를 사용할 수 있습니다. 위의 예에서 이메일을 업데이트해 보겠습니다.
function userReducer(state =initialState, action) { 스위치(action.type) { case 'UPDATE_EMAIL': return { ...state, 사용자: { ...state.user, 연락처: { ...state.user.contact, 이메일: action.payload } } }; 기본값: 상태를 반환합니다. } }
이 코드에서는 새로운 상태 객체를 생성합니다. 먼저 기존 상태 개체를 확산합니다. 그런 다음 새 상태 내에서 사용자 개체를 확산합니다. 마지막으로 연락처 개체를 확산하고 작업 페이로드의 새 값으로 이메일 속성을 업데이트합니다.
더 쉬운 업데이트를 위해 라이브러리 사용
상태의 중첩이 매우 깊거나 스프레드 연산자 접근 방식이 너무 번거롭다면 immer와 같은 라이브러리를 사용할 수 있습니다. Immer를 사용하면 상태를 변경하는 것처럼 보이는 코드를 작성할 수 있지만 내부적으로는 변경할 수 없는 복사본이 생성됩니다.
Immer를 사용하여 동일한 중첩 상태를 업데이트하는 방법은 다음과 같습니다.
'immer'에서 농산물을 수입하세요. constinitialState = { 사용자: { 이름: 'John Doe', 연락처: { 이메일: 'johndoe@example.com', 전화번호: '123 - 456 - 7890' } } }; function userReducer(state =initialState, action) { return producer(state,draft => { switch (action.type) { case 'UPDATE_EMAIL':draft.user.contact.email=action.payload;break;default: //아무 것도 하지 않음 } }); }
Immer를 사용하면 코드가 훨씬 깔끔하고 직관적으로 보입니다. 기본적으로 상태를 변경하는 것처럼 코드를 작성하지만 Immer는 변경 불가능한 상태 버전을 생성해 줍니다.
실제 - 감속기 공급에 적용
감속기 공급업체로서 당사는Nema 23 유성 기어박스,직각 유성 감속기, 그리고Nema 34 감속 기어박스. 이러한 감속기를 제어하는 소프트웨어에서는 적절한 상태 관리가 필수적입니다.
예를 들어 Nema 23 유성 기어박스의 제어 시스템에서 상태에는 기어박스의 현재 속도, 토크 및 온도에 대한 정보가 포함될 수 있습니다. 상태의 온도 판독값을 업데이트해야 하는 경우 동일한 불변성 및 중첩 상태 업데이트 원칙을 따릅니다.
중첩 상태의 배열 처리
중첩된 상태의 배열은 업데이트하기가 약간 어려울 수도 있습니다. 사용자 배열이 포함된 상태가 있고 각 사용자에게 연락처 정보에 대한 중첩 개체가 있다고 가정해 보겠습니다.
constinitialState = { 사용자: [ { id: 1, 이름: 'John Doe', 연락처: { 이메일: 'johndoe@example.com', 전화: '123 - 456 - 7890' } }, { id: 2, 이름: 'Jane Smith', 연락처: { 이메일: 'janesmith@example.com', 전화: '098 - 765 - 4321' } } ] }; function userListReducer(state =initialState, action) { 스위치(action.type) { case 'UPDATE_USER_EMAIL': return { ...state, users: state.users.map(user => { if (user.id === action.payload.userId) { return { ...user, contact: { ...user.contact, email: action.payload.newEmail } }; } return user; }) }; 기본값: 상태를 반환합니다. } }
이 예에서는 map 함수를 사용하여 사용자 배열을 반복합니다. 사용자의 ID가 작업 페이로드의 userId와 일치하면 업데이트된 이메일로 새 사용자 개체를 만듭니다. 그렇지 않으면 원래 사용자 개체를 반환합니다.
결론
리듀서에서 중첩 상태를 업데이트하는 것은 다소 어려울 수 있지만 올바른 기술을 사용하면 관리가 가능해집니다. 얕은 복사본에 스프레드 연산자를 사용하든 Immer와 같은 라이브러리를 사용하든 핵심은 불변성을 유지하는 것입니다.
감속기 공급업체로서 우리는 감속기를 제어하는 소프트웨어에서 적절한 상태 관리의 중요성을 이해하고 있습니다. 다음과 같은 고품질 감속기를 시장에 내놓고 있다면Nema 23 유성 기어박스,직각 유성 감속기, 또는Nema 34 감속 기어박스, 질문이 있거나 특정 요구 사항에 대해 논의하고 싶다면 주저하지 말고 문의하세요. 우리는 귀하의 요구에 맞는 완벽한 감속기 솔루션을 찾는 데 도움을 드리기 위해 왔습니다.
참고자료
- 상태 관리에 대한 React 공식 문서
- 항상 도서관 문서






