开发者问题收集

为什么 ReactJs 中没有显示从 Firebase 用户获取的数据?

2022-08-17
237

我从 firebase 登录后获取用户数据。我也将其打印在控制台上,并显示数据在这里。但是当我尝试显示它时,它没有显示。也没有错误。我从浏览器开发人员工具中检查了元素,发现该字段为空。我想显示 displayName、email、emailVerified

这是显示我正在获取数据的控制台图像:

在此处输入图像描述

我的代码

import React from 'react';
import { getAuth, onAuthStateChanged } from 'firebase/auth';

const Home = () => {
  // get user information
  let displayName, email, emailVerified;

  const auth = getAuth();
  onAuthStateChanged(auth, user => {
    if (user) {
      // User is signed in, see docs for a list of available properties
      // https://firebase.google.com/docs/reference/js/firebase.User
      displayName = user.displayName;
      email = user.email;
      emailVerified = user.emailVerified;
      console.log(user);
    } else {
      // User is signed out
      // ...
    }
  });
  return (
    <div className="container">
      <div className="card w-75 mx-auto bg-warning mt-3">
        <div className="card-body">
          <h5 className="card-title">Name: {displayName}</h5>
          <h5 className="card-title">Email: {email}</h5>
          <h5 className="card-title">Verified: {emailVerified}</h5>
        </div>
      </div>
    </div>
  );
};

export default Home;

为什么数据没有显示?我怎样才能显示该数据?

1个回答

这些变量不会以这种方式工作 - 您需要在组件中使用状态,请参阅:

详细说明 - 在函数式组件中,函数的上下文本质上是渲染。在范围顶部定义它们将与它们在 onAuthStateChanged 回调中设置的位置断开连接 - 在调用回调时,该组件将已经使用空值呈现并且不会重新渲染。

React 状态是用于处理这个问题的 - 并且当它们改变时会触发渲染。

这可以像这样完成:

const [user, setUser] = useState();

onAuthStateChanged(auth, user => {
  if (user) {
    setUser(user);
  } else {
    // User is signed out
    // ...
  }
});

return (
  <div className="container">
    <div className="card w-75 mx-auto bg-warning mt-3">
      <div className="card-body">
        <h5 className="card-title">Name: {user?.displayName}</h5>
        <h5 className="card-title">Email: {user?.email}</h5>
        <h5 className="card-title">Verified: {user?.emailVerified}</h5>
      </div>
    </div>
  </div>
);
smashed-potatoes
2022-08-17