Rhe*_*hee 9 javascript reactjs redux react-redux
我的问题和标题一样.
假设我写了以下代码.
class TODOList extends Component {
render() {
const {todos, onClick} = this.props;
return (
<ul>
{todos.map(todo =>
<Todo
key={todo.id}
onClick={onClick}
{...todo}
/>
)}
</ul>
);
}
}
const mapStateToProps = (state) => {
return {
todos: state.todos
}
}
const mapDispatchToProps = (dispatch) => {
return {
onClick(data){
dispatch(complete(data))
}
}
}
export default connect(mapStateToProps,mapDispatchToProps)(TODOList);
Run Code Online (Sandbox Code Playgroud)
现在,在最后一行之后,此代码将导出TODOList组件,其状态为props.它不是包含状态,而是只是接收状态并将它们作为"道具",就像方法名称"mapStateToProps"解释的那样.
在Dan Abramov编写的媒体文章(https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0)中,容器组件将数据作为状态处理,而表示属性作为道具处理.它不是一个将数据作为道具处理的表示组件吗?我坚持认为合适的容器应该像下面那样.
class CommentList extends React.Component {
this.state = { comments: [] };
componentDidMount() {
fetchSomeComments(comments =>
this.setState({ comments: comments }));
}
render() {
return (
<ul>
{this.state.comments.map(c => (
<li>{c.body}—{c.author}</li>
))}
</ul>
);
}
}
Run Code Online (Sandbox Code Playgroud)
我不确定为什么react-redux将API命名为"mapStateToProps",当我试图制作'有状态'(不按属性处理数据)容器组件时
Sag*_*b.g 10
首先,这些指南不是圣经的一部分,
您应该为您和您的TEAM编写易于推理的代码.
我认为你遗漏了一些东西,一个redux容器与一个反应容器不同.
我的意思是,connect将为您创建容器,这并不意味着包装组件是一个Container.
基本上,您可以从同一文件导出两个版本,即Container(连接版本)和演示文稿版本(无连接版本).
通常会引起人们注意的另一件事是函数的名称和参数mapStateToProps.
我喜欢的名字mapStoreToProps,如
将
redux商店映射到组件的道具.
state当我们处于上下文中时,名称可能会令人困惑react.
编辑
作为评论的后续内容:
我完全不知道这两个实际上是不同的.你能告诉我更多细节吗?
它们与connect为您创建"容器" 的方式不同.
connect是一个高阶组件,为我们创建容器组件,所有订阅逻辑+函数将商店和动作创建者的部分作为道具(mapStateToProps&mapDispatchToProps)传递给子项.
"普通"容器通常是指您手工编写的组件,它通常不处理事物的外观,而是处理应用程序的某些逻辑.
至于其他评论
react-redux的connect HoC只是将您可以请求的属性注入组件中.它返回一个包含在组件周围的新组件,以便每当您对redux存储感兴趣的状态被修改时它就可以更新组件
正如我上面提到的,这是部分正确的.它不只是将属性注入我们的组件,它订阅商店,从Provider(通过context)抓取它,并在考虑优化的情况下完成所有这些,因此我们不必自己完成.
我不确定mapStateToProps如何混淆某人.我们正在谈论一个州管理图书馆
我已经看到一些开发者误解了这个,因为react有一个state并且redux有一个store(至少在大多数教程和文档中调用它的方式).
对于一些react或两者都不熟悉的人来说,这可能会令人困惑redux.
编辑2
由于句子"它并不意味着包裹的组件是一个容器",这有点令人困惑.为什么包裹的组件不是容器?连接创建的组件也不是容器吗?
我的意思是你写的包装组件不一定是 Container.
您可以连接"演示"组件:
const Link = ({ active, children, onClick }) => {
if (active) {
return <span>{children}</span>
}
return (
<a
href=""
onClick={e => {
e.preventDefault()
onClick()
}}
>
{children}
</a>
)
}
// ...
export default connect(mapState, mapDispatch)(Link)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
464 次 |
| 最近记录: |