目前正在从事 React + Redux 项目。
我也在用归一化 https://github.com/gaearon/normalizr处理数据结构和reselect https://github.com/reactjs/reselect为应用程序组件收集正确的数据。
一切似乎都进展顺利。
我发现自己处于一种类似叶子的组件需要来自商店的数据的情况,因此我需要connect()
实现它的组件。
作为一个简化的示例,假设该应用程序是一个书籍编辑系统,有多个用户收集反馈。
Book
Chapters
Chapter
Comments
Comments
Comments
在应用程序的不同级别,用户可以贡献内容和/或提供评论。
考虑我正在渲染一个章节,它有内容(和作者)和评论(每个评论都有自己的内容和作者)。
目前我会connect()
and reselect
基于 ID 的章节内容。
因为数据库是使用 Normalizr 进行规范化的,所以我实际上只获取了章节的基本内容字段以及作者的用户 ID。
为了呈现评论,我将使用一个连接的组件,它可以重新选择链接到该章节的评论,然后单独呈现每个评论组件。
再次强调,因为数据库是使用 Normalizr 进行规范化的,所以我实际上只获得了基本内容和评论作者的用户 ID。
现在,为了渲染像作者徽章这样简单的东西,我需要使用另一个连接的组件从我拥有的用户 ID 中获取用户详细信息(无论是在渲染章节作者时还是针对每个单独的评论作者)。
该组件将是这样简单的:
@connect(
createSelector(
(state) => state.entities.get('users'),
(state,props) => props.id,
(users,id) => ( { user:users.get(id)})
)
)
class User extends Component {
render() {
const { user } = this.props
if (!user)
return null
return <div className='user'>
<Avatar name={`${user.first_name} ${user.last_name}`} size={24} round={true} />
</div>
}
}
User.propTypes = {
id : PropTypes.string.isRequired
}
export default User
而且看起来效果很好。
我尝试做相反的事情,在更高的级别上对数据进行反规范化,例如章节数据将直接嵌入用户数据,而不仅仅是用户 ID,并将其直接传递给用户 - 但这仅是似乎只是制作了非常复杂的选择器,而且因为我的数据是不可变的,所以它每次都会重新创建对象。
所以,我的问题是,是否有类似叶子的组件(如上面的用户)connect()
到商店呈现反图案标志?
我是在做正确的事,还是以错误的方式看待这件事?