【问题标题】:How to get something from the state / store inside a redux-saga function?如何从 redux-saga 函数中的状态/存储中获取一些东西?
【发布时间】:2016-10-12 21:01:21
【问题描述】:

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

简答:

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

【问题讨论】:

    标签: javascript reactjs redux react-redux redux-saga


    【解决方案1】:

    正如@markerikson 已经说过的,redux-saga 公开了一个非常有用的 API select() 来调用状态上的 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 建议的doc,还有一个很好的D. Abramov 的video tutorial,它解释了如何在Redux 中使用selectors。还可以查看 Twitter 上的 this 有趣的线程。

    【讨论】:

    • 正是我想要的......我不敢相信我错过了它
    【解决方案2】:

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

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

    【讨论】:

    • 有趣的是,这是在接受答案之前 3.5 小时编写的,但它没有提供示例,因此未能被接受。还是谢谢你!
    • @Casper - 我同意!但这不是关于你在这里回答问题的速度,而是你的回答有多好。我认为答案必须保持简单易读。这个答案与那个不匹配,并且接受的答案更容易理解。
    • @AdamTal 是的,我同意 :)
    【解决方案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)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 2020-01-29
      • 1970-01-01
      • 2017-09-14
      • 2020-06-10
      • 2022-09-25
      • 2018-10-19
      相关资源
      最近更新 更多