Redux传奇中的getState?


75

我有一家商店,上面有物品清单。当我的应用程序首次加载时,我需要对项目进行反序列化,就像在基于项目创建一些内存中对象一样。这些项目存储在我的redux存储中,并由处理itemsReducer

我正在尝试使用redux-saga处理反序列化,这是副作用。在首页加载时,我调度了一个操作:

dispatch( deserializeItems() );

我的传奇故事设置简单:

function* deserialize( action ) {
    // How to getState here??
    yield put({ type: 'DESERISLIZE_COMPLETE' });
}

function* mySaga() {
    yield* takeEvery( 'DESERIALIZE', deserialize );
}

在我的反序列化传奇中,我要处理创建商品的内存版本的副作用,我需要从商店中读取现有数据。我不确定在这里怎么做,或者这是否是我甚至应该尝试使用redux-saga的模式。


为什么要从商店读取数据?您不能只在动作有效载荷中传递数据吗?
gpilotino

Answers:


210

您可以使用选择效果

import {select, ...} from 'redux-saga/effects'

function* deserialize( action ) {
    const state = yield select();
    ....
    yield put({ type: 'DESERIALIZE_COMPLETE' });
}

您也可以将其与选择器一起使用

const getItems = state => state.items;

function* deserialize( action ) {
    const items = yield select(getItems);
    ....
    yield put({ type: 'DESERIALIZE_COMPLETE' });
}

-6

如果在Saga不处理代码流的情况下,如果我们在回调函数中使用Select效果将无济于事。在这种情况下,只需传递dispatchgetState扎根传奇:

store.runSaga(rootSaga, store.dispatch, store.getState)

并将参数传递给子sagas

export default function* root(dispatch, getState) { yield all([ fork(loginFlow, dispatch, getState), ]) }

然后在观看方法

export default function* watchSomething(dispatch, getState) ...


这似乎更像是一种反模式。Redux saga已经是中间件了,不需要这种笨拙的东西。没有由传奇处理的回调函数是什么?将某些东西传递到传奇中如何帮助那些没有由传奇处理的东西?
Yehuda Makarov,

我不同意。yield select()仅适用于传奇背景。只要。Saga可以包含某些功能,以及其他一些通过回调与用户交互的库。到那时触发回调时-传奇可能根本不存在。这是Saga外出时使用商店的一种方式。(例如前端微服务,具有多个商店的Web组件方法,传奇,
React
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.