2016-06-12 50 views
29

如何访问saga函数中的redux状态?如何从状态/商店里获取某些内容到redux-saga函数中?

我的问题

我都拥有一个由以下几部分组成的应用程序:

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

每个部分是不同的组件,它有自己减速,传奇,动作和状态。

工具栏上有一个保存按钮,用于分派“SAVE_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状态的项目。

我不认为我可以听curren project reducer内的“SAVE_PROJECT”事件,然后在reducer里面获取项目并派发一个与项目不同的动作。

我真的不希望我的工具栏知道整个状态树,并发送与每个动作相关的动作。

如何将状态自己传递给传奇?还是只有国家的有关部分?

回答

74

正如@markerikson已经说过的,redux-saga公开了一个非常有用的API select()来调用selector状态,以获得saga中的某些部分。

对于示例一个简单的实现可能是:

/* 
* 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}); 
    } 
} 

除了建议通过doc @markerikson,有一个很好的video tutorial由D.阿布拉莫夫这也解释了如何使用selectors与终极版。在Twitter上也检查this有趣的线程。

+2

正是我想要的..我无法相信我错过了它 –