Redux 的 React 绑定库包括了 容器组件和展现组件相星散 的开辟头脑。明智的做法是只在最顶层组件(如路由操纵)里运用 Redux。其他内部组件仅仅是展现性的,一切数据都经由过程 props 传入。
那末为何须要容器组件和展现组件相星散呢?
这里有个基本原则:容器组件仅仅做数据提取,然后衬着对应的子组件,记着这个点,Trust me!
看下面这个展现列表的例子,不辨别容器和展现组件的状况
// CommentList.js
class CommentList extends React.Component {
constructor() {
super();
this.state = { comments: [] }
}
componentDidMount() {
$.ajax({
url: "/my-comments.json",
dataType: 'json',
success: function(comments) {
this.setState({comments: comments});
}.bind(this)
});
}
render() {
return <ul> {this.state.comments.map(renderComment)} </ul>;
}
renderComment({body, author}) {
return <li>{body}—{author}</li>;
}
}
可用性:CommentList不能够复用
数据结构:组件应当对所须要的数据有所预期,但这里实在没有,PropTypes能够很好的做到这一点
那末来看下星散的状况:
// CommentListContainer.js
class CommentListContainer extends React.Component {
constructor() {
super();
this.state = { comments: [] }
}
componentDidMount() {
$.ajax({
url: "/my-comments.json",
dataType: 'json',
success: function(comments) {
this.setState({comments: comments});
}.bind(this)
});
}
render() {
return <CommentList comments={this.state.comments} />;
}
}
// CommentList.js
class CommentList extends React.Component {
constructor(props) {
super(props);
}
render() {
return <ul> {this.props.comments.map(renderComment)} </ul>;
}
renderComment({body, author}) {
return <li>{body}—{author}</li>;
}
}
如许就做到了数据提取和衬着星散,CommentList能够复用,CommentList能够设置PropTypes推断数据的可用性
来看下容器组件和展现组件的区分:
展现组件 | 容器组件 |
---|---|
关注事物的展现 | 关注事物怎样事情 |
能够包括展现和容器组件,而且平常会有DOM标签和css款式 | 能够包括展现和容器组件,而且不会有DOM标签和css款式 |
经常许可经由过程this.props.children通报 | 供应数据和行动给容器组件或许展现组件 |
对第三方没有任何依靠,比方store 或许 flux action | 挪用flux action 而且供应他们的回调给展现组件 |
不要指定数据怎样加载和变化 | 作为数据源,一般采纳较高阶的组件,而不是本身写,比方React Redux的connect(), Relay的createContainer(), Flux Utils的Container.create() |
仅经由过程属性猎取数据和回调 | |
很少有本身的状况,纵然有,也是本身的UI状况 | |
除非他们须要的本身的状况,生命周期,或机能优化才会被写为功用组件 |
上风:
展现和容器更好的星散,更好的明白应用程序和UI
重用性高,展现组件能够用于多个差别的state数据源
展现组件就是你的调色板,能够把他们放到零丁的页面,在不影响应用程序的状况下,让设计师调解UI
迫使你星散标签,到达更高的可用性