一. 容器组件和展示(UI)组件分离
(1) 思想: 将容器与展示(UI)组件分离
基本想法就是容器组件进行数据获取,然后将数据通过 props 属性呈现给相应的子组件(就是相同名称的子组件) eg: StockWidgetContainer ---> StockWIdget
(2) 举例
假设我们有一个关于评论的组件,如果不分离,就要把获取评论数据与把数据展示的代码写在一起。即如下:
but如果我们使用了容器组件与展示组件分离,如下:
- 我们分离了数据获取与呈现问题
- 我们使我们的 CommenList组件可重用
(3) 容器组件和展示组件各自发挥的作用
展示组件:
- 如何展现骨架、样式
- 不直接使用 Redux
- 数据来自于自己的父类容器组件(父类容器组件通过 props 属性传给该组件)
- 数据的修改(通过由父类容器组件通过 props 属性传来的回调函数进行修改)
容器(UI)组件:
- 如何运行(数据更新、状态更新..)
- 直接使用 Redux
- 数据来源,通过用户请求或者输入...并将其保存到Redux state中
- 数据的修改,通过 Redux dispatch派发 actions 来进行数据的更新
(4) 容器组件的实现
总的来说,容器组件就是使用
store.subscribe()从 Redux state树中获取部分数据,并通过 props 来把这些数据提供给要渲染的组件。
我们可以自己手动来写容器组件,但还是建议使用React Redux库里的connect()方法来生成,这个方法做了性能优化,可以避免很多不必要的重复渲染!!!
connect()方法:
connect([mapStateToProps] , [mapDispatchToProps] , [mergeProps] , [options])(UI组件)
mapStateToProps(state , ownProps)这个函数允许我们将 store 中的state作为 props 绑定到组件中;第二个参数是组件自己的 props,可以将自己的 ownProps 也作为 props 绑定到UI组件中,该函数返回一个包括着,要作为 props 进行传递的数据!!!
mapDispatchToProps(dispatch , ownProps),这个函数,将action作为 props 绑定到 UI 组件中。
不管是 stateProps 还是 dispatchProps,都需要和 ownProps merge 之后才会被赋给组件。connect 的第三个参数就是用来做这件事。通常情况下,你可以不传这个参数,connect 就会使用 Object.assign 替代该方法。
- 生成容器组件
二. 传入 store
建议使用 React Redux 提供的
<Provider>组件来让所有的容器组件都可以访问到 store ,只需要在渲染根组件时使用它即可!!!