Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >闲话react路由守卫

闲话react路由守卫

作者头像
一粒小麦
发布于 2019-07-30 07:30:49
发布于 2019-07-30 07:30:49
2.4K00
代码可运行
举报
文章被收录于专栏:一Li小麦一Li小麦
运行总次数:0
代码可运行

老外做生意的思路和中国人不太一样,中国人喜欢便宜货,比如说买相机,期望什么都给你配好,还附送一大堆东西。而老外发给你的货干干净净,所谓贵的要命名牌也只不过是廉价的环保纸盒(摔不坏即可)。一分钱也不少赚你,同理一分钟钱也不多赚你。

在贸易战的大背景下,你可能不大认同这点。但就程序开发这点来说体会特别特别深。作为中国人写的框架比如vue,thinkjs等。用起来特别傻瓜式。而那些由“不存在的公司”Google,facebook开发的react,angular之流。写起来是真的高冷。而无可否认乃至包括尤雨溪也承认,vue参考了react的诸多东西。

需求

现有需求如左:登录判断。

前后端的撕逼似乎还没完,jwt方案扯了如同没说。现在说,在每个需要鉴权的页面做登录态请求。通过了,才能做访问。

看到这个需求,我真的羞于做这样的事情。好好的一个SPA应用。硬生生做成web1.0时代的感觉,真是日了热比娅了!这TM后端做的东西我来搞!

但面向百度遍了一波程序,发现这种需求在中国人中间还贼tm多。心情也渐渐平复。其实无论是token验证还是这种恶心的验证方式。都是用高阶组件来实现的。

先简单介绍下高阶组件。

react高阶组件(HOC)

react有一个著名的公式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UI或页面page=f(state)

而对对于HOC:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const EnhancedComponent = highOrderComponent(WrappedComponent);

组件是把 props 转化成 UI,而高阶组件是把一个组件转化成另外一个组件。

由此可得,高阶组件不是什么react的功能,它只是一个函数,接收一个组件,然后返回一个新的组件。

既然是函数,那就可以有参数,有返回值。从上面可以看出,这个函数接收一个组件 WrappedComponent 作为参数 ,返回加工过的新组件 EnhancedComponent。其实高阶组件就是设计模式里的装饰者模式

高阶组件你可以理解为一台相机裸机。 你得给他装个牛逼镜头,配个滤镜。装个挂带。然后才能带着出去装逼。 (冠希哥设计对白:我要开始装逼了)

下面是一个简单的高阶组件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React, { Component } from 'react';

export default (WrappedComponent) => {
  return class EnhancedComponent extends Component {
    // do something
    render() {
      return <WrappedComponent />;
    }
  }
}

从上面的代码可以看出,我们可以对传入的原始组件 WrappedComponent 做一些你想要的操作(比如操作 props,提取 state,给原始组件包裹其他元素等),从而加工出你想要的组件 EnhancedComponent 。把通用的逻辑放在高阶组件中,对组件实现一致的处理,从而实现代码的复用。

守卫

vue的思路是:你告诉我想拍什么效果,我帮你实现哟。 react的思路是:给你一台裸机,去创造世界吧。造的怎么样看你的水平。

https://reacttraining.com/react-router/web/example/auth-workflow

react的路由守卫在4.0之前是有一个类似 beforeEach的前置钩子。但4.0之后删了。作者的理由是:删了更自由。

