首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >私有路由在呈现组件之前获取身份验证

私有路由在呈现组件之前获取身份验证
EN

Stack Overflow用户
提问于 2021-01-02 12:15:18
回答 2查看 250关注 0票数 0

我在使用带身份验证的用户的PrivateRoute时遇到问题。

因为我使用redux来捕获用户的身份验证,所以在呈现组件之前,我需要等待state从存储返回。如果不是,页面将自动重定向到login route

我的问题是,当前路由在等待身份验证结果时会被重定向到登录页面。如果通过身份验证,将返回页面。

所以我想先等authentication result。如果通过认证,将加载页面组件,否则将重定向到登录页面。

这是我的带身份验证的私有路由。

代码语言:javascript
运行
AI代码解释
复制
import React from "react";
import { Route, Redirect} from "react-router-dom";
import { connect } from "react-redux";

const PrivateRoute = ({ component: Component, auth, role, ...rest }) => {    
  return (
    <Route
      {...rest}
      render={props => auth.isAuthenticated ? (
          <Component {...props} />
        ) : (          
          <Redirect  to={{
            pathname: "/",
            state: { from: props.location }
          }} />
        )
      }
    />
  )
}

const stateStoreToProp = state => ({
  auth: state.loginReducer,
});
export default connect(stateStoreToProp)(PrivateRoute);

这是我的自动重定向的登录组件。

代码语言:javascript
运行
AI代码解释
复制
  let history = useHistory();
  let location = useLocation();

  let { from } = location.state || { from: { pathname: "/choose" } };
  const isAuthenticated = prop.loginReducer.isAuthenticated;
  const user = prop.loginReducer.user;
  if (isAuthenticated && typeof user !== "undefined") {
    history.replace(from);
  }

这是App.js

代码语言:javascript
运行
AI代码解释
复制
import { loadUser } from './actions/AuthAction';
function App() {
    useEffect(() => {
      store.dispatch(loadUser()); 
    }, []);
    return (
      <Provider store={store}>
        <Router>
          <Fragment>
            <div className="blockcontain">
              <div className="fss">
                <div className="rightSide">
                  <Switch>
                    <Route path='/' exact component={Login} />
                    <PrivateRoute exact path='/choose' component={Choose} />
                  </Switch>
                </div>
              </div>
            </div>
          </Fragment>
        </Router>
      </Provider>
    );  
}

和LoginReducer

代码语言:javascript
运行
AI代码解释
复制
import {
  LOGIN_SUCCESS, LOGIN_FAIL, USER_LOADED, AUTH_ERROR
} from '../actions/typeName';
import Cookies from 'js-cookie';
const initialState = {
  token: Cookies.get('token'),
  isAuthenticated: null,
  loading: true, 
  user: null
}
const loginReducer = (state = initialState, action) => {
  const {type, payload} = action; 

  switch(type) {
      case USER_LOADED:
        return {
          ...state,
          isAuthenticated: true,
          loading: false,
          user: payload
        };
      case LOGIN_SUCCESS:
        Cookies.set('token', payload.access_token, { expires: payload.expires_at });
        return {
          ...state,
          isAuthenticated: true, 
          loading: false
        }
      case AUTH_ERROR:
      case LOGIN_FAIL:
          return {
            ...state,
            token:null,
            isAuthenticated: false,
            loading: true
          }
      default:
          return state;
  }
}

export default loginReducer;

我去choose page,它将转到登录页面,因为store for authentication还没有准备好。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-02 12:40:48

您可以将加载属性添加到您的状态,并仅在获取完成后显示路由:

代码语言:javascript
运行
AI代码解释
复制
const PrivateRoute = ({ component: Component, auth, isLoading, role, ...rest }) => {
  if(isLoading) return <div>Loading...</div>;
  
  return (
    <Route
      {...rest}
      render={(props) =>
        auth.isAuthenticated ? (
          <Component {...props} />
        ) : (
          <Redirect
            to={{
              pathname: '/',
              state: { from: props.location },
            }}
          />
        )
      }
    />
  )
}

const stateStoreToProp = (state) => ({
  isLoading: state.loading,
  auth: state.loginReducer,
})

export default connect(stateStoreToProp)(PrivateRoute)

并在你的reducer中添加加载突变,例如:

