我已经玩了一段时间的代码了。我正在从 Firebase 获取数据并将该数据中的对象列表填充到此 UserProfile 页面上。我只是想让它工作,这样当我进入个人资料页面时,那里会列出他们的项目列表。
问题是,使用此版本的代码,我必须单击配置文件链接两次才能显示项目,但显示名称显示正常。我知道 setState 是异步的。我试过在 setState 的回调中设置状态。我试过事先检查快照是否存在。我试过 componentDidMount 和 componentDidUpdate。这些事情都没有帮助,我只是最终无法调用 this.state.items.map 或者 newState 是一些空的、奇怪的东西。我现在不知道我哪里错了。
当我控制台调试这个时,看起来 setState 正在被调用,因为到目前为止没有从 Firebase 获取任何东西并且以后永远不会被调用。
也许我设置 newState 的方式有问题,因为当我尝试第一次设置时控制台日志 newState 为空。我只是不知道何时在第一次渲染的适当时间设置它。
class UserProfile extends Component {
constructor(props){
super(props)
this.state = {
redirect: false,
userId: this.props.match.params.id,
displayName: "",
items: []
}
this.userRef = firebaseDB.database().ref(`/Users/${this.state.userId}`)
this.usersItemsRef = firebaseDB.database().ref(`/Users/${this.state.userId}/items`)
}
componentWillMount() {
this.userRef.on('value', snapshot => {
this.setState({
displayName: snapshot.val().displayName
});
});
this.usersItemsRef.on('value', snapshot => {
let usersItems = snapshot.val();
let newState = [];
for (let userItem in usersItems) {
var itemRef = firebaseDB.database().ref(`/items/${userItem}`)
itemRef.once('value', snapshot => {
var item = snapshot.val()
newState.push({
id: itemRef.key,
title: item.title
});
})
}
this.setState({
items: newState
})
});
}
componentWillUnmount() {
this.userRef.off();
this.usersItemsRef.off();
}
render() {
return (
<div style={{marginTop: "100px"}}>
<h1>{this.state.displayName}</h1>
<Link className="pt-button" aria-label="Log Out" to={"/submit_item/"+this.state.userId} >Submit an item</Link>
<section className='display-itemss'>
<div className="wrapper">
<ul>
{this.state.items.map((item) => {
return (
<li key={item.id}>
<h3>{item.title}</h3>
</li>
)
})}
</ul>
</div>
</section>
</div>
);
}
}