javascript - 等待数组被填充,然后渲染这些组件

标签 javascript node.js reactjs webpack async-await

我正在通过 Firebase 存储获取目录列表,完成后返回要渲染的 Project 组件列表,每个组件都具有之前检索到的名称。如何首先等待获取完成,然后返回相同数量的 Project 组件?

这是我尝试过的:

import React, {useState} from "react"
import "./index.css"
import {hot} from "react-hot-loader"
import Project from "./Project"
import firebase from "./Firebase.js"

function Projects(props){

    // Get refereance to firebase storage
    let storage = firebase.storage();
    // Reference the main projects folder
    let storageRef = storage.ref().child('projects');
    // Store all project names from firebase storage to then return them as Project components
    let projects = []

    // This lists the directories in 'Projects'
    storageRef.listAll().then(res => {
        // For each directory, push the name into the projects array
        res.prefixes.forEach((folderRef) => {
            projects.push(folderRef.name)
        })
    }).catch(error => {
            console.log(error)
    })

    return(
        <div>
            {projects.map(projName => (
                <>
                    <Project project={projName}/>
                </>

            ))}
        </div>
    )




}

export default hot(module)(Projects)

但是,当返回 projects 时,它是空的,因为它还没有等待上面的 forEach 完成。另外,我认为 projects.map() 中的 return 语句不起作用。我尝试过 Promise 和 Async Await,但不确定如何构建它。

最佳答案

与类组件类似,您需要在功能组件中使用 useState Hook 来定义您的状态

此外,您应该使用 useEffect 钩子(Hook)来处理 HTTP 请求的执行,这样就不会在每次重新渲染时触发它。我们添加了一个空数组 ([]) 作为 useEffect 钩子(Hook)的第二个参数,这样它只会运行一次,如官方 React 钩子(Hook) documentation 中所述。

返回响应后,我们通过调用 setProjects() 更新状态。

function Projects(props){
  const [ projects, setProjects ] = useState([]);
  let storage = firebase.storage();
  let storageRef = storage.ref().child('projects');

  useEffect(() => {
    const response = []
    storageRef.listAll().then(res => {
    // For each directory, push the name into the projects array
      res.prefixes.forEach((folderRef) => {
        response.push(folderRef.name)
      })
      setProjects(response);
    }).catch(error => {
        console.log(error)
    })
  }, [])

  return(
    <div>
        {projects.length && projects.map((projName, index) => (               
           <Project project={projName} key={index} />
        ))}
    </div>
   )
}

export default hot(module)(Projects)

关于javascript - 等待数组被填充,然后渲染这些组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59719650/

相关文章:

javascript - Mongoose 查询不返回错误

node.js - Actor 错误: Cast to ObjectId failed for value "" at path "_id"

reactjs - React 17 JSX Import 与 jest 快照测试

reactjs - 运行弹出的项目抛出 "Expo sdk required expo to run"

javascript - 如何在 AngularJS 中中断/返回 Angular 异步调用

javascript - 在元素加载时调用 javascript 函数

javascript - 如何在 Promise 之前添加额外的逻辑

javascript - 类型错误 : Unable to set property 'props' of undefined or null reference - react native component

javascript - Rails 选择表单 : displaying and using select form value before submit?

javascript - Express js Controller 从 api 服务获取数据并呈现 View