javascript - 我在将 Prop 从状态传递给 child 时遇到问题

标签 javascript reactjs react-hooks react-router

这是 Login 组件,我在其中创建了身份验证状态,token 为 false,登录后转换为 true

function Login() {
  const [user, setUser] = useState({ name: '', email: '' });
  const [error, setError] = useState('');
  const [auth, setAuth] = useState({ token: false })
  console.log(auth)
  const Login = (details) => {
    console.log(details);
    if (
      details.name === adminUser.name &&
      details.email === adminUser.email &&
      details.password === adminUser.password
    ) {
      console.log('Logged in');
      setAuth({
        token: true,
      })

这工作得很好,但现在当我尝试将其传递给 PrivateRoute 组件时,auth 未定义

const PrivateRoutes = ({ auth }) => {
  console.log(auth)
  return (
    auth ? <Outlet/> : <Navigate to="/login"/>
  )
}

这也是我的 App.jsx

function App() {
  return (
    <Routes>
      <Route element={<PrivateRoutes />}>
        <Route path="/*" element={<MainPage />} />
      </Route>
      <Route path="/login" element={<Login />} />
    </Routes>
  );
}

我需要更改什么才能从状态获取数据并使我的防护功能正常工作?

最佳答案

auth 状态应该位于一个共同的祖先中,这样它就可以作为 props 传递下去。

示例:

function App() {
  const [auth, setAuth] = useState({ token: false });

  return (
    <Routes>
      <Route element={<PrivateRoutes auth={auth} />}>
        <Route path="/*" element={<MainPage />} />
      </Route>
      <Route path="/login" element={<Login setAuth={setAuth} />} />
    </Routes>
  );
}
const PrivateRoutes = ({ auth }) => {
  return auth.token ? <Outlet/> : <Navigate to="/login" replace />;
}
function Login({ setAuth }) {
  const navigate = useNavigate();

  const [user, setUser] = useState({ name: '', email: '' });
  const [error, setError] = useState('');

  const login = (details) => {
    if (
      details.name === adminUser.name &&
      details.email === adminUser.email &&
      details.password === adminUser.password
    ) {
      setAuth({ token: true });
      navigate(/* new target path */, { replace: true });

    ...
  }

  ...

关于javascript - 我在将 Prop 从状态传递给 child 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75236754/

相关文章:

javascript - 使用 'this' 选择属性,然后与选定的 HTML 属性进行比较

javascript - 如何在reactjs中优化我的验证代码?

javascript - useMemo on .map 语句中使用的函数

javascript - 使用 xlsx/sheetjs 添加动态列

javascript - 在悬停事件上隐藏 div

javascript - 无法读取未定义的属性 'initSdk' - Appsflyer 集成 React Native

reactjs - mui-datepicker定制: Labeling Hours and Minutes Selection

react-native - react native :How to detect function component will unmount?

javascript - 使用 React hooks 将基于类的组件转换为功能组件

javascript - 有没有不用 Flash Player 播放视频的方法?