如何从 redux-saga 函数中的状态/存储获取内容?

如何访问 saga 函数中的 redux 状态?

简短的回答:

import { select } from 'redux-saga/effects';
...
let data = yield select(stateSelectorFunction);
80295 次浏览

这就是“选择器”函数的作用。将整个状态树传递给它们,它们返回状态的一部分。调用选择器的代码不需要知道数据的 哪里状态,只需要知道它已经返回。有关一些示例,请参见 http://redux.js.org/docs/recipes/ComputingDerivedData.html

在一个传奇中,select()API可以用来执行一个选择器。

正如@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});
}
}

除了@markerikson 推荐的 医生之外,D。 Abramov 还有一个非常好的 视频教程,它解释了如何在 Redux 中使用 selectors。也可以在 Twitter 上查看 这个有趣的帖子。

我使用 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)
}
}