路由使用方法、路由封装、路由跳转传参及路由前置守卫

本文详细介绍了VueRouter的基本使用方法,包括安装、配置、组件和导航。还探讨了路由封装、router-link特性、路由跳转的两种方式(查询参数和动态路由)、重定向、404页面、路由模式(hash和history)以及前置守卫的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、路由基本使用

1.下载 VueRouter 模块到当前工程,版本3.6.5,vue2用版本3,vue3用版本4

yarn add vue-router@3.6.5
npm install vue-router

2.main.js中引入VueRouter

import VueRouter from 'vue-router'

3.在main.js安装注册

Vue.use(VueRouter)//VueRouter插件初始化

4.main.js创建路由对象,配置路由规则

const router = new VueRouter({
	routes:[
      {path:'/xxx',component:xxxx},
      ....
	]
})

5.并且注入到Vue实例中

new Vue({
  render: h => h(App),
  router:router//可简写为router,如果不是router命名,就不能简写
}).$mount('#app')
  • 页面中使用路由两个核心步骤:

1.创建需要的组件(views目录),配置路由规则
2.配置导航,配置路由出口(路径匹配的组件显示的位置)<router-view></router-view>

二、路由封装

如果全部写在main.js中,代码太多,不利用维护。那我们可以将路由单独封装放在‘src/router/index.js’文件里面,只需要再main.js中引入并注入就行了。
具体代码如下图:
在这里插入图片描述

三、router-link替代a标签实现高亮及自定义类名

//RouterLink会自动给当前的链接添加两个类名
// router-link-active: 激活的导航链接   模糊匹配,这个用的多
// router-link-exact-active:  激活的导航链接 精确匹配

  <router-link to="/home"></router-link>

