152

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

简短的回答:

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

3 回答 3

276

正如@markerikson 已经说过的那样,redux-saga公开了一个非常有用的 APIselect()来调用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});
  }
}

除了@markerikson 建议的文档之外,还有一个由 D. Abramov 提供的非常好的视频教程,它解释了如何selectors与 Redux 一起使用。在 Twitter 上查看这个有趣的线程。

于 2016-06-12T22:00:15.263 回答
38

这就是“选择器”功能的用途。您将整个状态树传递给它们,它们会返回一些状态。调用选择器的代码不需要知道数据的状态,只需要知道它被返回了。有关一些示例,请参见http://redux.js.org/docs/recipes/ComputingDerivedData.html

在 saga 中,select()API可用于执行选择器。

于 2016-06-12T18:28:59.763 回答
3

我使用 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)
    }
}
于 2019-10-17T12:34:27.160 回答