【问题标题】:Displaying user data from Firebase Firestore in React Native within a Text tag在文本标记中显示来自 Firebase Firestore 的 React Native 中的用户数据
【发布时间】:2020-10-28 17:39:57
【问题描述】:

背景 嘿!我正在尝试为我的应用程序主页构建标题。我已经使用 Firebase 成功实现了电子邮件/密码身份验证以及持久凭据。但是,我无法从存储我的用户的 firestore 集合中获取数据。 基本上,我需要的是让我的标题显示“Hello {userName}”,但我完全不知道如何做到这一点。 我的主屏幕是一个函数组件,而不是一个类组件,据我所知,我不能走“componentDidMount()”的方式。

问题

获取当前用户数据并显示特定信息字段(例如他们的名字)的最佳方式是什么?

我将如何在 <Text> 标记中呈现它?是<Text> Hello {this.user.firstName}</Text> 之类的,还是我完全错了?

我的尝试

我知道这与这行代码有关:const usersRef = firebase.firestore().collection('users'),但我不知道该怎么做。也试过这种方法:

    var user = firebase.auth().currentUser;
    var firstName, email, photoUrl, uid, emailVerified;

    if (user != null) {
    firstName = user.firstName;
    email = user.email;
    photoUrl = user.photoURL;
    emailVerified = user.emailVerified;
    uid = user.uid; 
    }

但这似乎不起作用。在最后一个示例中,我这样称呼 firstName:<Text>Hello {firstName}</Text>

【问题讨论】:

    标签: firebase react-native google-cloud-firestore


    【解决方案1】:

    您将身份验证与 Firestore 混淆了。 Firebase 身份验证仅提供凭据和登录功能,不会将任何数据输入数据库 (firestore)。您要做的是,当用户注册时,您想在 Firestore 中设置相应的文档,其中包含用户 uid(标识)和所有用户自定义数据(名字等)。

    这是一个例子:

      const onRegister = async () => {
        try {
          const credential = await auth.createUserWithEmailAndPassword(
            'email@email.com',
            'password',
          );
          const {uid} = credential;
          // your data here (dont forget to store the uid on the document)
          const user = {
            firstName: 'whatever',
            lastName: 'whatever',
            user_id: uid,
          };
          await firestore().collection('users').doc(uid).set(user);
        } catch {
          //do whatever
        }
      };
    

    然后当您想要获取他们的数据时,您可以访问他们的文档并显示它:

      const [user, setUser] = useState();
      const {uid} = auth().currentUser;
    
      const getUser = async () => {
        try {
          const documentSnapshot = await firestore()
            .collection('users')
            .doc(uid)
            .get();
    
          const userData = documentSnapshot.data();
          setUser(userData);
        } catch {
          //do whatever
        }
      };
    
      // Get user on mount
      useEffect(() => {
        getUser();
      }, []);
    
      // return info if user is set
        return (
          <Text>{user && user?.firstName}</Text>
        );
    

    【讨论】:

    • 首先,非常感谢!这真的很有用,但是,我真的不明白它是如何做的,而且我有点无法让它工作。你能解释一下代码的第一部分,以便我能真正理解吗?
    • 第一个函数使用 createUserWithEmailAndPassword 函数使用电子邮件和密码在 firebase auth 中注册用户。该函数返回一个用户凭证,然后我们从中获取用户 id (uid)。使用该用户 ID,我们在用户集合下创建相应的 Firestore 文档,存储该用户的所有数据(名字等)。然后,每当您需要该用户数据时,您就可以使用用户 ID 来访问它。
    • 很抱歉这么晚才回复你,我有最后一个问题,为了让这个以这种方式工作,HomeScreen 的相应导入是什么?我不断收到“找不到变量身份验证”错误。也非常感谢您的解释,它帮助了很多。
    • 那么你需要导入身份验证: import auth from '@react-native-firebase/auth';
    猜你喜欢
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    相关资源
    最近更新 更多