redux-saga函数如何从状态/存储中获取东西?


Answers:


209

正如@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还提供了一个非常好的视频教程,其中介绍了如何selectors与Redux 一起使用。在Twitter上也请检查这个有趣的线程。


3
正是我想要的..我无法相信我错过了它
亚当·塔尔

28

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

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


有趣的是,这个答案是在接受答案的3.5个小时之前写成的,但是它没有提供示例,因此未能被接受。反正谢谢你!
Aleksandar

1
@Casper-我同意!但这不是您在此处回答问题的速度,而是您的回答有多好。我认为答案必须保持简单易读。这个答案与之不符,被接受的答案更容易理解。
亚当·塔尔

@AdamTal是的,我同意:)
Aleksandar

2

我使用了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)
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.