2017-11-10 3 views
1

카트 리듀서 기능을 추가, 업데이트 및 삭제할 수 있습니다. 나는 또한 redux 저장소 내에 제품 배열을 가지고 있습니다. 제품 배열에 두 개의 항목이 추가되면 두 개의 항목이있는 대신 수량 값이 증가합니다. 필자의 주요 질문은 감속기가 어떤 논리를 포함하는지, 즉 제품 배열에 이미 정확한 제품이 포함되어 있는지 확인하고 제품 수량에 대한 업데이트 만 반환하거나 기존 제품에 대한 검사를 프레젠테이션 구성 요소 내에서 처리하고 새로운 제품 또는 수량 업데이트리액턴스 Redux : 리덕터에 로직이 포함되어야합니까?

function CartReducer (state = initialState, action) { 
    switch (action.type) { 
    case AddToCart: 
     return { 
     ...state, 
     products: [...state.products, action.product], 
     totalPrice: state.totalPrice += (action.price * action.quantity) 
     } 

    case RemoveItemCart: 

     return { 
     ...state, 
     products: [ 
      ...state.products.slice(0, action.index), 
      ...state.products.slice(action.index + 1) 
     ] 
     } 

    case UpdateItemQuantity: 
     return { 
     ...state, 
     products: state.products.map((product, index) => { 
      if (index === action.index) { 
      return Object.assign({}, product, { 
       quantity: action.quantity 
      }) 
      } 
      return product 
     }) 
     } 

    default: 
     return state 
    } 
} 
+1

감속재는 순수한 상태로 원하는 모든 논리를 가질 수 있습니다. 순수한 의미는 비동기 호출이나 컨텍스트 외부의 객체에 대한 변경이나 의존, 상태 변경에 따른 부작용이 없음을 의미합니다. –

+0

React + redux는 CQRS + Event 소싱을 백엔드로 프론트 엔드하는 것입니다. 작업을 파견하는 것은 본질적으로 메시지를 이벤트 대기열에 넣는 것입니다. 감속기를 적용하는 것은 기본적으로 저장소를 다루는 것입니다. 내 의견으로는, 감속기에 들어가는 논리는 국가가 어떻게 저장되는지에 관한 것일뿐입니다. 최적화, 일관성 및 물건. – netchkin

+0

참조로 https : // youtube/fU9hR3kiOK0? t = 21m6s 참조 - 이벤트 스트림을 액션으로 생각할 수 있습니다. 구체화 된 견해에 관해 이야기 할 때, redux 저장소가 주요한 견해 일 것입니다. 그런 다음 감속기는 작업과 관련하여 저장소를 점진적으로 변환하는 기능입니다. 감속기는 불변이어야합니다. 모든 부작용은 조치로 처리해야합니다. 다른 구체화 된 뷰에 관해서는 상태에 적용된 선택자에 의해 생성 된 중간 상태로 간주 될 수 있습니다. 기본적으로 감속기 및 선택기 작성은 여전히 ​​변형 함수입니다. – netchkin

답변

1

:

논리의 조각 감속기 또는 행동 작성자에 가야 정확히 무엇에 단 하나의 분명한 대답은 없다

. 일부 개발자는 단순히 "액션"에서 데이터를 가져 와서 맹목적으로 해당 상태로 병합하는 "씬"감속기를 사용하여 "뚱뚱한"액션 제작자를 선호합니다. 다른 사람들은 작업을 최대한 작게 유지하고 작업 작성자에서 getState()의 사용을 최소화하려고 노력합니다. (이 질문의 목적을 위해, 사가 (sagas)와 관찰자 (observables)와 같은 다른 비동기 접근법은 "액션 크리에이터"범주에 속한다.)

당신의 감속기에 더 많은 로직을 넣으면 잠재적 인 이점이있다. 액션 유형이 더 의미 있고 더 의미가있을 가능성이 높습니다 (예 : 'SET_STATE'대신 'USER_UPDATED'). 또한 감속기에 더 많은 논리를 적용하면 시간 이동 디버깅의 기능이 더 많이 영향을받습니다.

이 댓글이 잘 이분법을 요약 :

을 이제 문제는 감속기의 행동 작성자 무엇에 넣어 것입니다, 지방과 얇은 액션 객체 사이의 선택. 액션 생성자에 모든 로직을 넣으면 기본적으로 업데이트 상태를 선언하는 뚱뚱한 액션 객체로 끝납니다.리 듀서는 순수하고, 멍청하고, 추가가되고, 제거하고, 이러한 기능을 업데이트합니다. 그들은 쉽게 구성 할 수 있습니다. 그러나 귀하의 비즈니스 로직은 그리 많지 않습니다. 감속기에 더 많은 로직을 넣으면 멋지고 얇은 액션 객체로 끝나고 대부분의 데이터 논리는 한 곳에서 처리되지만 감속기는 다른 브랜치의 정보가 필요할 수 있기 때문에 작성하기가 어렵습니다. 당신은 큰 감속기 또는 감속기로 끝나고 더 높은 국가로부터의 추가적인 논증을 취합니다.

는 또한 my own thoughts on "thick and thin" reducers을 썼다 :

감속기에 더 많은 로직을 넣어 대 액션 제작자에 더 많은 로직을 넣어 유효 장단점이있다. 내가 최근에 보았던 좋은 점 중 하나는 감속기에 더 많은 로직이 있다면, 이는 시간 여행 디버깅 (일반적으로 좋은 것이 될 것입니다.) 인 경우 재실행 할 수있는 더 많은 것들을 의미한다는 것입니다.

저는 개인적으로 로직을 한 번에 두 곳에 넣는 경향이 있습니다. 나는 행동을해야 하는지를 결정할 시간이 걸리는 행동 창조자를 작성한다. 만약 그렇다면 내용이 무엇이되어야 하는가? 그러나 필자는 또한 대응하는 감속기를 작성하여 동작의 내용을보고 응답으로 복잡한 상태 업데이트를 수행합니다.

1

가장 확실하게! 리 듀서는 순수한 기능이어야하므로 로직도 순수해야합니다. 즉, 부작용이 없어야합니다. 부작용이 포함됩니다 (이에 국한되지 않음) :

  • 데이터베이스 요청/저장
  • 파일 IO를
  • REST/비동기은 어떤 종류의
  • 글로벌 또는 외부 돌연변이
  • 데이터 돌연변이를 호출

그래서 reducers는 들어오는 상태를 변경해서는 안되지만 사본에만 수정 사항이있는 복사본을 반환해야합니다. 변경할 수없는 값 (문자열, 숫자, 정의되지 않은 값 등)은있는 그대로 반환 될 수 있으며 수정되지 않은 경우 상태를 반환 할 수 있습니다. 그러나 입력을 변경해야하는 경우 새 사본이나 새 값을 반환합니다.

감속기에서 호출되는 로직과 관련하여 모든 코드가 이러한 요구 사항을 충족하는 한 Redux 패턴과 직렬로 연결됩니다.

불행히도 JavaScript에는 특정 코드에 부작용이있을 때 (다른 언어의 경우) 확실하게 알 수있는 방법이 없으므로 사용자가 무엇을 부르고 있는지 알 수 있어야합니다.

실패하면 Redux가 작동하지 않습니까? 아닙니다. 그러나 Flux/Redux 개발자가 기대하는대로 작동하지 않을 수도 있습니다. the Redux FAQ entry on splitting logic between reducers and action creators