如何使useEffect按顺序运行?

商务中心

我的目标是获取我的API,并在安装组件时对数据进行一些逻辑处理。我创建了另一个useEffect,仅在第一个访存调用成功时才运行。我可以获取所有数据,但是出现错误“无法读取null的属性'length'”。如果我理解正确,那么每当companyData更改时,第二个useEffect就会运行。

错误:

 54 | useEffect(() => {
  55 |   async function organizeReviews() {
  56 |     let companyReviews = []
> 57 |       for(let i = 0; i < companyData.length; i++) {
     | ^  58 |         let reviewsForThisCo = []
  59 |         // loop through userReviews array
  60 |         for(let j=0; j < userReviews.length; j++) {

码:

  const [averageRatings, setAverageRatings] = useState(null)
  const [companyData, setCompanyData] = useState(null)
  const [userReviews, setUserReviews] = useState([])
  const [organizedReviews, setOrganizedReviews] = useState(null)

  // Adding empty [] as second argument to run once component mounts
  useEffect(() => {
    async function getRatings() {
      try{
        const ratingRes = await fetch(process.env.REACT_APP_API_URL + '/api/v1/collected_reviews/')
        const ratingJson = await ratingRes.json()
        setAverageRatings(ratingJson.data)
      } catch(err) {
        console.log(err);
      }
    }

    async function getCompanyData() {
      try{
        const companyDataRes = await fetch(process.env.REACT_APP_API_URL + '/api/v1/companies/')
        const companyDataJson = await companyDataRes.json()
        setCompanyData(companyDataJson.data)
      } catch(err) {
        console.log(err);
      }
    }

    async function getCompanyReviews() {
      try{
        const reviewsRes = await fetch(process.env.REACT_APP_API_URL + '/api/v1/reviews/')
        const reviewsJson = await reviewsRes.json()
        setUserReviews(reviewsJson.data)
      } catch(err) {
        console.log(err);
      }
    }

    getRatings()
    getCompanyData()
    getCompanyReviews()

  }, [])

  useEffect(() => {
    async function organizeReviews() {
      let companyReviews = []
        for(let i = 0; i < companyData.length; i++) {
          let reviewsForThisCo = []
          // loop through userReviews array
          for(let j=0; j < userReviews.length; j++) {
            // if the user review id matches the company id
            if(userReviews[j].company.id === companyData[i].id) {
              reviewsForThisCo.push(userReviews[j])
            }
          }
            companyReviews.push(reviewsForThisCo)
        }
        setOrganizedReviews(companyReviews)
    }
    organizeReviews()
  }, [companyData])
塞思·卢特斯克

每当companyData更改时,第二个useEffect将运行。

确实如此。但它也将始终在组件的初始安装上运行。因此,您必须确保您的内容companyData存在于第二个内容中useEffect,因为它在第一个渲染中将不存在:

  useEffect(() => {

    if (companyData){
      async function organizeReviews() {
        let companyReviews = []
          for(let i = 0; i < companyData.length; i++) {
            let reviewsForThisCo = []
            // loop through userReviews array
            for(let j=0; j < userReviews.length; j++) {
              // if the user review id matches the company id
              if(userReviews[j].company.id === companyData[i].id) {
                reviewsForThisCo.push(userReviews[j])
              }
            }
              companyReviews.push(reviewsForThisCo)
          }
          setOrganizedReviews(companyReviews)
      }
      organizeReviews()
    } // if (companyData)

  }, [companyData])

现在它将在第一次渲染上运行,但是什么都不做,因为companyData还不存在。然后它将在每次companyData更改时运行

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何按顺序运行MiniTest :: Unit测试?

来自分类Dev

Angularjs如何按顺序运行函数?

来自分类Dev

如何按顺序运行js文件

来自分类Dev

如何按顺序和动态运行承诺

来自分类Dev

按组运行顺序

来自分类Dev

按顺序运行Ajax

来自分类Dev

按顺序运行线程

来自分类Dev

按顺序运行 Promise

来自分类Dev

如何与Junit一起按顺序运行测试方法

来自分类Dev

按顺序运行任务:如何处理异常?

来自分类Dev

如何按顺序运行来自不同类的testNG方法

来自分类Dev

如何使用Python按运行顺序重命名JPG文件

来自分类Dev

如何按kedro管道中的声明顺序运行节点?

来自分类Dev

赛普拉斯-如何按顺序运行测试文件

来自分类Dev

如何按字母顺序运行Ansible with_fileglob?

来自分类Dev

如何使协程从外部调用按顺序运行

来自分类Dev

如何按指定顺序运行幻灯片?

来自分类Dev

Java中的功能测试:如何使其按顺序运行

来自分类Dev

如何使用javascript按顺序运行数字语句?

来自分类Dev

如何使用Python按运行顺序重命名JPG文件

来自分类Dev

如何使AddOrUpdate在DbMigrationConfiguration Derived类中按顺序运行

来自分类Dev

如何按顺序运行表达式或函数

来自分类Dev

如何在 Angular 中按顺序运行异步函数?

来自分类Dev

如何按顺序/串联运行 nightwatch 测试用例?

来自分类Dev

如何按顺序运行多个`mapdeck_view`调用?

来自分类Dev

按顺序运行shell脚本

来自分类Dev

TestNG按顺序运行测试

来自分类Dev

按顺序运行robolectric测试?

来自分类Dev

按顺序运行循环数组