使用 redux 初始化全局状态,然后让本地组件状态接管

Posted

技术标签:

【中文标题】使用 redux 初始化全局状态,然后让本地组件状态接管【英文标题】:Using redux to initialize a global state then letting local component state take over 【发布时间】:2019-03-27 12:35:25 【问题描述】:

这更多是关于 react 和 redux 的状态设计/最佳实践问题。

我有一个应用程序,它处理三种数据(专辑、帖子、个人资料)并将它们全部呈现在具有无限滚动功能的单个组件 (ScrollGrid) 中。这个组件从 redux 存储中获取一个“上下文”属性,并派生一个 gridContext 来设置布局。

redux 状态如下所示:

 
  context: "posts",
  pages: [[...],[...]],
  currentPage: 0,
  hasMorePages: true,
  isFetching: false,
  tabPosition: 0

当我的 AppRouter 组件第一次挂载时,它会获取一些提要“帖子”数据,将这些数据设置在 redux 存储中,然后将其传递给 ScrollGrid 组件。 ScrollGrid 组件可以向下嵌套多个组件(并且可以与中间组件交互)。

我的问题是,一旦我将初始数据发送到 ScrollGrid,让 ScrollGrid 组件的本地状态处理相同的状态是否是一种好习惯,或者我是否应该始终更新 redux 存储并向下传递道具?从那时起,我将在本地组件状态中模仿 redux 状态,并且仅在数据类型更改时重新初始化 redux 状态并将其传递回去(例如发布到相册)。

【问题讨论】:

longlist使用scrollview效果不佳,大数据采集可以使用flatlist。在 flatlist 中,您无需担心数据大小,因为它仅加载可以占用可用屏幕空间的元素。 ScrollView 这个名字是巧合,这不是一个 react native 应用。我重命名它以避免混淆。 如果数据只限于一个组件,那么最好在本地维护状态。如果数据可以在不同的组件之间共享,那么在 redux 存储中全局维护状态。 【参考方案1】:

找到了解决办法: 组件并没有真正共享相同的状态(帖子、相册和个人资料都不同),尽管无限滚动功能使它们具有相同的属性(页面、currentPage、isLoading 等)。

无限滚动功能需要转换为 util 函数,用于需要它的不同组件。本地状态会比 redux 存储更适合。

【讨论】:

以上是关于使用 redux 初始化全局状态,然后让本地组件状态接管的主要内容,如果未能解决你的问题,请参考以下文章

如何在同一个反应组件中使用本地状态和 redux 存储状态?

使用 get API 调用反应全局状态/道具(没有 Redux)

ReactJS Redux State(全局状态)+ React.Context(本地状态)

Redux - 处理非常大的状态对象

在 Redux 将 Redux State 映射到 Props 后设置组件状态

如何在 React/Redux 中本地管理组件的状态