2016-06-12 68 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

正是我想要的..我無法相信我錯過了它 –