【发布时间】:2021-12-06 13:50:24
【问题描述】:
我正在学习 ReactJS 钩子和 firebase,我正在从 firestore 获取用户并使用“验证”按钮将 user.status 设置为“已验证”,此代码用于验证 firestore 中的用户,但是我不知道我应该在哪里设置状态 为了让组件重新渲染!
感谢您的帮助!
/* some imports have been hidden for making the code readable */
import React, { useState, useEffect } from 'react'
import {db} from '../firebase'
import { collection, getDocs, query, where, updateDoc, doc } from 'firebase/firestore'
export default function Page() {
const [error, setError] = useState("")
const { currentUser, logout } = useAuth()
const[status, setStatus] = useState("notverified")
const history = useHistory()
// firestore
const [users, setUsers] = useState([])
const usersCollectionRef = collection(db, "users")
const queryInverified = query(usersCollectionRef, where("status","==", "notverified"))
const updateUser = async (id, status)=> {
const userDoc = doc(db, "users", id)
const newStatus = {status: status= "verified"}
setStatus("verified")
await updateDoc(userstDoc, newStatus)
/* Following AKX 's answer! */
setUsers((oldUsers) =>
oldUsers.map((user) =>
user.id === id? {...user, status} : user,
),
);
}
}
useEffect(() =>{
const getUsers = async () => {
const data = await getDocs(queryInverified)
setUsers(data.docs.map((doc)=>({...doc.data(), id: doc.id})))}
getUsers()
}, [])
return (
<>
<Container>
<Card>
<Card.Body>
<div>
{users.map((user) => {
return(
<div className="card mb-4" >
<div className="card-body">
<h5>User Name: {user.name}</h5>
<p>Verification status: {user.status}</p>}
<Button onClick={() =>{updateUser(user.id, user.status)>
Verify</Button>
</div>
</div>
)
})}
</div>
</Card.Body>
</Card>
</Container>
</>
)
}
【问题讨论】:
-
你能把这段代码减少一点,变成minimal reproducible example(例如,删除所有与重现问题没有直接关系的代码,比如大多数 JSX 标记、历史更新等) ,然后当你把它放进去时,确保它正确缩进?代码越清晰,人们就能更好地回答有关它的问题。
-
@Mike'Pomax'Kamermans 感谢您指出这一点
标签: reactjs firebase react-hooks