javascript 当我将变量作为prop传递给另一个.js文件时,它变成了undefined

wwwo4jvm  于 2023-05-21  发布在  Java
关注(0)|答案(1)|浏览(80)

我已经创建了我的应用程序文件,该文件在成功登录连接时将isAuthenticated变量变为true。我已经验证了Firebase API调用是否正常工作,因为只有输入有效的用户名和密码后,我的程序才会切换到/admin页面。
我希望我的标题栏在成功登录后隐藏登录按钮,但它不起作用,因为我的isAuthenticated变量在我传递它而不是true时变为undefined。我知道这是在发生,因为我在头文件中放置了一个console.log语句来打印isAuthenticated变量的值。在我的Header.js文件中,我想使用这个变量来控制登录按钮是否出现。
下面是我的App.jsHeader.js文件的代码:

import './App.css';
import React, { useState, useEffect } from 'react';
import { BrowserRouter as Router, Routes, Route, Navigate, useNavigate } from 'react-router-dom';
import Header from './Header';  
import LoginForm from './LoginForm'; 
import AdminPage from './AdminPage'; 

import { getAuth, signInWithEmailAndPassword, onAuthStateChanged } from "firebase/auth";
import { initializeApp } from "firebase/app";
import { getAnalytics } from "firebase/analytics";

const firebaseConfig = {
   //
};

const app = initializeApp(firebaseConfig);
const analytics = getAnalytics(app);

function HomePage() {
  const navigate = useNavigate();
  const auth = getAuth();
  const [isAuthenticated, setIsAuthenticated] = useState(false);

  useEffect(() => {
    const unsubscribe = onAuthStateChanged(auth, (user) => {
      if (user) {
        setIsAuthenticated(true);
        navigate('/admin');
      } else {
        setIsAuthenticated(false);
      }
    });

    return () => unsubscribe();
  }, [auth, navigate]);

  const handleLogin = async (username, password) => {
    try {
      await signInWithEmailAndPassword(auth, username, password);
      console.log('Login successful');
      navigate('/admin'); // Navigate to the admin page on successful login
    } catch (error) {
      console.log(error.message);
    }
  };

  return (
    <div className="App">
        <Header
            isAuthenticated={isAuthenticated}
            handleLoginFormSubmit={handleLogin} // Pass handleLogin as a prop
        />
    </div>
  );
}

function App() {
  return (
    <Router>
      <Routes>
        <Route path="/" element={<HomePage />} />
        <Route path="/admin" element={<AdminPage />} />
      </Routes>
    </Router>
  );
}

export default App;
import React, { useState } from 'react';
import LoginForm from './LoginForm';

function Header({ isAuthenticated, handleLoginFormSubmit }) {
  const [showLoginForm, setShowLoginForm] = useState(false);

  const handleLoginButtonClick = () => {
    setShowLoginForm(true);
  };

  return (
    <header className="App-header">
      <h1 className="App-title">Family Wordle</h1>
      {isAuthenticated ? null : (
        <>
          {!showLoginForm ? (
            <button className="App-button" onClick={handleLoginButtonClick}>
              Admin Login
            </button>
          ) : (
            <LoginForm handleLogin={handleLoginFormSubmit} /> // Updated prop name
          )}
        </>
      )}
    </header>
  );
}

export default Header;
k4aesqcs

k4aesqcs1#

位于/admin的路由将渲染AdminPage组件。这是一个与HomePage组件不同的组件。调用navigate('/admin')时,HomePage组件将卸载,从而删除其所有状态。由于您将isAuthenticated值保存在HomePage组件的状态中,因此当您退出并卸载组件时,该状态将丢失。
您没有显示AdminPage组件的代码,但我猜它也将Header作为其子组件之一呈现。因此,它看起来是相同的标题给你,但它实际上是一个新的组件。
如果要验证组件安装和卸载的确切时间,可以添加以下代码:

const MyComponent = () => {
    React.useEffect(() => {
        console.log('Mounted');
        return () => {
            console.log('Unmounted');
        };
    }, []);

    ...
};

这将在MyComponent装载时打印'Mounted',在'Unmounted'卸载时打印'Unmounted'。如果在本例中尝试此操作,您应该看到在调用navigate('/admin')HomePage组件正在卸载。

相关问题