【问题标题】:Redux Reducer DesignRedux 减速器设计
【发布时间】:2016-02-18 00:10:44
【问题描述】:

在处理 Redux 项目时,我发现类似的问题源于开发人员决定使用 UI 组件对他们的 reducer/数据进行建模,而不是孤立地考虑数据(就像您在设计数据库时那样)。

第一季度。我们有一个涉及许多名词/“事物”(曲目、播放列表、用户......)的 UI。您将如何为这些设计减速器?每个单独的减速器?将它们全部放在一个“实体”减速器中?或者其他一些与系统名词没有直接关联的减速器设计?

第二季度。 UI 有两个组件:Explorer 组件和 Sidebar 组件。资源管理器加载项目列表并有一些选项(通过下拉/模式/...),每个选项都可以编辑一些属性。您可以将项目加载到具有用于编辑属性的扩展选项的侧边栏中。

通过其中一个组件将项目标记为“#summer”(发送 http 请求,成功返回)。将涉及/调度哪些 reducer 和 action 创建者以确保组件反映此更新?

【问题讨论】:

    标签: reactjs redux


    【解决方案1】:

    Q1:在有意义的地方创建单独的 reducer,即 Tracks、Playlists、Users,然后使用 combineReducers 之类的东西将它们放在一起。不要用组件树来建模您的商店,它与它无关。

    Q2:您将在商店中有一系列商品,每个商品都有其 ID。然后,您的商店中有一个单独的键,仅在侧边栏中保存当前选定组件的 ID。资源管理器组件调度操作,例如SET_SIDEBAR_ITEM_ID,具有所需项目的 id。侧边栏组件订阅了商店,它会查找 store.sidebar_item_id,当它找到时,它会从商店中获取项目,例如 store.collection.find(item => item.id === selectedId),并将其作为道具传递给侧边栏组件。

    当谈到你的最后一个问题时,组件不会反映任何东西,它们只需要从商店中获取道具(通过 connect 装饰器)。一旦 store 有正确的数据,React 就会为你更新组件。

    【讨论】:

      【解决方案2】:

      我们如何决定要制作什么减速机?

      您的应用程序中有哪些不同的变量或状态片段?有哪些不同的数据?

      让我们录制曲目吧,我猜这些是音乐曲目,你没有说。所以我会选择音乐曲目。

      因此,您将拥有一个音乐曲目列表和一个当前选定的曲目。当前选择的曲目是为用户提供更多详细信息的曲目。

      让我们保持简单,假设您只有曲目,没有播放列表、用户等。

      那么在这种情况下,您只有两个状态,Track ReducerSelection Reducer

      Track Reducer 将负责向用户显示我们的曲目列表。所以它将是一个对象数组,其中每个对象都是一个向用户显示的不同数组,它具有轨道 id 等属性,可能还有轨道描述。

      第二个 reducer,我们称之为 Selection Reducer 只会跟踪当前选择的轨道是什么。

      它的值为 1,这意味着用户知道 id 为 1 的轨迹的更多详细信息。

      因此您可以Track ReducerSelection Reducer。一个提供一个列表,另一个只是跟踪选择的曲目。

      所以,我马上想到你的主要 index.js 减速器,你会在其中:

      import { combineReducers } from ‘redux’;
      
      export default combineReducers({
         tracks: trackReducer
      });
      

      我希望这至少能让你继续前进。与此同时,当您试图弄清楚这一点并且您似乎正在使用列表或数组时,我会像这样开始 combineReducers:

      import { combineReducers } from ‘redux’;
      
      export default combineReducers({
         tracks: () => []
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多