我是react native的新手,正在按照medium上的教程學習如何與firebase auth連接。一切似乎都很順利,但我一直收到下面這個警告:
警告:火堿認證連接。
警告。不能在一個未掛載的組件上執行React狀態更新。這是一個無用功,但它表明你的應用程式中存在記憶體泄漏。要解決這個問題,請在 useEffect 清理函式中取消所有訂閱和異步任務。
我幾乎完全按照教程中所說的做了,并嘗試了其他一些方法來修復它,但似乎沒有什么效果。以下是它指出錯誤的代碼:
let currentUserUID = firebase. auth().currentUser.uid。
const [firstName, setFirstName] = useState(''/span>)。
useEffect(() => {
getUserInfo()。
})
async function getUserInfo(){
try {
let doc = await firebase
.firestore()
.collection('user')
.doc(currentUserUID)
.get()。
if (!doc.exists){
Alert.alert('No user data found! ')
} else {
let dataObj = doc.data();
setFirstName(dataObj.firstName)
}
} catch (err){
Alert.alert('There is an error. ', err.message)
}
}
如果有人能幫助我解決這個問題,并解釋到底是什么地方出了問題,那就太好了。
這是鏈接到我所遵循的教程:
uj5u.com熱心網友回復:
這里的問題是,你有可能在一個組件卸載之后,再去排隊進行狀態更新。由于你是直接異步訪問你的Firestore,你可以使用React ref來跟蹤組件是否仍在安裝,然后再排隊更新。
uj5u.com熱心網友回復: 你的getInfoUser()函式是異步的。你應該在useEffect中這樣做:useEffect(async ()=>{await getUserInfo();}, [])。作為useEffect的第二個引數,使用依賴性陣列。使用依賴性陣列與componentDidMount相當。你的效果將只在組件第一次渲染時發生一次。另外,在有些情況下,你需要在useEffect中提供一個清理函式,就像這樣:return () => { //do something or cancel a subscription}
標籤: 上一篇:從資料庫中獲取串列中的值
const isMountedRef = React.ref(null)。
useEffect(() => {
isMountedRef.current = true; // set true when mounted.
return () => isMountedRef.current = false; //unmounted時清除。
}, []);
useEffect(() => {
async function getUserInfo(){
try {
let doc = await firebase
.firestore()
.collection('user')
.doc(currentUserUID)
.get()。
if (!doc.exists){
Alert.alert('No user data found! ')
} else {
let dataObj = doc.data()。
if (isMountedRef.current) { // <-- 檢查是否仍在安裝。
setFirstName(dataObj.firstName) 。
}
}
} catch (err){
Alert.alert('There is an error. ', err.message)
}
}
getUserInfo()。
}, []); // <-- 包括依賴性陣列,安裝時為空以運行一次。
