React Native Undefined не является объектом (оценка userData.id) - PullRequest
0 голосов
/ 13 июля 2020

Я новичок, чтобы реагировать на родной язык, у меня есть личный проект, я пытаюсь получить данные из облака Firestore, но при смене экрана постоянно появляется эта ошибка. Он отлично работает, когда я комментирую код базы данных, поэтому мне интересно, в чем может быть причина.

Мой код

import React from "react";
import auth from "@react-native-firebase/auth";
import firestore from "@react-native-firebase/firestore";

const ProfileStackScreen = ({ navigation }) => {
  React.useEffect(() => {
    const usr = auth().currentUser;
    setuserData(prev => {
      return { ...prev, uid: usr.uid };
    });
  }, []);

  const userRef = firestore().collection("users");
  const snapshot = userRef
    .where("uid", "==", userData.uid)
    .onSnapshot()
    .then(console.log(uid))
    .catch(error => {
      Alert.alert(error.message);
    });

  const [userData, setuserData] = React.useState({
    uid: ""
    // other field go here
  });
  return (
    <View>
      <Text>{userData.uid}</Text>
    </View>
  );
};

export default ProfileStackScreen;

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Вы можете попробовать следующий код

import React from 'react';
import auth from '@react-native-firebase/auth';
import firestore from '@react-native-firebase/firestore';

const ProfileStackScreen = ({ navigation }) => {

  React.useEffect(() => {
    const usr = auth().currentUser;
    setuserData((prev)=>{
      return {...prev,uid: usr.uid};
    });
  }, []);
 React.useEffect(() => {
  fetchdata()
  }, [userData]);// Once userData value has been updated then only call fetchData()

 const fetchdata = ()=>{
  const userRef = firestore().collection('users').doc(userData.uid).get()
            .then(function (doc) {
              if (doc.exists) {
                console.log("Document found!");
               console.log(doc.data())
              } else {
               
                console.log("No such document!");
                
              }
            });
    }

  

  const [userData, setuserData] = React.useState({
    uid: '',
  // other field go here
 
    });
  return (
    <View>
          <Text>{userData.uid}</Text>
    </View>
  );
};

export default ProfileStackScreen;
0 голосов
/ 13 июля 2020

@ Махешвирус прав. Но я думаю, вы пытались получить данные, когда userData.uid не пуст.

Попробуйте этот способ, если ищете такой.

import React from 'react';
import auth from '@react-native-firebase/auth';
import firestore from '@react-native-firebase/firestore';

const ProfileStackScreen = ({ navigation }) => {

  React.useEffect(() => {
    const usr = auth().currentUser;
    setuserData((prev)=> {
      return {...prev,uid: usr.uid};
    });
  }, []);
    
    React.useEffect(() => {
       if(userData.uid !== ''){
          getData()
       }
    }, [userData]);

    const getData = () => {
       firestore()
       .collection('users');
       .where('uid', '==', userData.uid)
       .onSnapshot()
       .then(() => {
         console.log(uid)
       })
       .catch((error)=> {
         Alert.alert(error.message);
       });
    }

  const [userData, setuserData] = React.useState({
    uid: '',
  // other field go here
 
    });
  return (
    <View>
          <Text>{userData.uid}</Text>
    </View>
  );
};

export default ProfileStackScreen;
...