[英]React Firebase data is undefined
I'm trying to build a fintech website, and I have a users collection and a transactions collection.我正在尝试建立一个金融科技网站,并且我有一个用户集合和一个交易集合。 One user can send money to another user by using their phone number.
一个用户可以使用他们的电话号码向另一个用户汇款。
The user schema contains these用户模式包含这些
uid - string
phone - string
.....//other data
I need to achieve the following functionality我需要实现以下功能
I tried doing that, but I'm getting a bug that in the 3rd step, the data from the 2nd step is undefined.我尝试这样做,但我在第 3 步中遇到一个错误,第 2 步中的数据未定义。 Here's my code
这是我的代码
const SendMoney = () => {
const [receiverDetails, setRecieverDetails] = useState({})
const [allUsers, setAllUsers] = useState([])
const [receiverphone, setReceiverphone] = useState('')
const usersCollectionRef = collection(db, "users")
const getAllUsers = async () => {
const data = await getDocs(usersCollectionRef)
setAllUsers(data.docs.map((doc) => ({ ...doc.data(), id: doc.id })))
}
useEffect(() => {
getAllUsers()
}, [])
const getRecieverDetails = (phone) => {
const receiver = allUsers.filter(u => u.phone === phone)[0]
setRecieverDetails(receiver)
}
const makeTransaction = async () => {
getRecieverDetails(receiverphone)
console.log(receiverDetails) --------> prints {}
const transactionsCollectionRef = collection(db, "transactions")
await addDoc(transactionsCollectionRef,
{
toUser: receiverDetails.uid,
//other data
}
)
}
return (
<div>
<h2>Send money</h2>
<input placeholder='phone number' onChange={e => setReceiverphone(e.target.value)} />
<input type="number" onChange={e => setAmount(e.target.value)} />
<button onClick={makeTransaction}>send money</button>
</div>
)
}
export default SendMoney
My guess is that the addDoc function is called before the receiverDetails gets populated with data.我的猜测是 addDoc function 在 receiverDetails 被数据填充之前被调用。 I am not sure how to fix this bug
我不确定如何修复此错误
Calls to setState
or the setter of a useState
hook are asynchronous.对
setState
或useState
挂钩的设置器的调用是异步的。
Don't use state to pass data between your own pieces of code, but instead use normal variables, and promises or async
/ await
to synchronize.不要使用 state 在您自己的代码段之间传递数据,而是使用普通变量,并使用 promises 或
async
/ await
进行同步。
const SendMoney = () => {
const [receiverDetails, setRecieverDetails] = useState({})
const [allUsers, setAllUsers] = useState([])
const [receiverphone, setReceiverphone] = useState('')
let users; // 👈 new variable
const usersCollectionRef = collection(db, "users")
const getAllUsers = async () => {
const data = await getDocs(usersCollectionRef)
users = data.docs.map((doc) => ({ ...doc.data(), id: doc.id })); // 👈 This is synchronouse
setAllUsers(users); // 👈 This is asynchronous
}
useEffect(() => {
}, [])
const getRecieverDetails = (phone) => {
await getAllUsers()
const receiver = users.filter(u => u.phone === phone)[0]
setRecieverDetails(receiver)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.