javascript - useEffect 未运行并导致 undefined variable 问题

标签 javascript reactjs next.js

我尝试使用 useRouter 获取特定字符串,之后我使用同一字符串从 firebase 获取特定文档,上述操作发生在 useEffect 函数,但 useEffect 函数未运行。

代码编译直接跳转到 return 语句,然后给我一个未定义的错误,因为变量在 useEffect 函数中获取值时没有值。以下是我的代码:

const CheckIn = () => {
  const [room, setRoom] = useState();
  const auth = getAuth(app);
  const [user, loading] = useAuthState(auth);
  console.log('loading:' +loading)
  let currentUserUID = "";

  const router = useRouter();
  const request = router.query;
  console.log(request);

  useEffect(() => {
    (async () => {
      if (!router.isReady) return;
      console.log("Useffect has ran");
      if (loading) {
        return <div>Authenticating</div>;
      } else {
        currentUserUID = user.uid;
        console.log(currentUserUID);
        let roomRef = collection(db, currentUserUID.toString());
        const data = query(
          roomRef,
          where(documentId(), "==", request.roomID.toString())
        );
        const querySnapshot = await getDocs(data);
        console.log(querySnapshot);
        const docs = querySnapshot.docs.map((doc) => {
          const data = doc.data();
          data.id = doc.id;
          return data;
        });

        console.log(docs[0]);
        setRoom(docs[0]);
      }
    })();
  }, [loading]);

  console.log(room);

  return (
    <>
    <Head>
      Check In
    </Head>
    <div className="grid grid-cols-12 full-h">
      <NavigationBar />
      <div className="col-span-10">
        <div>
          <h1>Check In for {room.guests.numberOfGuests}</h1>
        </div>
        <div className="grid grid-cols-2 gap-6 "></div>
      </div>
    </div>
    </>
  );
};

export default CheckIn;

我尝试在 useEffet Hook 中使用 router.isReady 函数,但似乎 useEffect 函数被完全忽略。

最佳答案

有了return <div>Authenticating</div>在你的useEffect是不正确的。您需要在根组件外部调用它,如下所示:

const CheckIn = () => {
  const [room, setRoom] = useState();
  const auth = getAuth(app);
  const [user, loading] = useAuthState(auth);
  let currentUserUID = "";

  const router = useRouter();
  const request = router.query;

  useEffect(() => {
    (async () => {
      if (loading) return;

      currentUserUID = user.uid;
      let roomRef = collection(db, currentUserUID.toString());
      const data = query(roomRef, where(documentId(), "==", request.roomID.toString()));
      const querySnapshot = await getDocs(data);
      const docs = querySnapshot.docs.map((doc) => {
        const data = doc.data();
        data.id = doc.id;
        return data;
      });

      setRoom(docs[0]);
    })();
  }, [loading]);

  if (loading || !room) {
    return <div>Authenticating and fetching data...</div>;
  }

  return (
    <>
      <Head>Check In</Head>
      <div className="grid grid-cols-12 full-h">
        <NavigationBar />
        <div className="col-span-10">
          <div>
            <h1>Check In for {room.guests.numberOfGuests}</h1>
          </div>
          <div className="grid grid-cols-2 gap-6 "></div>
        </div>
      </div>
    </>
  );
};

export default CheckIn;

关于javascript - useEffect 未运行并导致 undefined variable 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74963066/

相关文章:

javascript - 将参数附加到 api 请求?

node.js - X-Content-Encoding-Over-Network 位于响应 header 中,但不位于 Content-Encoding 中

javascript - 如何在服务器端渲染中正确使用带有 ant design 库的 next js?

javascript - 如何在 append() 方法中将主题应用到 html

javascript - 设置默认单选按钮 + 关联的 Div

android - react-native-vector-icons/羽毛图标不显示

node.js - Node JS 中是否也需要每个 React 库?

javascript - 使用 Node.js 驱动程序打印和更新 MongoDB 中的所有文档

javascript - 当元素已经处于事件状态时关闭 jquery 弹出窗口

python - 使用 Django、webpack、reactjs、react-router 解耦前后端