4 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超5個(gè)贊
原因是添加項(xiàng)目所花費(fèi)的時(shí)間非常少,這就是為什么在反映之前,它被覆蓋了。您必須在 setData 中使用 prevState 。試試這個(gè):
const [data, setData] = useState([])
const getDataFromFirebase = async () => {
let response = await firestore.collection('someDatabase').get()
response.forEach(item => setData(prevState => ([
...prevState, item.data().name])
);
}
useEffect(() => {
getDataFromFirebase()
},[])

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊
在中使用回調(diào)setData
setData(prevState => ([
...prevState, item.data().name
]));

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
let response = await firestore.collection('someDatabase').get()
response.forEach(item => setData([...data, item.data().name]))
我不熟悉firestore,但是這個(gè)承諾將被解決一次,你應(yīng)該做這樣的事情:
const dataToAdd = response.map(item => item.data().name)
setData(prevState => ([...prevState, ...dataToAdd])
每次setData調(diào)用時(shí)您都在重新渲染組件,您不應(yīng)該在同步循環(huán)中執(zhí)行此操作。
prevState在這里是必需的,因?yàn)槟谑褂卯惒胶瘮?shù)。dataToAdd從理論上講,如果您不在其他任何地方更改狀態(tài),則在使用解決方案后它應(yīng)該可以在沒(méi)有它的情況下工作。

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超6個(gè)贊
[]在您下面的代碼中,即使您稍后更改數(shù)據(jù),數(shù)據(jù)的值也將始終存在。
const getDataFromFirebase = async () => {
let response = await firestore.collection('someDatabase').get()
response.forEach(item => setData([...data, item.data().name]))
}
這就是文檔所說(shuō)的
在功能組件的主體(稱(chēng)為 React 的渲染階段)內(nèi)不允許發(fā)生突變、訂閱、計(jì)時(shí)器、日志記錄和其他副作用。這樣做會(huì)導(dǎo)致 UI 中出現(xiàn)令人困惑的錯(cuò)誤和不一致。
在每個(gè)循環(huán)中調(diào)用 setData 不是一個(gè)好主意。填充一個(gè)數(shù)組并將其傳遞給setData循環(huán)完成后。
const getDataFromFirebase = async () => {
let response = await firestore.collection('someDatabase').get();
let newData = [];
response.forEach(item => newData.push(item.data().name));
// now set the new data
setData(prevData=> ([...prevData, ...newData]));
// or you can use Array.concat
// setData(prevData=> (prevData.concat(newData)));
}
添加回答
舉報(bào)