我正在开发一个反应(0.14)+ redux(3.3)+ react-redux(4.4)+ react-router (2.0)应用程序,其中包含三个组件:PostsLists
是博客文章标题的列表,Post
显示博客文章和包装这些组件的Blog
:
┌──────────────────────────────────────────────┐
│ │
│ ┌─────────────┐┌──────────────────────────┐ │
│ │ ││ │ │
│ │ Post 1 ││ ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ │ │
│ │ Post 2 ││ Post title │ │
│ │ Post 3 ││ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘ │ │
│ │ ││ │ │
│ │ ││ ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ │ │
│ │ ││ │ │
│ │ ││ │ │ │ │
│ │ ││ Post contents │ │
│ │ ││ │ │ │ │
│ │ ││ │ │
│ │ ││ │ │ │ │
│ │ ││ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ │
│ │ PostsList ││ Post │ │
│ └─────────────┘└──────────────────────────┘ │
│ │
│ Blog │
└──────────────────────────────────────────────┘
到目前为止,我的 redux 状态只是一系列博客文章:
{posts: [{title: 'Post 1', contents: '…'}]}
路线是
/posts
/posts/:id
在/posts
仅显示PostLists
,而在/posts/:id
Post
上也显示(它将是Blog
的孩子)。帖子列表Link
s 到 /posts/:id
.
Blog
将在挂载时从 HTTP API 获取博客文章,因此如果加载例如 /posts/1
Post
可以在显示柱子之前安装。
我的问题是关于管理当前活动帖子。我最初的想法 - 我仍然很喜欢 - 是在该州有一个current_post
领域:
{posts: [{title: 'Post 1', contents: '…'}],
current_post: {title: 'Post 1', contents: '…'}}
但是,当例如加载/posts/1
时,谁应该负责更新current_post
(以确保Post
在更改时重新加载)?如果Post
是一个容器,而我使用mapStateToProps
来current_post
,那么当current_post
被更改时,它会重新渲染吗?
另一种选择是在Post
中检查props.params.id
,然后找到正确的帖子,但这似乎有点脏。人们通常如何构建这样的应用程序?
对于这样的应用程序,我将按如下方式构建 redux 存储:
{posts: [{id: 1, title: 'Post 1', contents: '…'}],
current_post: {id: 1}}
PostsList
组件将负责使current_post
保持最新(即,当用户单击其中一个条目时,将触发一个操作,以减少新选择的帖子在 redux 存储中的id
)。Post
组件将读取当前帖子的id
,从posts
数组中提取相关数据并显示它。每次用户更改当前帖子时,所有组件都将重新渲染,从而更新整个屏幕。
我建议通过 props.params 根据路由加载帖子数据,然后使用 componentWillReceiveProps
检查更新。这将允许您将当前帖子 ID(基于 URL)与传入帖子进行比较,并决定是否需要更新任何内容。
将其放入负责触发数据检索操作的组件中。
您也可以将此信息存储在您的商店中,但我不确定您会获得多少收益。如果您希望能够管理商店中的导航状态,我建议您 https://www.npmjs.com/package/redux-react-router