代码语言:javascript
运行
AI代码解释
复制
case REQUEST_LOGIN:
      return [...state, isLoading: true];
case LOGIN_SUCCESSFUL:
      return [...state, auth: isAuthenticated, isLoading: false];
票数 1
EN

Stack Overflow用户

发布于 2021-01-02 12:41:19

您可以做的是添加一个“正在加载”的密钥到您的身份验证状态,因此当它进行身份验证时,状态将为"true“,否则为"false”。如果为真,则显示一个加载器。

代码语言:javascript
运行
AI代码解释
复制
import React from "react";
import { Route, Redirect} from "react-router-dom";
import { connect } from "react-redux";

const PrivateRoute = ({ component: Component, auth, role, ...rest }) => {
    
  return (
    <>
      {
        auth.loading && (
          <Loader/>
        )
      }

      {
        !auth.loading && (
          (
            <Route
            {...rest}
            render={props => auth.isAuthenticated ? (
                <Component {...props} />
              ) : (          
                <Redirect  to={{
                  pathname: "/",
                  state: { from: props.location }
                }} />
              )
            }
          />          
          )          
        )
      }
    </>
  )
}


const stateStoreToProp = state => ({
  auth: state.loginReducer,
});
export default connect(stateStoreToProp)(PrivateRoute);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65538978

