【发布时间】:2017-04-03 18:39:41
【问题描述】:
我正在从 API 获取一组项目(call'em 电影)。每部电影都有几个细节(标题、导演、演员、概要等)
这是我的结构图:
这是 MoviesList 组件:
constructor(props) {
super(props);
this.state = {
movies: []
};
}
componentDidMount() {
fetch('http://localhost:3335/movies')
.then(function(response) {
return response.json()
}).then((movies) => {
this.setState({ movies });
}).catch(function(ex) {
console.log('parsing failed', ex)
})
}
render() {
return (
<div className="movies">
<Movie movies={this.state.movies}></Movie>
</div>
);
}
这是电影:
render() {
const movielist = this.props.movies.map((movie) =>
<li>{movie.title}</li>
);
return (
<ul className="movie">
{ movielist }
</ul>
);
}
我的问题:
- 我应该使用 state 还是 props 将数据从 Movielist 传递到 Movie
- 由于没有“for”模板,我该如何制作,所以我不会在
Movie内创建列表,而是在Movielist内循环整个Movie组件?
比如我想在MovieList里面实现如下:
render() {
return (
<div className="movies">
<Movie for movie in movies></Movie>
</div>
);
}
【问题讨论】:
-
为什么不让movielist在其渲染过程中进行映射,而movie只显示1部电影?发送到电影的详细信息应该/应该通过道具,电影列表可以有状态,但您也可以添加一些 MovieStore 并让它定义电影列表的状态
-
这正是我想要做的——(还不熟悉商店,一步一步来)——你介意用替代实现添加答案吗?
-
如果您以这种方式使用您的组件,为什么不将它们命名为
smart和dumb组件?所以你的MoviesList实际上是Container(应该获取数据并通过props传递给组件)而movie是Component(应该只显示接收到的数据我>)。在这种情况下,将movie重命名为DumbMovieList可能更好:) 所以总的来说,在你的例子中这是一个好方法。为什么需要for in?对我来说const movielist = this.props.movies.map是个好方法!还是有什么问题? -
@OlegPro
for in部分是伪代码,用于显示我想要实现的目标。 (旁注:我确实发现映射部分很难阅读,这对我来说并不自然。)
标签: javascript reactjs