Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript React Native-firebase的可选值_Javascript_Firebase_React Native_Google Cloud Firestore_Firebase Authentication - Fatal编程技术网

Javascript React Native-firebase的可选值

Javascript React Native-firebase的可选值,javascript,firebase,react-native,google-cloud-firestore,firebase-authentication,Javascript,Firebase,React Native,Google Cloud Firestore,Firebase Authentication,我有一个定制的钩子: 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;

我有一个定制的钩子:

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)
    }
我遇到的问题是,用户第一次尝试编辑数据时,除非我有所有字段,否则数据不会更新。如何将每个值设置为可选值


例如,假设此人只更新了
职业
,它将更新它并保留其余内容,而不会在数据库中为此创建任何字段。

我不知道我是如何做到这一点的

y被分解为单独的字段

const updateUserProfile=(y)=>{
const{Age,Hobby,UserName,Job,Country,Name}=y;
返回firestore.collection(“users”).doc(`${currentUser.uid}`)。更新({
用户名:用户名,
爱好:爱好,
姓名:姓名,,
年龄:年龄,,
国家:国家,,
乔布:乔布,
});
};

这样我就可以更新我想要的任何字段。但就我而言,所有这些领域都已经有了 写入的默认数据,如用户名:用户名、爱好:爱好。然后我用用户更改的内容更新它

这就是我得到“y”的原因 userData是我从firestore获得的

const[data,setData]=useState({[name]:value});
const x=用户数据;
常数y=对象分配(x,数据);

抱歉,如果这是一个混乱的答案。

我不知道我是如何做到这一点的

y被分解为单独的字段

const updateUserProfile=(y)=>{
const{Age,Hobby,UserName,Job,Country,Name}=y;
返回firestore.collection(“users”).doc(`${currentUser.uid}`)。更新({
用户名:用户名,
爱好:爱好,
姓名:姓名,,
年龄:年龄,,
国家:国家,,
乔布:乔布,
});
};

这样我就可以更新我想要的任何字段。但就我而言,所有这些领域都已经有了 写入的默认数据,如用户名:用户名、爱好:爱好。然后我用用户更改的内容更新它

这就是我得到“y”的原因 userData是我从firestore获得的

const[data,setData]=useState({[name]:value});
const x=用户数据;
常数y=对象分配(x,数据);

很抱歉,如果这是一个混乱的答案。

“但在我的情况下,所有这些字段都已经写入了默认数据”-这很有帮助,我分配了默认值,并且所有的工作都很好,至少有点问题。哈哈。“但在我的情况下,所有这些字段都已经写入了默认数据”-这很有帮助,我指定了默认值,所有的工作都很好,至少是一些东西,哈哈。