Reducer에서 중첩 상태를 처리하는 것은 다양한 프로그래밍 컨텍스트, 특히 Redux와 같은 상태 관리 라이브러리에서 복잡한 데이터 구조를 관리하는 데 중요한 측면입니다. 저는 Reducer 공급업체로서 고객이 중첩 상태를 효과적으로 처리하는 데 어려움을 겪는 수많은 시나리오를 접했습니다. 이 블로그 게시물에서는 리듀서에서 중첩 상태를 처리하는 방법에 대한 몇 가지 통찰력과 전략을 공유하겠습니다.
중첩 상태 이해
중첩 상태는 객체나 배열에 다른 객체나 배열이 포함되어 있는 데이터 구조를 나타냅니다. 예를 들어, 사용자 프로필을 나타내는 다음 JavaScript 개체를 생각해 보세요.
const userProfile = { 이름: "John Doe", 나이: 30, 주소: { 거리: "123 Main St", 도시: "Anytown", 주: "CA", zip: "12345" }, 취미: ["독서", "달리기", "수영"] };
이 예에서는주소속성은사용자 프로필객체와취미속성은 배열입니다. 리듀서로 작업할 때 사용자 주소 변경, 새 취미 추가 등 중첩된 상태의 특정 부분을 업데이트해야 할 수도 있습니다.
중첩 상태 처리의 과제
리듀서에서 중첩된 상태를 처리하는 것은 여러 가지 이유로 어려울 수 있습니다.
- 불변성: 리듀서는 순수 함수여야 합니다. 즉, 원래 상태를 변경할 수 없습니다. 대신 필요한 변경 사항이 포함된 새 상태 개체를 반환해야 합니다. 중첩된 상태를 처리할 때 불변성을 보장하기 위해 모든 중첩된 객체와 배열의 복사본을 만들어야 하기 때문에 이것이 어려울 수 있습니다.
- 복잡성: 상태가 더 많이 중첩됨에 따라 이를 업데이트하는 코드가 점점 더 복잡해질 수 있습니다. 다양한 사례를 처리하기 위해 여러 수준의 중첩된 조건문을 작성해야 할 수 있으며, 이로 인해 코드를 읽고 유지 관리하기가 어려워질 수 있습니다.
- 성능: 큰 중첩 상태 개체의 복사본을 만드는 것은 계산 비용이 많이 들 수 있으며, 특히 자주 수행해야 하는 경우에는 더욱 그렇습니다. 이로 인해 특히 상태 업데이트 빈도가 높은 애플리케이션에서 성능 문제가 발생할 수 있습니다.
중첩 상태 처리 전략
이러한 문제를 극복하기 위해 리듀서에서 중첩 상태를 처리하는 데 사용할 수 있는 몇 가지 전략은 다음과 같습니다.
1. 스프레드 연산자 사용
스프레드 연산자(...)은 JavaScript에서 객체 및 배열의 복사본을 생성하기 위한 강력한 도구입니다. 원본과 동일한 속성이나 요소를 사용하여 새 개체나 배열을 만든 다음 복사본의 특정 부분을 수정할 수 있습니다.
// 중첩된 객체를 업데이트하기 위해 스프레드 연산자를 사용하는 예 const updateAddress = (state, newAddress) => { return { ...state, address: { ...state.address, ...newAddress } }; }; // 사용법 const newAddress = { 도시: "새 도시", 주: "NY" }; const updateProfile = updateAddress(userProfile, newAddress);
이 예에서는업데이트주소함수는 새로운 것을 생성합니다사용자 프로필업데이트된 주소로 객체를 생성하세요. 스프레드 연산자는 원본의 복사본을 만드는 데 사용됩니다.사용자 프로필그리고주소객체, 그리고 그 다음새주소개체가 복사본에 병합됩니다.주소물체.
2. Object.Assign()을 사용하세요.
그만큼객체.할당()메서드는 개체의 복사본을 만들고 함께 병합하는 또 다른 방법입니다. 대상 개체와 하나 이상의 원본 개체를 사용하고, 원본 개체의 열거 가능한 모든 속성을 대상 개체에 복사합니다.