// 可以修改默认高亮的类名
const router = new VueRouter({
  routes:[...],
  linkActiveClass: '类名1',
  linkExactActiveClass: '类名2',
  // route: 一条规则
}

四、路由跳转的两种方式和传参

1.声明式导航

(1)查询参数传参(适合传多个参数,&来链接传多个)

  • to=“/path?参数名=值&参数名=值”(多个参数用&)
  • 接收:$route.query.参数名
  • 在created里面调接口传参,这里需要写this.$route.query拿到传参的值
<router-link to="/detail?id="item.id"&name="item.name""></router-link>
...
//接收
{{$route.query.id}}
....
created(){
	console.log(this.$route.query.id)	
}

(2)动态路由传参(优雅简洁,适合单个参数传参)

  • 路由配置:path:‘/path/:参数名?’ (不加?,不传参就不生效,所以加一个?可选)
  • 跳转:to=“/path/参数值”
  • 接收:$route.params.参数名
const router = VueRouter({
  mode:'history',
  routes[
    {path:'/search/:id?',component:Search},
    ...
  ]
})
//跳转语法
<router-link to="/search/001"></router-link>
<router-link to="/search/002"></router-link>
//接收
{{ $route.params.id}}
....
created(){
	console.log(this.$route.params.id)	
}

2.编程式导航

如果是按钮如何进行路由跳转,可以会用编程式导航,用js来进行跳转
(1)path路径跳转(简易方便)

this.$router.push('/路由路径')
//完整写法,传参时需要
this.$router.push({
  path:'/路由路径'
})
//案例
<button @click="goSearch">按钮</button>
...
  goSearch(){
    this.$router.push('/search')
  }
//1.查询参数传参
this.$router.push('/路由路径?参数名1=参数值&参数名2=参数值')
this.$router.push({
  path:'/路由路径',
  query:{
    参数名1:'值1',
    参数名2:'值2'
  }
})
//接收
{{ $route.query.words}}

//2.动态路由传参
 { path: '/search/:words?', component: Search },//动态路由传参

this.$router.push('/路由路径/参数值)
this.$router.push({
  path:'/路由路径/参数值'
})
 //接收
{{ $route.params.words}}

(2)name命名路由跳转(适合path路径长的场景)

this.$router.push({
  name:'search'
})
...
const router = VueRouter({
  mode:'history',
  routes[
    {name:'search',path:'/search/:words?',component:Search},
    ...
  ]
})
//1.查询传参
this.$router.push({
  name:'search',
  query:{
    参数名1:'值1',
    参数名2:'值2'
  }
})

 //接收
{{ $route.query.参数名1}}

//2.动态路由传参
 { path: '/search/:words?', component: Search },//动态路由传参

this.$router.push({
  name:'search',
  params:{
    words:'值1',
  }
})

 //接收
{{ $route.params.words}}

实例:
在这里插入图片描述

五、路由重定向及404页面配置

只需将path:‘/’,加上redirect:‘/路由地址’

// 创建了一个路由对象
const router = new VueRouter({
  routes: [
    { path: '/', redirect: '/home' }, //redirect重定向
    { path: '/home', component: Home },
    { path: '/search/:id?', component: Search },//动态路由传参
    { path: '*', component: NotFound } //404页面配置
  ]
})

六、路由模式

  • hash路由(默认)如: http://localhost:8080/#/home
    底层是基于a标签锚链接跳转实现
  • history路由(常用)如:http://localhost:8080/home (以后上线需要服务器端支持)
    基于新增的html5,historyAPI实现的
const router = new VueRouter({
  // 注意:一旦采用了 history 模式,地址栏就没有 #,需要后台配置访问规则
  mode: 'history',
  routes: [
    { path: '/', redirect: '/home' },
    ...
  ]
})

七、路由前置守卫

//所有的页面在真正被访问之前(解析渲染对应组件页面),都会先经过全局前置守卫
//只有全局前置守卫放行了,才会到达对应的页面
//to:到哪里去,from:从哪里来,next():直接放行;next(路径)拦截到next里面配置的路径
//定义一个数组,存放需要token的页面路径
const authUrls =['/Pay','/cart']
router.beforeEach((to,from,next)=>{
  //如果to.path不在authUrls里面直接放行
  if(!authUrls.includes(to.path)){
    next()
    return
  }else{
    //权限页面,需要判断是否有token,没有就跳转到登录页
    //拿到vuex里面的token,将vuex模块组件里面的token配置到全局getters
    // getters: {
    //   token(state){
    //     return state.user.userInfo.token
    //   }
    // },
    const token = store.getters.token
    if(token){
      next()
    }else{
      next('/Login')
    }
  }

})
<think>好的,我需要回答用户关于路由守卫的实现方式和原理,特别是在Vue和React中的应用。首先,我得确认路由守卫的基本概念,确保自己理解正确。路由守卫主要用于在导航过程中进行权限控制或拦截,比如检查用户是否登录,是否有权限访问某个页面等。 接下来,我需要分别处理Vue和React的实现方式。对于Vue,我记得Vue Router提供了导航守卫,包括全局前置守卫`beforeEach`,可以在路由跳转前执行逻辑。这个部分需要详细说明如何使用这些钩子函数,并给出示例代码。同时,要提到组件内的守卫,比如`beforeRouteEnter`,但用户可能更关注全局的守卫,所以重点放在`beforeEach`上。 然后是React部分,React Router本身没有内置的路由守卫,所以需要借助其他方法。根据用户提供的引用,使用`react-router-config`或者在路由配置中封装高阶组件来实现。需要解释这两种方法,比如通过遍历路由配置,检查权限,然后动态渲染组件。同时,引用提到的使用`useLocation`和`useNavigate`钩子可能也是一种方式,但可能更适合函数组件。 接下来要考虑原理部分。路由守卫的核心原理是在路由切换时触发拦截逻辑,根据条件决定是否允许导航。在Vue中,这是通过注册全局钩子函数来实现的,而React中可能需要手动包装组件或使用中间件处理。 需要确保回答结构清晰,分点说明Vue和React的实现方式,再讲原理。同时,要引用用户提供的资料,比如引用[1]、[2]、[3]中的内容,正确标注引用位置。例如,在讲React时提到使用`react-router-config`库,这是来自引用[2],需要添加引用标识。 可能还需要检查是否有遗漏的细节,比如Vue中的路由元信息(meta字段)用来存储权限信息,这在实现中很常见。React中的高阶组件封装,如使用`<Routes>`和`<Route>`组件动态渲染,可能需要结合权限状态进行处理。 最后,生成相关问题,确保问题与路由守卫相关,涵盖原理、实现对比、应用场景等。例如,Vue和React的实现差异,路由守卫的应用场景,或者如何处理异步权限验证等。 需要确保所有技术细节准确,代码示例正确,并且符合用户给出的格式要求,如行内公式用$...$,独立公式用`$$...$$`,但这个问题可能不涉及数学公式,所以主要注意代码块的使用和引用标注的位置。同时,回答使用中文,结构清晰,分步骤说明,帮助用户理解。</think>### 路由守卫的实现方式与原理(Vue/React) 路由守卫(导航守卫)是前端路由系统中用于**控制页面跳转权限**的核心机制,通过在路由切换前、中、后执行自定义逻辑(如登录验证、权限校验),决定是否允许导航或重定向到其他页面。 --- ### 一、Vue 实现路由守卫 Vue Router 内置了**导航守卫钩子函数**,可直接在路由配置中使用。 #### 1. 全局前置守卫(`beforeEach`) ```javascript // main.js router.beforeEach((to, from, next) => { if (to.meta.requiresAuth && !isAuthenticated()) { next(&#39;/login&#39;); // 跳转到登录页 } else { next(); // 允许导航 } }); ``` - **原理**:注册全局钩子,在每次路由跳转前触发。 - **关键参数**: - `to`:目标路由对象; - `from`:当前路由对象; - `next`:控制导航行为的函数(必须调用)。 - **应用场景**:全局权限校验(如登录状态)[^1][^4]。 #### 2. 路由独享守卫(`beforeEnter`) ```javascript const routes = [ { path: &#39;/admin&#39;, component: AdminPage, beforeEnter: (to, from, next) => { if (!isAdmin()) next(&#39;/403&#39;); // 无权限则跳转 else next(); } } ]; ``` #### 3. 组件内守卫 - `beforeRouteEnter`:组件渲染前调用; - `beforeRouteUpdate`:路由参数变化时调用; - `beforeRouteLeave`:离开组件前调用。 --- ### 二、React 实现路由守卫 React Router 未直接提供路由守卫,需通过**封装高阶组件**或使用`react-router-config`实现[^2][^3]。 #### 1. 使用高阶组件封装 ```jsx // PrivateRoute.jsx const PrivateRoute = ({ component: Component, isAuthenticated, ...rest }) => { return ( <Route {...rest} render={(props) => isAuthenticated ? ( <Component {...props} /> ) : ( <Redirect to="/login" /> ) } /> ); }; // 使用 <PrivateRoute path="/dashboard" component={Dashboard} isAuthenticated={user} /> ``` - **原理**:通过条件渲染控制组件显示,未通过校验则重定向。 #### 2. 通过`react-router-config`实现 ```javascript // 路由配置 const routes = [ { path: &#39;/profile&#39;, component: Profile, auth: true // 自定义权限字段 } ]; // 权限校验逻辑 function checkAuth(routes, isLoggedIn) { return routes.map(route => ({ ...route, component: route.auth && !isLoggedIn ? Login : route.component })); } ``` - **原理**:遍历路由配置,动态替换需权限的组件[^2]。 #### 3. 函数组件中使用钩子 ```jsx import { useLocation, useNavigate } from &#39;react-router-dom&#39;; const App = () => { const location = useLocation(); const navigate = useNavigate(); useEffect(() => { if (location.pathname === &#39;/admin&#39; && !isAdmin()) { navigate(&#39;/403&#39;); } }, [location]); }; ``` --- ### 三、路由守卫的核心原理 1. **拦截路由变化**:通过监听路由变化事件(Vue Router 的钩子、React Router 的组件渲染)。 2. **执行校验逻辑**:根据业务需求(如 Token 验证、角色权限)判断是否允许导航。 3. **控制导航行为**: - 允许跳转:继续渲染目标组件; - 拒绝跳转:重定向到指定页面(如登录页)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值