现在就采用高阶组件的形式来体现了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const PrivateRoute = ({ component: Component, ...rest }) => (
    class Guard extends Component {
        constructor(props) {
            super(props)
            this.state = {
                auth: false,     // 表示是否认证通过
                hasAuthed: false,  // 表示是否向服务器发送过认证请求
                role:null //教师或学生
            };
        }

        componentDidMount() {
            //向服务器发送认证请求,result表示认证是否成功
            Http.get(Api.isLogin, (msg) => {
                console.log('msg',msg.errno)
                if (msg.errno == 0) {

                    if (msg.data.result.role) {
                        //老师
                        this.setState({
                            auth:true,
                            hasAuthed:true,
                            role:'teacher'
                        })
                    } else {
                        //学生
                        this.setState({
                            auth:true,
                            hasAuthed:true,
                            role:'student'
                        })
                    }

                } else {
                    // alert(msg.errmsg)
                    this.setState({
                        hasAuthed:true,
                    })
                }
            })
        }

        render() {
            // 初始渲染时,尚未向服务器发送认证请求,因此不渲染元素
            console.log(this.state.auth)
            if (!this.state.hasAuthed) {
                return null;
            }else{

                return <Route {...rest} render={props => (
                    this.state.auth ? (
                        <Component {...props}/>
                    ) : (
                            <Redirect to={{
                                pathname: '/login',
                                state: { from: props.location }
                            }} />
                        )
                )} />
            }

        }
    }
)

注意:if(!this.state.hasAuthed)肯定会造成白屏。可见这个体验也还真的不怎么样~~。

以上。


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一Li小麦 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
写给vue转react的同志们(5)
我们知道 React 中使用高阶组件(下面简称HOC)来复用一些组件的逻辑。HOC 自身不是 React API 的一部分,它是一种基于 React 的组合特性而形成的设计模式。具体而言,高阶组件是参数为组件,返回值为新组件的函数。
饼干_
2022/09/19
4350
React进阶篇(一)高阶组件
高阶组件(Higher Order Component,HOC)是React的一种设计模式,用于增强现有组件的功能。
娜姐
2020/09/22
5790
React高级组件精讲
高阶函数是以函数为参数,并且返回也是函数的的函数。类似的,高阶组件(简称HOC)接收 React 组件为参数,并且返回一个新的React组件。高阶组件本质也是一个函数,并不是一个组件。高阶组件的函数形式如下:
Javanx
2019/10/15
1.1K0
React-高阶组件-应用场景
React高阶组件(Higher-Order Components,HOCs)是一种强大的模式,用于在React应用中复用组件逻辑。它们可以用于各种应用场景,包括但不限于以下几个:
杨不易呀
2023/09/30
2700
React 中的高阶组件及其应用场景
可以发现,属性代理其实就是 一个函数接受一个 WrappedComponent 组件作为参数传入,并返回一个继承了 React.Component 组件的类,且在该类的 render() 方法中返回被传入的 WrappedComponent 组件。
愤怒的小鸟
2021/01/20
1.5K0
React学习(最终篇)—— 高阶应用:高阶组件(HOCs)
高阶组件(higher-order components:以下简称HOC或HOC组件)是一个React组件复用的高级技巧。HOCs本身并不是React的API接口,他是React组件之间组织方式的一种模式。
随风溜达的向日葵
2018/08/15
1.8K0
react高频知识点梳理
路由匹配是通过比较 <Route> 的 path 属性和当前地址的 pathname 来实现的。当一个 <Route> 匹配成功时,它将渲染其内容,当它不匹配时就会渲染 null。没有路径的 <Route> 将始终被匹配。
beifeng1996
2022/11/01
1.5K0
React-代码复用(mixin.hoc.render props) 前言例子MixinHOCRender Props总结参考
最近在学习React的封装,虽然日常的开发中也有用到HOC或者Render Props,但从继承到组合,静态构建到动态渲染,都是似懂非懂,索性花时间系统性的整理,如有错误,请轻喷~~
菜的黑人牙膏
2019/04/09
1.7K0
React-代码复用(mixin.hoc.render props)
		前言例子MixinHOCRender Props总结参考
