【问题标题】:Can I omit Reducer?我可以省略减速器吗?
【发布时间】:2019-08-13 01:04:19
【问题描述】:

我在一个项目中使用 Redux 和 Redux Saga。我正在为应用程序创建一个通知系统。因此,如果任何 Sagas 调用成功或失败操作,则会显示成功或失败通知。

我已经在 Redux Saga 中放置(调用)了通知函数。

SHOW_NOTIFICATION - action
showNotificationSaga = () => { notify({ message: 'Bla Bla' }) };

我看不出有什么理由在这里创建减速器。我的意思是,我没有任何状态来维护通知。所以,我想不为此添加任何减速器。

这样好吗?还是反模式?

谢谢

更新:

另一种方法是直接从其他 sagas 调用 notify()

例如:

sagaForLogin(){
...catch(){
      notify({});
  }
}

有什么推荐吗?

【问题讨论】:

  • 如果你不需要状态,那么你就不需要reducer :)

标签: redux react-redux redux-saga


【解决方案1】:

如果你不需要状态,那么你就不需要reducer

我引用 Ben 是因为他是对的。

各种 sagas 使用动作在它们之间进行通信并触发它们自己。因此,这些动作不仅具有更新状态的经典含义,而且还可以用作通信/触发事件。在纯事件驱动的开发风格(由 Resux-Saga 强制执行的风格)中,动作变成了这样的事件。

【讨论】:

    【解决方案2】:

    如果 saga 不会导致任何状态变化,那么甚至可能不需要 saga 本身。如果您有一些指示成功/失败操作的指标,例如isFetchingdidInvalidateRedux website's example 一样,你可以通过 mapStateToProps 创建一个 props 来让你的组件检测何时以及显示什么通知:

    const mapStateToProps = (state) => ({
        // passing indicators directly
        isFetching: state.myReducer.isFetching,
        didInvalidate: state.myReducer.isFetching
        // or compose into meaningful props
        somethingWrong: !state.myReducer.isFetching && state.myReducer.didInvalidate
    })
    

    【讨论】:

    • 我看到了两种情况,即某个操作不会导致状态更改:1 - saga 正在运行一个没有 UI 反馈(但有通知)的异步流。 2 - 避免组件关心错误通知的显示(避免决定哪个组件应该显示通知)。你怎么看?
    • 我的意思是:当 saga 可以自己完成时,我认为不需要让组件触发通知(在“长”异步和仅 saga 流程的情况下)
    • 是的,我同意@NoriSte。我不希望我的组件有任何类型的逻辑或道具来显示通知。
    • @NoriSte 是的,我明白你的意思。我对答案的假设是异步操作会导致 UI 反馈,因此使用具有良好实现的计算道具(例如记忆选择器)将提高性能而不是 sagas 链。如果不是这样,那么应该使用 sagas 来避免不必要的渲染。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    相关资源
    最近更新 更多