尝试使用内联if-else呈现Footer组件,以避免传递来自Firebase的未定义数据,从而以某种方式传递那些prop,并且Footer组件大喊未定义的prop。
this.state = {
location: {},
hours: {}
};
componentDidMount() {
db.collection('location').get().then(snapshot => {
snapshot.docs.forEach(doc => {
this.setState({
location: { ...doc.data()
}
})
})
});
db.collection('hours').get().then(snapshot => {
snapshot.docs.forEach(doc => {
this.setState({
hours: { ...doc.data()
}
})
})
});
}
render({
{
(this.state.hours) ? < Footer hours = {
this.state.hours
}
location = {
this.state.location
}
/> : null }
})
答案 0 :(得分:2)
您似乎正在将this.state.hours初始化为空对象{}
在Javascript中,空对象的值为true
if ({}) console.log("yes"); // Prints "yes"
也许您应该将其初始化为false
this.state={
location: {},
hours: false
};
答案 1 :(得分:2)
您的代码this.state.hours
永远不会是假的。空对象是真实的。
有关更多详细信息,请参见All falsey values in JavaScript。
您可能需要一个单独的布尔状态,让您知道hours
是否已加载,或者您需要检查this.state.hours
中是否有更特定的内容。另一种选择是将this.state.hours
初始化为false
。
答案 2 :(得分:1)
您不应该检查类似(this.state.hours)?
的状态,当this.state.hours
为0
或''
时将为false,但当this.state.hours
时将为true是{}
。
尝试在条件为null
的情况下使用== null
(以检查null
或undefined
或=== null
来检查null
:
this.state={
location: {},
hours: null
};
componentDidMount(){
db.collection('location').get().then(snapshot => {
snapshot.docs.forEach(doc => {
this.setState({
location: {...doc.data()}
})
})
});
db.collection('hours').get().then(snapshot => {
snapshot.docs.forEach(doc => {
this.setState({
hours: {...doc.data()}
})
})
});
}
render({
{(this.state.hours === null)? <Footer hours={this.state.hours} location={this.state.location}/> : null }
})
答案 3 :(得分:0)
您可以更改渲染代码以检查位置对象是否具有键。像这样
render({
{(Object.keys(this.state.hours).length <= 0)? <Footer hours={this.state.hours} location={this.state.location}/> : null }
})