【问题标题】:Redux saga not listening to action triggered from icon clickRedux saga 不听从图标点击触发的动作
【发布时间】:2018-04-03 14:08:51
【问题描述】:

传奇宣言

function* DoStuffInSaga({myRef}){
    try {
        console.info("saga running");

        return yield delay(1000, 1);
    }
    catch(error){
        console.warn(error);
    }
}

export function* mySaga(){
    yield all([
        yield takeLatest(DO_STUFF_ACTION, DoStuffInSaga)
    ]);
}

从 index.js 暴露的 Saga

export { mySaga } from './mySaga';

传奇初始化

import * as sagas from './';

const initSagas = (sagaMiddleware) => {
    (Object.keys(sagas).map(key => sagas[key])||[]).forEach(sagaMiddleware.run.bind(sagaMiddleware));
}

export default initSagas;

如果我记录 Object.keys(sagas),列表中提到了 saga,所以我认为 Saga 已经开始。

这个函数是从 store 中调用的:

initSagas(sagaMiddleWare);

行动号召

我有一个演示组件可以做到这一点:

import { doStuff } from '../../actions';

function mapDispatchToProps(dispatch) {
    return {
        doStuff: () => dispatch(doStuff())
    };
}

doStuff 在哪里:

export const DO_STUFF_ACTION = 'DO_STUFF_ACTION';

export function doStuff(myRef) {
    console.info('At doStuff action', myRef);
    return { type: DO_STUFF_ACTION, myRef };
}

该动作是通过点击材质 UI 图标调用的:

import { doStuff } from '../../actions';

function DoStuff(){
    doStuff('my-ref-key');
}

<Print className={classes.iconWithText} onClick={DoStuff} />

我的问题

“At doStuff action”正在被记录,它看起来(在我看来)应该是 Saga 正在运行,但它似乎没有在监听传入的动作,因为 saga 没有记录任何内容。 我错过了什么?

更新

这与调用所需操作的方式有关。现在它是在单击图标时触发的,如果我在当前页面组件的componentDidMount 上触发它,则调用 saga 就好了。

【问题讨论】:

    标签: javascript reactjs ecmascript-6 redux-saga


    【解决方案1】:

    也许我在这里遗漏了一些东西,但这是我觉得很有趣的部分:

    export function* mySaga(){
        yield all([
            yield takeLatest(DO_STUFF_ACTION, DoStuffInSaga)
        ]);
    }
    

    documentation 显示 takeLatest 被这样使用:

    function* mySaga() {
      yield takeLatest("USER_FETCH_REQUESTED", fetchUser);
    }
    

    所以我希望你的看起来相似:

    function* mySaga() {
      yield takeLatest(DO_STUFF_ACTION, DoStuffInSaga);
    }
    

    【讨论】:

    • 像最后一个代码块一样进行传奇不会改变任何事情。 all 位是一位同事编写的代码(他正在度假)。这不是像 C# await Task.WhenAll 吗?您可能会争辩说,仅使用一次产量是无用的,但忽略它似乎并没有改变任何事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 2013-06-14
    • 2019-11-24
    相关资源
    最近更新 更多