【问题标题】:How to proper manage redux state?如何正确管理 redux 状态?
【发布时间】:2016-08-05 00:06:24
【问题描述】:

我正在寻找在特定情况下管理 redux 状态的最佳实践方法:

我有一个使用内容编辑器编辑帖子的应用程序,应用程序状态如下所示:

{
  posts: [
    {
      id: 123,
      blocks: [
        {
          setting1: 'fuzz',
          setting2: 'bar',
          ...
        }
      ],
      ...
    },
    ...
  ],

  activeBlock: {
    setting1: 'fuzz',
    setting2: 'bar',
    ...
  }
}

它实际上是我想要的一个状态结构。

此时我的结构如下:

{
  posts: [
    {
      id: 123,
      activeBlockIndex: 0,
      blocks: [
        {
          setting1: 'fuzz',
          setting2: 'bar',
          ...
        }
      ],
      ...
    },
    ...
  ]
}

我有一个用于帖子和内容块的通用减速器。重要的是要提到Content Editor 组件非常复杂,并且有很多深入的子组件。这似乎没问题,它可以工作.. 但是我有一个问题:我必须在Content Editor 的组件中指定太多关于帖子的信息,例如:postId、blockIndex。我认为这不太好,因为 Content Editor 组件的主要职责只是 -- 编辑内容,无论它存储在哪里。

我想重构我的应用程序,因此Content Editor 的组件将包含仅对state.activeBlock 的引用以及仅用于管理state.posts 的帖子和块的其他组件。 (问题中结构的第一个变体)

换句话说,我正在寻找一种在减速器级别(或其他地方,我不知道)将状态分支 state.activeBlock 同步到 state.posts 的方法。

我非常感谢任何建议。

顺便说一句,我在说什么清楚吗?还是应该更详细地重写问题?

【问题讨论】:

    标签: reactjs redux react-redux


    【解决方案1】:

    我不确定我是否完全理解您的要求,但如果您希望每个示例有多个状态“区域”,您可以使用 combineReducers。比如store.js

    import thunkMiddleware from 'redux-thunk'
    import { createStore, combineReducers, applyMiddleware } from 'redux'
    
    import postsReducer from './reducers/postsReducer'
    import activeBlockReducer from './reducers/activeBlockReducer'
    
    const reducers = {
        posts: postsReducer,
        activeBlock: activeBlockReducer
    }
    
    const reducer = combineReducers(reducers)
    const store = createStore(
        reducer,
        applyMiddleware(
            thunkMiddleware
        )
    )
    
    export default store
    

    mapStateToProps 中,您可以使用state.posts[0]state.activeBlock.setting1 连接到您的组件。

    【讨论】:

    • 是的,我已经在使用 combineReducers。感谢您提到 mapStateToProps,我忘记了我可以访问 mapStateToProps 函数中的整个商店对象。但我不确定在这里做同步的东西可以吗?
    • mapStateToProps 只是将状态连接到组件,根本不用于设置状态。如果您不想将设置1、设置2 等移动activeBlock,则没有理由重复状态。您可以在 Reducer 的 state.posts 中的活动帖子上设置 active: true,然后在 ContentEditor 组件的 mapStateToProps 中设置 let activePost = state.posts.filter(post => post.active)[0]; return { post: activePost }。这会将 ContentEditor 中的 post 属性设置为活动帖子,并为您提供其设置。
    • 另外(并且更有可能)您将在 URL 中拥有用户正在编辑的帖子的 id,并且您可以按 ID 过滤 posts...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 2017-08-28
    • 2019-09-12
    • 2016-02-28
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多