目前正在做一个 react + redux 项目。
我还使用normalizr来处理数据结构并重新选择以收集应用程序组件的正确数据。
一切似乎运作良好。
我发现自己处于叶子状组件需要来自商店的数据的情况,因此我需要connect()
组件来实现它。
作为一个简化的示例,假设该应用程序是一个书籍编辑系统,有多个用户收集反馈。
Book
Chapters
Chapter
Comments
Comments
Comments
在应用程序的不同级别,用户可以对内容做出贡献和/或提供评论。
考虑我正在渲染一个章节,它有内容(和作者)和评论(每个都有自己的内容和作者)。
目前我会根据IDconnect()
和章节内容。reselect
因为数据库是用 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()
到商店以呈现反模式的标志?
我是在做正确的事,还是以错误的方式看待这件事?