2016-07-23 1 views
9

다른 감속기의 정보가 필요한 감속기가있는 경우가 있습니다. 그렇지 않으면 내가 제대로 인덱스를 결정할 수 없기 때문에, 나는 함수의 두 번째 줄에 store.getState를 호출 할Redux : reducer 함수에서 store.getState()를 호출하면 그 패턴이 anti입니까?

import * as ActionTypes from '../actions/action_type_constants'; 
import KeyCode from 'keycode.js/index'; 
import {store} from "../index"; 
import {mod} from "../pure_functions"; 

export function selectedCompletion(state = 0, action) { 
    if (action.type === ActionTypes.arrowKeyPressed) { 
    const completionsLength = store.getState().completions.data.length; 
    if (action.keyCode === KeyCode.UP) { 
     return mod(state - 1, completionsLength); 
    } else if (action.keyCode === KeyCode.DOWN) { 
     return mod(state + 1, completionsLength); 
    } 
    } 
    return state; 
} 

예를 들어 나는이 감속기 있습니다.

아마도 나는이 리듀서를 리펙토링하여 하나의 커다란 감속기가 될 수 있지만, 가독성을 위해이 옵션을 선호합니다.

감속기에서 store.getState()를 호출하는 패턴을 사용하면 어떻게 든 문제가 발생할지 모르겠습니다.

답변

12

예, 이것은 입니다. 반 패턴은 절대적으로입니다. 감속기 기능은 "순수"해야하며 직접 입력 (현재 상태 및 동작)을 기반으로해야합니다.

Redux FAQ에서 이런 종류의 문제에 대해 설명합니다 (http://redux.js.org/docs/FAQ.html#reducers-share-state). 기본적으로 필요한 추가 정보를 전달하는 사용자 지정 감속기 논리를 작성하거나 작업에 더 많은 정보를 넣어야합니다.

또한 Reduce 문서 섹션 Structuring Reducers을 작성했습니다.이 섹션에서는 감속기 로직과 관련된 몇 가지 중요한 개념에 대해 설명합니다. 나는 당신이 그것을 통해 읽을 것을 권장합니다.

+0

저는 약간 혼란 스럽습니다. getState가 현재 상태를 기반으로하는 위반을 어떻게 부릅니까? 특히 재 배열 할 수없는 타사 감속기의 사용 사례가 있습니다. –

+1

첫째, "순수한 함수"의 정의는 "입력에만 의존하고 자체의 외부에는 아무것도 수정하거나 영향을주지 않는 함수"입니다. 가져온 저장소를 참조하면 _not_ 순수하다는 의미입니다. 둘째, 감속기를 특정 상점 인스턴스에 연결합니다. 즉, 테스트 또는 여러 매장과 같은 경우에는 작동하지 않습니다. 따라서 대부분의 경우 코드 _may_가 작동하지만 확실히 "정확하지는 않습니다". 물건을 다루는 방법에 대한 정보는 FAQ 항목과 [Structuring Reducers] (http://redux.js.org/docs/recipes/StructuringReducers.html)를 다시 읽어보십시오. – markerikson