【发布时间】:2020-07-23 17:53:42
【问题描述】:
我的目标是获取我的 API 并在组件挂载时对数据执行一些逻辑。我创建了另一个 useEffect 仅在第一次 fetch 调用成功时运行。我能够获取所有数据,但出现错误“无法读取 null 的属性‘长度’”。如果我理解正确,第二个 useEffect 将在 companyData 更改时运行。
错误:
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])
【问题讨论】:
-
你试过
console.log在companyData里面使用Effect吗?我想你会发现它在挂载时设置为null时会被触发。
标签: reactjs fetch use-effect