我正在前端使用React和Redux构建一些即时消息应用程序。我有“ Main”(初始化Web套接字并渲染其他组件),“ Chat”,“ FriendsList”和“ Friend”之类的组件
我经常想知道是应该直接将一个孩子或孙子连线到Redux(假设需要),还是将这些道具从父母/祖父母那里传递出去。
例如,我通过以下方式在Main组件中渲染“聊天”:
<Chat
onTyping={this.onTyping}
onSubmitMessage={(value) => { this.submitMessage(value) }}
messages={this.props.messages[this.props.activeFriend] || []}//This comes from Redux
isMessagingAvailable={this.isMessagingAvailable()}
/>
如您所见,我正在传递“消息”道具,该道具又来自Redux。我当然可以将Chat单独连接到Redux。
然后的问题是,在这种情况下是否存在关于最佳实践的约定。 是否应该将消耗全局状态的每个组件直接连接到Redux?
答案 0 :(得分:1)
模块化设计的思想是拥有尽可能多的通用组件。
这些组件应该独立于外界(即Redux Store )。
据我所知,任何应用程序的结构都应类似于:
input box
让我们创建一个包含基本信息的表单:
对于这种形式,您需要以下组件:
您可以将textInput
用于FirstName
,lastName
和email
。因此,如果直接将其绑定到存储,则将使其依赖于您自己的redux结构。因此,这些组件无法在其他任何地方使用。
因此,最好的主意是创建可接收道具并做事的哑巴组件。
您具有以下模块:
将来,您计划再添加几个模块:
现在,个人,漫游器和群组聊天的聊天窗口将相似,但是商店结构将变得困难。尤其是对于群聊。
那么您如何确定应该绑定哪个组件来存储?
您应该为视图创建嵌套的组件层次结构,并为业务模块创建HOC。这样,您的视图组件就不依赖于存储。您的HOC将提供数据,仅此而已。
因此,在您的情况下,您将具有以下HOC:
并且您可以具有以下视图组件:
答案 1 :(得分:1)
Imho确实取决于情况:
1)如果Child组件独立使用数据,它将始终从全局状态树的同一分支中获取数据:我会将其连接到Redux。
总是从state.tasks获取任务列表的TaskList组件
CurrentUserDetail组件,该组件始终从state.currentUser获取用户信息
2)如果Child组件根据其父级消耗数据:我将通过props从父级获取数据。或者从父级那里获取有关如何从全局状态中获取数据的说明,然后将其连接到Redux并获取相应的数据:
一个Task组件,它从其父TaskList组件获取每个任务的任务数据
一个TaskList组件,该组件从其父级获取taskListID,然后获取相应的任务列表。例如:taskListID =“ Martin”-> state.tasks ['Martin']