如何访问 saga 函数中的 redux 状态?
简短的回答:
import { select } from 'redux-saga/effects'; ... let data = yield select(stateSelectorFunction);
这就是“选择器”函数的作用。将整个状态树传递给它们,它们返回状态的一部分。调用选择器的代码不需要知道数据的 哪里状态,只需要知道它已经返回。有关一些示例,请参见 http://redux.js.org/docs/recipes/ComputingDerivedData.html。
在一个传奇中,select()API可以用来执行一个选择器。
select()
正如@markerikson 已经说过的,redux-saga公开了一个非常有用的 API select()来调用状态的 selector,以便在长篇故事中获得其中的一部分。
redux-saga
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}); } }
除了@markerikson 推荐的 医生之外,D。 Abramov 还有一个非常好的 视频教程,它解释了如何在 Redux 中使用 selectors。也可以在 Twitter 上查看 这个有趣的帖子。
selectors
我使用 eventChannel 来分派来自生成器函数中的回调的操作
import {eventChannel} from 'redux-saga'; import {call, take} from 'redux-saga/effects'; function createEventChannel(setEmitter) { return eventChannel(emitter => { setEmitter(emitter) return () => { } } ) } function* YourSaga(){ let emitter; const internalEvents = yield call(createEventChannel, em => emitter = em) const scopedCallback = () => { emitter({type, payload}) } while(true){ const action = yield take(internalEvents) yield put(action) } }