复制
相关文章
【Android 组件化】路由组件 ( 路由组件结构 )
在之前博客 【Android 组件化】使用 Gradle 实现组件化 ( 组件 / 集成模式下的 Library Module 开发 ) 的组件化项目中 , 可能涉及到跨 Module 的调用 , 如在 library1 模块中打开 library2 模块中的 Activity 界面 , 或调用其它 Module 中的功能 ;
韩曙亮
2023/03/29
4630
【Android 组件化】路由组件 ( 路由组件结构 )
前端开发:vue路由之前端路由的原理
现在mvvm框架已经火的不成样了,React、Angular和Vue.js的发布让前端工程化成为主流,大前端时代已经到来了,最近接触了vue的前端路由,闲来无事就开始琢磨源码,下面来说说前端路由的原理。
用户5827212
2019/08/07
1K0
【Android 组件化】路由组件 ( 运行时获取 注解处理器 生成的路由表 )
最后 , 考虑 instant run 的情况 , 可能存在多个 APK 文件 , 如果有多个 , 也一并放入路径字符串集合中 ;
韩曙亮
2023/03/29
4090
折腾路由--Padavan私有云
经历了网盘的各种关闭、数据迁移和限速,国内基本只有百度网盘一家独大了。然而百度网盘推出会员、进而超级会员一波骚操作后,实在让人累觉不爱。
vincentKo
2022/09/19
14.8K0
折腾路由--Padavan私有云
【Android 组件化】路由组件 ( 路由框架概述 )
路由框架 仅限于在 集成模式 下使用 , 组件模式下 , 路由框架不起任何作用 ;
韩曙亮
2023/03/29
5370
【Android 组件化】路由组件 ( 注解处理器获取被注解的节点 )
在 【Android 组件化】路由组件 ( 路由组件结构 ) 博客中介绍了组件化中的 " 路由组件 " , 分为 " 自定义注解模块 " , " 注解处理器模块 " , " 依赖库模块 " 3 个模块 ;
韩曙亮
2023/03/29
3810
【Android 组件化】路由组件 ( 注解处理器获取被注解的节点 )
使用React Router v6 进行身份验证完全指南
React Router v6是React应用程序的一个流行且功能强大的路由库。它提供了一种声明式的、基于组件的路由方法,并能处理URL参数、重定向和加载数据等常见任务。
前端修罗场
2022/07/29
14.9K1
思科私有动态路由协议:EIGRP
EIGRP是思科的私有协议,今天瑞哥就带着大家好好学习一下EIGRP,让我们直接开始吧!
网络技术联盟站
2023/03/05
1K0
思科私有动态路由协议:EIGRP
vue 路由组件
单页应用(single page web application,SPA),是在一个页面完成所有的业务功能,浏览器一开始会加载必需的HTML、CSS和JavaScript,之后所有的操作都在这张页面完成,这一切都由JavaScript来控制。
章鱼喵
2019/10/17
6350
【Android 组件化】路由组件 ( 构造路由表中的路由信息 )
在【Android 组件化】路由组件 ( 注解处理器参数选项设置 ) 博客中在注解处理器中 , 获取了在 build.gradle 中设置的参数 ;
韩曙亮
2023/03/29
5800
【Android 组件化】路由组件 ( 构造路由表中的路由信息 )
思科私有动态路由协议:EIGRP
EIGRP是思科的私有协议,今天瑞哥就带着大家好好学习一下EIGRP,让我们直接开始吧!
网络技术联盟站
2022/06/12
1.2K0
思科私有动态路由协议:EIGRP
Confluence 6 在升级之前
在这个指南中,我们将会与你一同对最新的 Confluence 站点在 Windows 或者 Linux 平台进行安装和更新。
HoneyMoose
2019/04/20
6400
Confluence 6 在升级之前
组件分享之前端组件——bootstrap-treeview 简单的tree树组件
近期正在探索前端、后端、系统端各类常用组件与工具,对其一些常见的组件进行再次整理一下,形成标准化组件专题,后续该专题将包含各类语言中的一些常用组件。欢迎大家进行持续关注。
cn華少
2022/03/06
1.7K0
组件分享之前端组件——bootstrap-treeview 简单的tree树组件
【Android 组件化】路由组件 ( 使用 JavaPoet 生成路由表类 )
在 【Android 组件化】路由组件 ( 构造路由表中的路由信息 ) 博客中解析了注解的节点及注解属性 , 将路由信息封装在了 RouteBean 中 ;
韩曙亮
2023/03/29
6350
【Android 组件化】路由组件 ( 使用 JavaPoet 生成路由表类 )
利用CocoaPods实现私有 TUIKit 组件
集成 TUIKit 组件, 如果你发现 TUIKit 有 bug 需要修改, 或者因为公司业务需求需要在此基础上做二次开发, 那么就需要修改 TUIKit 源码, 但是如果下一次 TUIKit 更新时, 或者你执行 pod install 的时候, 远程库的 TUIKit 就会覆盖本地的 pod, 之前的改动都被覆盖了. 之前所写的代码都付之东流. 因此一种更加优雅的做法是把 TUIKIt 私有组件化, 再集成自己私有的这个 TUIKit pod 并在此基础上二次开发或者改动, 当 TUIKit 有更新的时候根据业务需求考虑 git 操作, merge 到自己的本地私有库来实现更新.
腾讯云 - zjiezhu
2020/10/31
1.8K1
利用CocoaPods实现私有 TUIKit 组件
如何通过 ASWebAuthenticationSession 获取身份验证 code 码
项目中需要实现 GitHub、Google、Apple 登录,实现第三方登录方案有 3 种:
网罗开发
2021/05/14
1.7K0
如何通过 ASWebAuthenticationSession 获取身份验证 code 码
在发布组件库之前,你需要先掌握构建和发布函数库
本文是 基于Vite+AntDesignVue打造业务组件库[2] 专栏第 7 篇文章【在发布组件库之前,你需要先掌握构建和发布函数库】,聊聊怎么构建和发布一个函数库。
程序员白彬
2023/03/02
8500
在发布组件库之前,你需要先掌握构建和发布函数库
React路由 及 React 路由中核心组件
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/136454.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/07
1.5K0
组件分享之前端组件——甘特图时间表时间线日历组件
近期正在探索前端、后端、系统端各类常用组件与工具,对其一些常见的组件进行再次整理一下,形成标准化组件专题,后续该专题将包含各类语言中的一些常用组件。欢迎大家进行持续关注。
cn華少
2022/03/06
2.2K0
组件分享之前端组件——甘特图时间表时间线日历组件
Confluence 6 在升级之前 原
在这个指南中,我们将会与你一同对最新的 Confluence 站点在 Windows 或者 Linux 平台进行安装和更新。
HoneyMoose
2019/04/29
5390
Confluence 6 在升级之前
                                                                            原

相似问题

私有路由不呈现组件

13

在useEffect挂钩完成之前呈现ReactJS身份验证路由组件

110

在呈现私有路由之前等待API调用

37

私有路由( render )在能够检索用户信息以进行身份验证之前呈现

11

在呈现组件之前,不会获取数据。

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档