(React JS) 将元素推入 useEffect 函数内的数组时出现问题
(React JS) problem with pushing elements into an array inside useEffect function
你好,我是 React JS 编程的新手,目前正面临着这方面的麻烦。
它是关于将元素推入数组
import React, { useState, useEffect, useRef } from 'react'
import 'firebase/database';
import firebase from 'firebase';
import RenderTweet from './RenderTweet';
import RenderReply from './RenderReply';
export default function HomeTweet() {
const [tweets, setTweets] = useState([])
const [authUser, setAuthUser] = useState(JSON.parse(localStorage.getItem('authUser')));
const [tweetList, setTweetList] = useState([])
const sortTweetsByTime = (tweets) => {
tweets.sort(function compare(a, b) {
var temp1 = new Date(a.date)
var temp2 = new Date(b.date)
return temp2 - temp1
})
return tweets;
}
useEffect(() => {
let temp = []
firebase.database().ref('users/' + authUser.uid + '/following').once('value').then(function (snapshot) {
snapshot.forEach(element => {
firebase.database().ref('users/' + element.key + '/tweets').once('value').then(function (tweets) {
tweets.forEach(tweet => {
temp.push({
"ref": tweet.ref,
"date": tweet.val().date
})
})
})
})
})
firebase.database().ref('users/' + authUser.uid + '/tweets').once('value').then(function (snapshot) {
snapshot.forEach(tweet => {
temp.push({
"ref": tweet.ref,
"date": tweet.val().date
})
})
})
setTweets(temp)
console.log(temp) //first log
console.log(temp[0]) //second log
// tweets.forEach(tweet => {
// temp2.push(
// <RenderTweet tweetRef={tweet.ref} />
// )
// })
// setTweetList(temp2)
}, [])
return (
<div className="container-fluid" >
{/* {tweetList} */}
</div>
)
}
在第一个日志中,它打印出 temp
包含成功推送元素的数组。 (长度:4)
但在第二个日志中,它打印出 undefined
log screenshot
有人可以帮助找出这段代码中发生了什么吗?
这是两个问题的重复。
你的数组是空的并且temp[0]
是未定义的,因为react useState不是同步的,更新不会生效,直到你的函数组件被评估下一次:
你的第一个 console.log 显示数据是因为你,一个人,在你的功能组件被重新评估并且 useState 生效之前没有检查控制台中的值:
Is Chrome's JavaScript console lazy about evaluating arrays?
你好,我是 React JS 编程的新手,目前正面临着这方面的麻烦。 它是关于将元素推入数组
import React, { useState, useEffect, useRef } from 'react'
import 'firebase/database';
import firebase from 'firebase';
import RenderTweet from './RenderTweet';
import RenderReply from './RenderReply';
export default function HomeTweet() {
const [tweets, setTweets] = useState([])
const [authUser, setAuthUser] = useState(JSON.parse(localStorage.getItem('authUser')));
const [tweetList, setTweetList] = useState([])
const sortTweetsByTime = (tweets) => {
tweets.sort(function compare(a, b) {
var temp1 = new Date(a.date)
var temp2 = new Date(b.date)
return temp2 - temp1
})
return tweets;
}
useEffect(() => {
let temp = []
firebase.database().ref('users/' + authUser.uid + '/following').once('value').then(function (snapshot) {
snapshot.forEach(element => {
firebase.database().ref('users/' + element.key + '/tweets').once('value').then(function (tweets) {
tweets.forEach(tweet => {
temp.push({
"ref": tweet.ref,
"date": tweet.val().date
})
})
})
})
})
firebase.database().ref('users/' + authUser.uid + '/tweets').once('value').then(function (snapshot) {
snapshot.forEach(tweet => {
temp.push({
"ref": tweet.ref,
"date": tweet.val().date
})
})
})
setTweets(temp)
console.log(temp) //first log
console.log(temp[0]) //second log
// tweets.forEach(tweet => {
// temp2.push(
// <RenderTweet tweetRef={tweet.ref} />
// )
// })
// setTweetList(temp2)
}, [])
return (
<div className="container-fluid" >
{/* {tweetList} */}
</div>
)
}
在第一个日志中,它打印出 temp
包含成功推送元素的数组。 (长度:4)
但在第二个日志中,它打印出 undefined
log screenshot
有人可以帮助找出这段代码中发生了什么吗?
这是两个问题的重复。
你的数组是空的并且temp[0]
是未定义的,因为react useState不是同步的,更新不会生效,直到你的函数组件被评估下一次:
你的第一个 console.log 显示数据是因为你,一个人,在你的功能组件被重新评估并且 useState 生效之前没有检查控制台中的值:
Is Chrome's JavaScript console lazy about evaluating arrays?