2016-06-12 3 views
29

Как получить доступ к состоянию редукции внутри функции саги?Как получить что-то из состояния/магазина внутри функции 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 государства внутри саги.

Я не думаю, что я могу прослушать событие SAVE_PROJECT внутри редуктора проекта curren, а затем внутри редуктора получить проект и отправить другое действие с проектом.

Я действительно не хочу, чтобы моя панель инструментов знала все дерево состояний и отправляла что-либо, связанное с действием для каждого действия.

Как я могу передать состояние себе в сагу? Или только соответствующая часть государства?

ответ

74

Как @markerikson уже говорит, redux-saga выставляет очень полезный API select() для вызова selector о состоянии для получения какой-то его части имеющейся внутри саги.

Для примера простая реализация может быть:

/* 
* 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 Д. Абрамов, который объясняет, как использовать selectors с Redux. Проверьте также this интересную тему в Твиттере.

+2

Точно то, что я хотел .. Я не могу поверить, что пропустил это –

9

Это то, для чего предназначены функции «селектора». Вы передаете им все дерево состояний, и они возвращают часть своего состояния. Код, который вызывает селектор, не обязательно должен знать , где в состоянии, что данные были, только что он был возвращен. Для некоторых примеров см. http://redux.js.org/docs/recipes/ComputingDerivedData.html.

В рамках саги для выполнения селектора можно использовать select() API.

 Смежные вопросы

  • Нет связанных вопросов^_^