【问题标题】:redux-injectors: Using yield select in saga before reducer and saga are injectedredux-injectors:在注入 reducer 和 saga 之前在 saga 中使用 yield select
【发布时间】:2021-12-31 00:45:35
【问题描述】:

您好,这是我的第一个问题。我正在尝试建立一个项目,其中模块以及 redux 和 saga 将使用 redux-injectors 注入到主应用程序中。在我的 sagas 中,我想使用 yield select 来检查一个动作是否更新了状态,然后继续。例如,当我发布图像时,我想确保发布文件没有错误,然后继续。我使用以下功能: export const imageErrors = (state: RootState): IImagesErrorState => state.image.errors 然后在 saga.ts 文件中我这样使用它:

      if (imagesErrors?.postImageError !== null) {
        throw imagesErrors.postImageError
      }

只要 state.image 从一开始就存在于根状态,它就可以正常工作。但是,当我想稍后使用 useInjectReducer 和 useInjectSaga 注入此状态时,我该怎么做?我显然得到一个错误 Property 'image' does not exist on type 'Reducer<CombinedState<{ user: CombinedState<{ auth: IAuthState; errors: IErrorState; }>; }>, AnyAction>'.ts(2339) 那么我们如何处理特定状态的选择器,因为状态还没有包含它们呢? 非常感谢。

【问题讨论】:

    标签: redux css-selectors redux-saga inject


    【解决方案1】:

    不能谈论 Typescript 部分,但就架构而言,您有两种选择。

    一个很明显 - 即在任何地方添加条件或 ? 以避免访问缺少的属性时出错,但这很快就会变得乏味。

    另一个可能更好的选择是重新考虑您的状态和应用程序块。这个正在访问尚不存在的状态的传奇是什么?在你有这样的状态之前它需要运行吗?如果没有,让我们将 saga 移动到与 reducer 相同的块中。在相反的情况下,您需要运行 saga,例如作为运行时块的一部分,那么也许图像状态也应该在运行时块中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-03
      • 2019-05-16
      • 2021-02-01
      • 2017-08-19
      • 2018-01-22
      • 2017-06-14
      相关资源
      最近更新 更多