2016-06-12 7 views
29

사가 기능 내에서 redux 상태에 액세스하려면 어떻게해야합니까?redux-saga 함수 내부의 상태/상점에서 얻는 방법은 무엇입니까?

  TOOLBAR   
--------------------------------- 
User info  | Current Project 

각 부분은 그 자체 감속기, 모험, 액션과 상태 다른 구성 요소입니다

내 문제

나는 응용 프로그램은 다음과 같은 부분으로 구성해야합니다.

툴바에는 "SAVE_PROJECT"작업 유형을 전달하는 저장 버튼이 있습니다. 문제는 툴바가 프로젝트를 알지 못하도록한다는 것입니다 (더 많은 책임을지고 유형으로 작업을 전달하기를 원합니다).

... 
export function* saveProjectTask() { 
    while(true) { 
    yield take(SAVE_PROJECT); 
    let project = /* THIS IS THE PROBLEM, I DON'T HAVE THE PROJECT */; 
    yield call(fetch, '/api/project', { body: project, method: 'PUT' }); 
    yield put({type: SAVE_PROJECT_SUCCESS}); 
    } 
} 

나는 사가 내부의 REDUX 상태에서 프로젝트를 얻을 수 없습니다

는 내가 "SAVE_PROJECT"수신 프로젝트 관련 사가있다.

curren 프로젝트 감속기 내부의 "SAVE_PROJECT"이벤트를 듣지 못하고 감속기 내부에서 프로젝트를 가져 와서 프로젝트와 다른 작업을 전달할 수 있다고 생각합니다.

저는 툴바가 전체 상태 트리를 알고 모든 동작에 관련된 동작을 보내지 않기를 정말로 바랍니다.

어떻게 그 상태를 사가에 전달할 수 있습니까? 또는 국가의 관련 부분 만?

답변

74

redux-saga는 사가 내부 사용할 수 그것의 일부를 얻기 위해 상태에 selector를 호출하는 데 매우 유용한 API select()를 노출합니다. 귀하의 예를 들어

은 간단한 구현 될 수있다 :

@markerikson에 의해 제안 된 doc 외에도
/* 
* Selector. The query depends by the state shape 
*/ 
export const getProject = (state) => state.project 

// Saga 
export function* saveProjectTask() { 
    while(true) { 
    yield take(SAVE_PROJECT); 
    let project = yield select(getProject); // <-- get the project 
    yield call(fetch, '/api/project', { body: project, method: 'PUT' }); 
    yield put({type: SAVE_PROJECT_SUCCESS}); 
    } 
} 

는 돌아 오는와 selectors을 사용하는 방법에 대해 설명 D. 아브라모프에 의해 아주 좋은 video tutorial있다. 트위터에 this 흥미로운 스레드도 확인하십시오.

+2

정확히 내가 원했던 .. 나는 믿을 수 없다. 나는 그것을 놓쳤다. –

9

"선택기"기능이있는 것입니다. 당신은 그 (것)들에게 전체 국가 나무를 통과하고, 국가의 어떤 조각을 돌려 보낸다. 선택기를 호출하는 코드는 을 알 필요가 없습니다. 데이터가 반환 된 상태 인이있는 곳입니다. 몇 가지 예는 http://redux.js.org/docs/recipes/ComputingDerivedData.html을 참조하십시오.

사가에서는 select() API을 사용하여 셀렉터를 실행할 수 있습니다. @markerikson 이미 말했듯이