滴滴前端二面react面试题总结
Refs 提供了一种方式,用于访问在 render 方法中创建的 React 元素或 DOM 节点。Refs 应该谨慎使用,如下场景使用 Refs 比较适合:
goClient1992
2022/09/14
1.2K0
前端技能树,面试复习第 19 天—— React 基础一点通
React 并不是将 click 事件绑定到了 div 的真实 DOM 上,而是在 document 处监听了所有的事件,当事件发生并且冒泡到 document 处的时候,React 将事件内容封装并交由真正的处理函数运行。这样的方式不仅仅减少了内存的消耗,还能在组件挂在销毁时统一订阅和移除事件。
前端修罗场
2023/10/07
4150
前端技能树,面试复习第 19 天—— React 基础一点通
【React深入】从Mixin到HOC再到Hook(原创)
前端发展速度非常之快,页面和组件变得越来越复杂,如何更好的实现 状态逻辑复用一直都是应用程序中重要的一部分,这直接关系着应用程序的质量以及维护的难易程度。
ConardLi
2019/05/23
1.9K0
面试官:你是怎样进行react组件代码复用的
Mixin(混入)是一种通过扩展收集功能的方式,它本质上是将一个对象的属性拷贝到另一个对象上面去,可以拷贝多个属性到一个对象上,为了解决代码复用问题。
beifeng1996
2022/10/11
3980
React系列-Mixin、HOC、Render Props
在讲react-hooks之前,我们来捋捋react状态逻辑复用相关知识点,这会帮助你理解hooks
落落落洛克
2021/01/08
2.5K0
React系列-Mixin、HOC、Render Props
从 0 到 1 实现 React 系列 —— 5.PureComponent 实现 && HOC 探幽
本系列文章在实现一个 cpreact 的同时帮助大家理顺 React 框架的核心内容(JSX/虚拟DOM/组件/生命周期/diff算法/setState/PureComponent/HOC/...) 项目地址
牧云云
2018/09/19
8010
从 0 到 1 实现 React 系列 —— 5.PureComponent 实现 && HOC 探幽
字节前端必会react面试题1
Keys 是 React 用于追踪哪些列表中元素被修改、被添加或者被移除的辅助标识。
beifeng1996
2023/01/03
3.5K0
「react进阶」一文吃透React高阶组件(HOC)
React高阶组件(HOC),对于很多react开发者来说并不陌生,它是灵活使用react组件的一种技巧,高阶组件本身不是组件,它是一个参数为组件,返回值也是一个组件的函数。高阶作用用于强化组件,复用逻辑,提升渲染性能等作用。高阶组件也并不是很难理解,其实接触过后还是蛮简单的,接下来我将按照,高阶组件理解?,高阶组件具体怎么使用?应用场景, 高阶组件实践(源码级别) 为突破口,带大家详细了解一下高阶组件。本文篇幅比较长,建议收藏观看
用户6835371
2021/06/01
2.3K0
「react进阶」一文吃透React高阶组件(HOC)
React的高阶组件怎么用?
高阶组件(HOC)是一个接收组件作为参数并返回新组件的函数。将多个组件的相同逻辑代码,抽象到HOC中,让组件更有结构化,更易于复用。HOC不破坏传入组件的特性,只通过组合形成新组件。HOC是纯函数,没有副作用。
Learn-anything.cn
2021/11/27
6630
React组件设计模式-纯组件,函数组件,高阶组件
如果你想写的组件只包含一个 render 方法,并且不包含 state,那么使用函数组件就会更简单。我们不需要定义一个继承于 React.Component 的类,我们可以定义一个函数,这个函数接收 props 作为参数,然后返回需要渲染的元素。
xiaofeng123aa
2022/10/18
2.4K0
【译】ReactJS的五个必备技能点
想必你已经完成了官方的第一个 React.js 教程,本文将介绍并讨论五个 React 的进阶概念,希望可以将你的 React 技能提升一个新的等级。
IMWeb前端团队
2019/12/03
1.3K0
【译】ReactJS的五个必备技能点
美团前端二面经典react面试题总结_2023-03-01
React并不是将click事件绑定到了div的真实DOM上,而是在document处监听了所有的事件,当事件发生并且冒泡到document处的时候,React将事件内容封装并交由真正的处理函数运行。这样的方式不仅仅减少了内存的消耗,还能在组件挂在销毁时统一订阅和移除事件。
用户10376779
2023/03/01
1.6K0
相关推荐
写给vue转react的同志们(5)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档