javascript - ReactJS:如果在 promise 解决后经过身份验证,则呈现私有(private)路由

标签 javascript node.js reactjs react-router

我有这个PrivateRoute功能组件决定渲染作为用户的 props 传递的组件,该用户可以根据用户的身份验证访问该组件或重定向到未经授权的路由。

isValidToken是一个异步函数,检查用户是否具有有效 token 并返回分配给 isUserLogged bool 值 .so当我在 useEffect 中调用这个函数时钩子(Hook)等待函数解析,但在完成之前会发生重定向。那么我如何等待它解析并在 promise 解析之前根据该值进行渲染?

import React, { useState, useEffect } from "react";
import { Route, Redirect } from "react-router-dom";
import isValidToken from "../utils/isValidToken";

const ProtectedRoute = ({ component: Comp, path, redirectto, ...rest }) => {
  const [isloggedin, setloggedin] = useState(false);

  useEffect(() => {
    (async function() {
      const isUserLogged = await isValidToken();
      setloggedin(isUserLogged);
    })();
  }, []);

  return (
    <Route
      path={path}
      {...rest}
      render={props => {
        return isloggedin ? (
          <Comp {...props} />
        ) : (
          <Redirect to={redirectto} />
          // <h1>404 error</h1>
        );
      }}
    />
  );
};

export default ProtectedRoute;

最佳答案

为了避免过早重定向,您的组件需要考虑 Promise 的“待处理状态”(位于异步函数调用背后)。

在挂起(或“正在加载”)状态期间,您通常会呈现类似加载微调器的内容,以向用户指示应用程序正忙。关键是不要渲染 <Comp /><Redirect />组件直到 promise 得到解决(或拒绝):

import React, { useState, useEffect } from "react";
import { Route, Redirect } from "react-router-dom";
import isValidToken from "../utils/isValidToken";

const ProtectedRoute = ({ component: Comp, path, redirectto, ...rest }) => {

  /* Track the state of your app instead. Start with a "loading" state */
  const [state, setState] = useState('loading');

  useEffect(() => {
    (async function() {
      try {
        /* Update effect logic to track correct state */
        const isUserLogged = await isValidToken();
        setState(isUserLogged ? 'loggedin' : 'redirect');
      }
      catch {
        setState('redirect');
      }
    })();
  }, []);
  
  /* If in loading state, return loading message while waiting for 
  isValidToken to complete */
  if(state === 'loading') {
    return <div>Loading..</div>
  }

  return (
    <Route
      path={path}
      {...rest}
      {/* Decide what component to render based on state */
      render={props => ((state === 'loggedin') ? 
        <Comp {...props} /> : 
        <Redirect to={redirectto} />) }
    />
  );
};

export default ProtectedRoute;

关于javascript - ReactJS:如果在 promise 解决后经过身份验证,则呈现私有(private)路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60124524/

相关文章:

php - 如何在 JavaScript 中显示 MySQL 中 "onclick"的下一个结果?

Node.js 可读流 : what is chunk size?

node.js - Mongoose 中 document.save() 后的人口数量错误

javascript - node.js 与客户端 Javascript(与 Chrome/V8 相比)相比是否具有任何性能优势?

javascript - 如何创建 Angular 自定义日期管道

javascript - 鼠标悬停时更新第二个图表

javascript - 如何映射轮播的子项数组?

reactjs - 使用 VSCode 和 Firefox 而不是 Chrome 进行 React 调试

javascript - 组件不显示更新的 redux 状态

javascript - 页面打开时表单自动提交