【发布时间】:2018-04-11 22:48:05
【问题描述】:
谁能告诉我为什么这不起作用?控制台中显示了正确的数据 (console.log(this.state);),但不会传输到 MainContainer。
在构造函数中初始化的相同数据>状态>用户正常工作。问题出在哪里?
应用程序
import React, {Component} from 'react';
import logo from './logo.svg';
import './App.css';
import Header from './components/header/Header';
import MainContainer from './containers/main-container/MainContainer';
class App extends Component {
constructor(props) {
super(props);
this.state = {
users: []
}
}
componentDidMount() {
fetch('https://jsonplaceholder.typicode.com/users')
.then(response => response.json())
.then(users => {
let u = users.map((user) => {
return {id: user.id, name: user.name, email: user.email}
})
return u;
})
.then(u => {
this.setState({users: u});
console.log(this.state);
});
}
render() {
return (
<div className="App">
<Header/>
<MainContainer users={this.state.users}/>
</div>
)
}
}
export default App;
主容器
import React from 'react';
import ActionBar from '../../components/action-bar/ActionBar'
import ListHeader from '../../components/list-header/ListHeader'
import ListItem from '../../components/list-item/ListItem'
import ListItemPlaceholder from '../../components/list-item-placeholder/ListItemPlaceholder'
class MainContainer extends React.Component {
constructor(props) {
super(props);
this.state = {
users : props.users
}
}
render() {
const list = this.state.users.map(
(user) =>
{
const liStyle = {
'background-color': user % 2 == 0 ? '#fbfcfc' : 'transparent',
};
return <ListItem key={user.id} style={liStyle} id={user.id} name={user.name} email={user.email}/>
}
);
return (
<div className={'main-container'}>
<ActionBar />
<ListHeader />
{list}
</div>
)
}
}
export default MainContainer;
.................................................. ..................................................... ......
最好的问候! 克罗瓦
【问题讨论】:
-
数据检索应该在componentWillMount而不是componentDidMount中完成,虽然这不应该是问题。您的 MainContainer 是什么样的?数据只是不显示(可能暗示更新问题)还是 MainContainer 的道具中根本不存在?如果你还没有,我建议使用 React Dev Tools 来轻松调试状态和道具(这样你就不需要把控制台日志放在任何地方)。
-
componentWillMount 不能解决问题。我会在一分钟内添加 MainContainer 列表
-
@GrafWampula 实际上
componentDidMount()是获取数据的地方as also suggested by the react docs。componentWillMount()以UNSAFE_为前缀,从 react 16.3 开始,由于经常以非预期方式使用,可能会在未来的 react 版本中完全删除。