// 중첩된 객체를 업데이트하기 위해 Object.sign()을 사용하는 예 const updateAddress = (state, newAddress) => { return Object.ass({}, state, { address: Object.sign({}, state.address, newAddress) }); }; // 사용법 const newAddress = { 도시: "새 도시", 주: "NY" }; const updateProfile = updateAddress(userProfile, newAddress);
이 예에서는업데이트주소기능 용도객체.할당()새로운 것을 만들다사용자 프로필업데이트된 주소로 객체를 생성하세요. 첫 번째 주장객체.할당()대상 개체 역할을 하는 빈 개체입니다. 두 번째 인수는 원본입니다.사용자 프로필객체이며, 세 번째 인수는 업데이트된 주소를 가진 객체입니다.
3. 도우미 라이브러리 사용
리듀서에서 중첩 상태를 처리하는 프로세스를 단순화할 수 있는 여러 도우미 라이브러리가 있습니다. 인기 있는 도서관 중 하나는언제나, 상태를 직접 변경하는 것처럼 보이는 코드를 작성할 수 있지만 실제로는 내부적으로 새로운 불변 상태 객체를 생성합니다.
'immer'에서 농산물을 수입하세요. // 중첩된 객체를 업데이트하기 위해 immer를 사용하는 예 const updateAddress = (state, newAddress) => { return producer(state,draft => { Object.sign(draft.address, newAddress); }); }; // 사용법 const newAddress = { 도시: "새 도시", 주: "NY" }; const updateProfile = updateAddress(userProfile, newAddress);
이 예에서는업데이트주소기능 용도언제나직접 변경할 수 있는 상태 객체의 초안을 생성합니다. 그만큼생산하다그런 다음 함수는 초안을 가져와 변경 사항이 포함된 새로운 불변 상태 개체를 만듭니다.
4. 상태 정상화
상태를 정규화한다는 것은 중첩된 데이터 구조를 보다 간단하고 예측 가능한 형식으로 평면화하는 것을 의미합니다. 이렇게 하면 상태를 더 쉽게 업데이트하고 Reducer 코드의 복잡성을 줄일 수 있습니다.
// 사용자 프로필 상태 정규화 예시 constnormalizedUserProfile = { id: 1, name: "John Doe", age: 30, addressId: 1, HobbyIds: [1, 2, 3] }; const 주소 = { 1: { 거리: "123 Main St", 도시: "Anytown", 주: "CA", 우편번호: "12345" } }; const hobbies = { 1: "독서", 2: "달리기", 3: "수영" };
이 예에서는사용자 프로필주소와 취미를 별도의 객체로 분리하여 객체를 정규화합니다. 그만큼사용자 프로필이제 객체에는 주소와 취미에 대한 참조만 포함되므로 독립적으로 업데이트하기가 더 쉬워졌습니다.
실제 사례
리듀서에서 중첩 상태를 처리하는 실제 사례를 살펴보겠습니다.
예 1: 장바구니 업데이트
이름, 가격, 수량과 같은 고유한 세부 정보가 포함된 여러 항목이 포함된 장바구니가 있는 전자 상거래 애플리케이션이 있다고 가정합니다. 장바구니 상태는 다음과 같습니다.
const shoppingCart = { 항목: [ { id: 1, 이름: "제품 1", 가격: 10.99, 수량: 2 }, { id: 2, 이름: "제품 2", 가격: 19.99, 수량: 1 } ] };
장바구니에 있는 품목의 수량을 업데이트하려면 스프레드 연산자와지도업데이트된 항목으로 새 배열을 생성하는 함수:
const updateItemQuantity = (state, itemId, newQuantity) => { return { ...state, items: state.items.map(item => { if (item.id === itemId) { return { ...item, amount: newQuantity }; } return item; }) }; }; // 사용법 const updateCart = updateItemQuantity(shoppingCart, 1, 3);
예 2: 양식 상태 업데이트
각각 고유한 값과 유효성 검사 상태가 있는 여러 필드가 있는 양식이 있다고 가정해 보겠습니다. 양식 상태는 다음과 같습니다.
const formState = { 필드: { 이름: { 값: "", isValid: true }, 이메일: { 값: "", isValid: true }, 비밀번호: { 값: "", isValid: true } } };
양식의 필드 값을 업데이트하려면 스프레드 연산자와 중첩 객체 복사를 사용할 수 있습니다.
const updateFieldValue = (state, fieldName, newValue) => { return { ...state, fields: { ...state.fields, [fieldName]: { ...state.fields[fieldName], value: newValue } } }; }; // 사용법 const selectedFormState = updateFieldValue(formState, "name", "John Doe");
결론
리듀서에서 중첩 상태를 처리하는 것은 어려울 수 있지만 이 블로그 게시물에 설명된 전략을 사용하면 프로세스를 단순화하고 유지 관리가 더 쉬운 코드를 작성할 수 있습니다. 스프레드 연산자를 사용하도록 선택하는지 여부객체.할당(), 다음과 같은 도우미 라이브러리언제나, 또는 상태를 정규화하는 경우 핵심은 불변성을 보장하고 코드를 최대한 단순하게 유지하는 것입니다.
귀하의 애플리케이션에 맞는 고품질 리듀서를 찾고 계시다면 저희가 도와드리겠습니다. 우리는 다음을 포함하여 다양한 감속기를 제공합니다.맞대기 용접 동심 감속기,스레드 감속기, 그리고맞대기 용접 동심 감속기. 당사의 감속기는 최고 수준의 품질과 성능을 충족하도록 설계되었으며 귀하의 특정 요구 사항에 맞는 맞춤형 솔루션을 제공할 수 있습니다. 귀하의 요구 사항에 대해 논의하고 조달 프로세스를 시작하려면 지금 저희에게 연락하십시오.
참고자료
- React Redux 문서: https://react-redux.js.org/
- 항상 문서화: https://immerjs.github.io/immer/
- JavaScript MDN 웹 문서: https://developer.mozilla.org/en-US/docs/Web/JavaScript

