我有一个自定义钩子:
import React, { useState, useEffect } from 'react';
import { Alert } from 'react-native';
import firebase from "../../firebase";
export default function useCurrentUserDetails() {
const uid = firebase.auth().currentUser?.uid;
const [data, setData] = useState(null);
useEffect(() => {
if (!uid) {
setData(null);
return;
}
const unsubscribe = firebase.firestore().collection("users").doc(uid).onSnapshot((snapshot) => {
if (snapshot.exists) {
setData(snapshot.data());
} else {
setData(null);
}
})
return unsubscribe;
}, [uid]);
const updateCurrentUserData = (newData) =>
firebase.firestore().collection("users").doc(uid).set(newData).then(() => {
Alert.alert(
'Profile Updated',
'Nice work!',
[
{ text: 'OK' }
],
{ cancelable: false }
);
}).catch((error) => {
Alert.alert(
'Something went wrong',
'Give it another go',
[
{ text: 'OK' }
],
{ cancelable: false }
);
});
return [data, updateCurrentUserData];
}
在我看来,我调用如下:
const [currentUserDetails, setCurrentUserDetails] = useCurrentUserDetails();
当按下按钮时,值被更新:
const handleSubmit = async () => {
setLoading(true)
const url = await uploadImage(profileURL, firebase.auth().currentUser?.uid)
await setCurrentUserDetails(
{ ...currentUserDetails,
username,
age: Number(age),
height,
country,
occupation,
profileURL: url,
}
)
setLoading(false)
}
我遇到的问题是,用户第一次尝试编辑数据,它不会更新,除非我有所有的字段。如何使每个值都是optional
?
例如,假设某人只更新了occupation
,它将更新它并留下其余部分,而不会在db中为此创建任何字段。
我不知道我的做法是否正确。
y被分解成单独的字段。
const updateUserProfile = (y) => {
const { Age, Hobby, UserName, Job, Country, Name } = y;
return firestore.collection("users").doc(`${currentUser.uid}`).update({
UserName: UserName,
Hobby: Hobby,
Name: Name,
Age: Age,
Country: Country,
Job: Job,
});
};
这样我可以更新任何我想要的字段。但在我的情况下,所有这些领域都已经有了默认写入数据,如UserName: UserName, Hobby:业余爱好。然后我用用户更改的内容更新它
我就是这样得到"y"userData是我从firestore得到的。
const [data, setData] = useState({ [name]: value });
const x = userData;
const y = Object.assign(x, data);
对不起,如果这是一个混乱的答案。