【问题标题】:Do both of these reducers get called on every action dispatch?这两个 reducer 是否都会在每次操作调度时被调用?
【发布时间】:2023-03-28 02:54:02
【问题描述】:
func appStateReducer(state: AppState, action: Action) -> AppState {
  var state = state
  state.moviesState = moviesStateReducer(state: state.moviesState, action: 
    action)
  state.peoplesState = peoplesStateReducer(state: state.peoplesState, 
  action: action)
  return state
}

例如会:

store.dispatch(action: MoviesActions.RemoveFromWishlist(movie: movie))

最终同时调用moviesStatepeoplesState 减速器? 如果是这样,有什么理由不将条件放入每个操作只调用一个减速器?

来源:

https://github.com/Dimillian/MovieSwiftUI/blob/master/MovieSwift/Shared/flux/reducers/AppReducer.swift

上级目录来源:

https://github.com/Dimillian/MovieSwiftUI/tree/52e852fc3da2524fd784374727e747eaba8497b6/MovieSwift/Shared/flux

【问题讨论】:

    标签: swift redux reducers


    【解决方案1】:

    默认情况下,是的,所有的 reducer 函数都会在每个动作上被调用。根据docs 的说法,这极不可能成为性能障碍。通常,只有一个 reducer 进行状态更新,而所有其他 reducer 只是运行它们的 switch 语句,因此时间复杂度与您拥有的 actions 的数量成比例,这不太可能达到足够高的数字来接受重要的时间(10^7 左右)。

    但是,您可以使用 redux-ignore 之类的库使 reducer 忽略特定操作和/或使用 reduxr-scoped-reducer 使 reducer 仅响应特定操作。

    【讨论】:

    • 知道了,谢谢。在每个操作上调用所有子状态化简器的主要原因可能如下:调用所有子状态化简器函数“更安全”,因为这些状态是结构(swift 中的值类型),并且任何赋值 [状态更改所需] 意味着新副本 [与不可变状态 redux 理念一致],因此最好从 1 个来源获得新的子状态结构:子状态减速器的 return state。并且所有 reducer 都有一个必需的操作参数,因此必须传入一些东西 [即使是它不会响应的操作,这将被“忽略特定操作”条件阻止]。
    • 好吧,如果“忽略”你的意思是完全跳过调用一些 reducer 函数,那么这可能是一个问题,是的。但是,如果 reducer 只是立即返回先前状态的副本(因此“忽略”操作)而不进行任何进一步检查,那么这应该不是问题。 redux-ignore 将确保没有任何问题。虽然,正如我所说,没有必要担心在调度时调用所有减速器。这种行为完全消除了许多令人头疼的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 2018-05-29
    相关资源
    最近更新 更多