javascript - Firebase 中未定义的 props

标签 javascript reactjs firebase google-cloud-firestore

我的数据存储在 Firebase 中,我想将其传递给子元素。 问题是,在一两秒 console.log 显示所需数据后,渲染函数中的数据未定义。当我尝试通过 props 将 this.state.appetizers 传递给 MenuItem 组件时,错误提示 props.menu 未定义。


 constructor(){
   super();
   this.state = {
     appetizers: {},
     desserts: {},
     salads: {},
     maindishes: {}
   }
 }

 componentDidMount(){
   db.collection('menu').get().then((snapshot) => {
     snapshot.docs.forEach(doc => {
       this.setState({
         appetizers: doc.data().Appetizers,
       });
     });
   }) ;
 }

 render(){
   const {item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12} = menu;
   console.log(this.state.appetizers.app1); //first log undefined, second is good
   return (
     <Fragment>
       <Navbar/>
       <section id="menu" className="section section__menu">
         <h1 className="heading mb-4">Menu</h1>
         <div className="row">
           <div className="col-lg-6 col-md-12">
             <article className="menu-section__container">
               <h2 className="menu-section__title">{item1.category}</h2>
               <ul className="menu-section__list">
                 <MenuItem menu={this.state.appetizers.app1}/>
                 <MenuItem menu={item2} />
                 <MenuItem menu={item3} />
               </ul>
             </article>
           </div>
           <div className="col-lg-6 col-md-12">
             <h2 className="menu-section__title">{item4.category}</h2>
             <ul className="menu-section__list">
               <MenuItem menu={item4}/>
               <MenuItem menu={item5} />
               <MenuItem menu={item6} />
             </ul>
           </div>

         </div>


const MenuItem = (props) => {
 //Destructing the object menu
 //console.log(props.menu);
 const {name, price, desc} = props.menu;

 return (
         <Fragment>
           <li className="menu-section__item">
             <h3>{name}</h3> <span>{formatPrice(price)}</span>
             <p className="menu-section-description">{desc}</p>
           </li>
         </Fragment>
 );
}

MenuItem.propTypes = {
 menu: PropTypes.shape({
   name: PropTypes.string.isRequired,
   desc: PropTypes.string.isRequired,
   price: PropTypes.number.isRequired
 })
};


最佳答案

该错误是因为一旦您的组件安装完毕,渲染函数就会在执行数据库调用之前执行,并且您会收到错误。因此,在将数据传递给子组件之前,请使用条件来检查数据是否未定义。当您获取数据时,您的整个组件将被重新渲染并且您的数据将被传递。

<ul className="menu-section__list">
      {(this.state.appetizers.app1)?<MenuItem menu={this.state.appetizers.app1}/>:null}
       <MenuItem menu={item2} />
       <MenuItem menu={item3} />
 </ul>

关于javascript - Firebase 中未定义的 props,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54175342/

相关文章:

javascript 检查 setTimeout 是否正在运行

javascript - super 表达式必须为 null 或函数(自定义标记)

VBox 共享文件夹中符号链接(symbolic link)的 Windows 问题

javascript - Firebase 函数错误 - firebase.functions 不是函数

java - 无法在 Firebase valueEventListener 中使用 Context

php - Firebase 推送通知不起作用获取 token 号但仍然不起作用

javascript - 如何在 JavaScript 中获取 lastChild、firstChild 和 nextSibling 内容?

javascript - 如何在javascript中返回字符串的位置?

javascript - 页面上的时间没有更新。有任何想法吗?

javascript - @types/styled-components 重复标识符 FormData