【问题标题】:How to create new element and render data each time the data is fetched in react每次在反应中获取数据时如何创建新元素并渲染数据
【发布时间】:2020-12-06 11:43:53
【问题描述】:

我是新手,我需要渲染和列出从 firebase 获取的数据到我尝试这样做的 html,

const Music = ({ match }) => {
    const [title, setTitle] = useState(null)
    const [user, setUser] = useState(null)
    const [pfp, setPfp] = useState(null)
    const { params: { uID } } = match;
useEffect(()=>{  firebase.database().ref("users/"+uID+"/public/songs/").on("value", (snapshot)=>{
            var musics = snapshot.val()
            Object.values(musics).forEach((value)=>{ 
            //I need to render this title each and create new li
                setTitle(<li>{value.title}</li>)
                
            })
        })    
    }, [])
    
    return(
        <>
            
            <Nav />
            <div id = "profile" className = "main">
                <div class = "profile-container">
                    <div className = "cover-pic">
                        <img src = "" />
                        <div className = "pfp">
                            <img src = {pfp} height = "100" width = "100"/>
                        </div>
                        <div className = "User-Name">
                            <h1>{user}</h1>
                        </div>
                    </div>
                    <div class = "tabsContainer">
                    <div class = "tabs-holder">
                    <NavLink to = {"/u/"+uID+"/music"}><button><span>Music</span></button></NavLink>
                        <button><span>Playlist</span></button>
                        <button><span>About</span></button>
                    </div>
                </div>
                </div>
               
                <div class = "music-content-container">
                    <div class = "music-box">
                        <div class = "user-musics">
                            <ul>
                            //the title should rendered over here
                                {title}
                            </ul>
                        </div>
                    </div>
                </div>
            </div>

            <Header />
   )
}
但它只呈现一个元素。虽然我的数据库中有 5 个元素。如何解决/做到这一点? 如何让程序创建所有 5 个
  • 标签并渲染数据?
  • 【问题讨论】:

      标签: javascript reactjs firebase firebase-realtime-database rxjs


      【解决方案1】:

      不要在useEffect中渲染东西,只是用它来添加逻辑和设置状态:

      const Music = ({ match }) => {
          const [musics, setMusics] = useState([])
          const [user, setUser] = useState(null)
          const [pfp, setPfp] = useState(null)
          const { params: { uID } } = match;
      useEffect(()=>{  
           
              firebase.database()
              .ref("users/"+uID+"/public/songs/")
               .on("value", (snapshot)=>{
                  var musics = snapshot.val()
                  //not sure how music obj is , just set it as an array of something
                  setMusics(musics)
              })    
          }, [])
          
          return(
              <>
                  
                  <Nav />
                  <div id = "profile" className = "main">
                      <div class = "profile-container">
                          <div className = "cover-pic">
                              <img src = "" />
                              <div className = "pfp">
                                  <img src = {pfp} height = "100" width = "100"/>
                              </div>
                              <div className = "User-Name">
                                  <h1>{user}</h1>
                              </div>
                          </div>
                          <div class = "tabsContainer">
                          <div class = "tabs-holder">
                          <NavLink to = {"/u/"+uID+"/music"}><button><span>Music</span></button></NavLink>
                              <button><span>Playlist</span></button>
                              <button><span>About</span></button>
                          </div>
                      </div>
                      </div>
                     {musics &&
                      <div class = "music-content-container">
                          <div class = "music-box">
                              <div class = "user-musics">
                                  <ul>
                                {musics.map((el,key)=><li>{el.title}</li>) }}
                                  </ul>
                              </div>
                          </div>
                      </div>}
      
                  </div>
      
                  <Header />
         )
      }
      

      【讨论】:

      • 它说Cannot read property 'map' of null
      • 更新了,顺便说一句,我说我不知道​​音乐的结​​构
      • 这也是一个简单的检查,你可以轻松修复它
      • idk 为什么它不能以任何其他方式从 firebase 获取数据和渲染?
      猜你喜欢
      • 2018-09-09
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 2016-01-18
      相关资源
      最近更新 更多