React路由(React笔记之五)

本文是结合实践中和学习技术文章总结出来的笔记(个人使用),如有雷同纯属正常((✿◠‿◠))

喜欢的话点个赞,谢谢!

React路由介绍

现在前端的项目一般都是SPA单页面应用,不再是以前多个页面多套HTML代码项目了,应用内的跳转不需要刷新页面就能完成页面跳转靠的就是路由系统

React路由主要有两种:

  • BrowerRouter路由: 就像平常网站www.baidu.com/test 这就是一个路由

  • HashRouter 路由: 比BrowerRouter多出了一个#符号,使用URL的哈希值实现,比如www.baidu.com/#/test

路由配置: createHashRouter或者createBrowserRouter二选一就可以,这里是为了显示效果

import { createHashRouter ,createBrowserRouter} from 'react-router-dom'
import Home from '../pages/Home';
import Test from '../pages/Test';


//路由
export const globalRouters = createHashRouter/createBrowserRouter([
    {
        // 首页
        path: '/',
        element: <Home />,
    },
    {
        // 测试页面
        path: '/test',
        element: <Test />,
    }
])

BrowerRouter路由

路由是什么样的就是展示成什么样子,比如test页面

编辑

优点是路由所见即所得

缺点是在服务器渲染的时候需要后端坐映射:

nginx配置

location /web {
   try_files $uri /index.html;
}

否则的会显示找不到页面

编辑

HashRouter路由

HashRouter路由多了一个#分割域名和路由,这样的好处就是服务端渲染的时候不需要做任何配置,就可以直接显示页面:

编辑

所以我们一般开发通常采用HashRouter路由,这样不需要后端同学配置

React路由守卫

在vue里面通过router.beforeEach就可以直接拦截路由,比如用户登录失效之类的

router.beforeEach((to, _from) => {
  nprogress.start() // 开始加载进度条
  // 用户登录失效
  if (to.meta.requiresAuth && !store.state.login.UserInfo.name) {
    // 此路由需要授权,请检查是否已登录
    // 如果没有,则重定向到登录页面
    return {
      path: '/login',
      // 保存我们所在的位置,以便以后再来
      query: { redirect: to.fullPath }
    }
  }
  // 如果页面不存在
  if (!to.name && to.path !== '/404') {
    return {
      path: '/404'
    }
  }
})

但是我们React路由原生没有这个函数,所以需要自己处理拦截效果

以下是基于React Router V6 实现的一个简单的路由守卫校验

src/router/index.tsx文件

import { Route, Routes, Navigate } from 'react-router-dom'
import { ReactNode } from 'react';
import Test from '../pages/Test';
import Login from '../pages/Login';
import Error404 from '../pages/404';
import Home from '../pages/Home';
import React from 'react';

//路由校验
const Router = () => {

  const routes = [
    {
      path: '/',
      auth: false,
      component: <Home />,
    },
    {
      path: '/test',
      auth: false,
      component: <Test />,

    },
    {
      path: '/*',
      auth: false,
      component: <Error404 />
    }
  ]


  //路由校验
  const RouteChildren = (param: any) => {
    //判断是否已经登录逻辑,我此处忽略了
    const isLogin = false
    return (
      param.map((item: { path: string, auth: boolean, component: ReactNode, child?: any }) => {
        return (
          <Route path={item.path} element={!isLogin ? <Navigate to='/login' replace={true}></Navigate> : item.component}
            key={item.path}
          >
            {
              item?.child && RouteChildren(item.child)
            }
          </Route>
        )
      })
    )
  }

  return (
    <Routes>
      {/* 如果没有登录的话 渲染那里全部阻塞,所以需要提前配置一个login */}
      <Route path={"/login"} element={<Login />} />
      {
        RouteChildren(routes)
      }
    </Routes >
  )

}

export default Router;

src/pages/index.tsx

import React from 'react';
// import './index.css';
import { HashRouter } from 'react-router-dom'
import RouterMap from '../router/index.tsx'
function App() {
    return (
        <HashRouter>
            <RouterMap />
        </HashRouter>
    )
}
export default App

总结:React的路由可以管理整个React应用,并且只需要使用一次即可,React路由的一切展示都是组件,写React路由其实就是在写组件

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唆键盘的小前端

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值