vue3:十、页面跳转,根据参数跳转回原访问页面

目的:如果用户在访问某个需要登录的页面时,但是某些信息不存在时(例如token),根据路由守卫的设定,就会跳转到登录页面,但如果在访问页面增加参数redirect=路径值,就可以当用户成功登录时,根据redirect跳转以及当前页面的参数,重新回到刚才访问的页面

一、守卫跳转路径:更换跳转方式

主要对路由守卫后的路径跳转为拼接跳转,携带参数redirect=路径值

路由守卫参考:vue3:九、路由守卫-优快云博客

路由守卫,这里我采用的都是官方提供的跳转方式:next({ name: 'login' }),现将其转换为拼接路径,就可以标识参数,表明我是从什么页面跳转过来的

1、初始路由守卫

由下代码可知,路径跳转都是采用next({name:'跳转的路径的name值'})进行跳转

//设置系统标题
const SystemTitle = 'SMS后台管理系统';
//设置一个不需要进行登录的页面数组
const NoLogin = ['login', 'not-found', 'test']
//设置路由守卫
router.beforeEach(async(to, from, next) => {
  if (to.meta.title) {
    //拼接新标题
    var newtitle = to.meta.title + '-' + SystemTitle
    document.title = newtitle
  }
  // 判断是否登录
  const token = getToken();
  //如果token不存在
  if (!token) {
    //在NoLogin数组中,表示不需要登录,就直接放行
    if (NoLogin.includes(to.name)) {
      next()
    }
    //如果不在NoLogin数组中,就表示需要登录,没有token就跳转到登录页面
    else {
      next({ name: 'login' })
    }
  }
  //token存在
  else {
    //如果在登录页面,就跳转到首页
    if (to.name == 'login') {
      next({ name: 'main' })
    }
    else {
      //读取用户信息
      const userstore = userStore();
      console.log(userstore)
      if (userstore.username) {
        //放行
        next();
      }
      else {
        //如果token存在,用户信息没查询到就去请求用户信息
        var res = await getuserinfo();
        console.log(res);
        //请求之后,如果请求成功,就设置token,设置用户信息,放行,如果请求失败,就删除token,跳转到登录页面
        if(res.code == 1){
          //设置token和用户信息
          setToken(res.token);
          //将用户信息设置到store中
          userstore.setUserinfo(res.data)
          //放行
          next();
        }
        else{
          //删除token
          delToken();
          //跳转到登录页面
          next({ name: 'login' })
        }
      }
    }
  }
})

2、将原始跳转更改为拼接路径

①路由页面使用拼接路径

可以采用这种方式拼接,跳转到/login页面,并且携带参数redirect,其值为当前的to.path路径信息

next(`/login?redirect=${to.path}`)

②完整代码

//设置系统标题
const SystemTitle = 'SMS后台管理系统';
//设置一个不需要进行登录的页面数组
const NoLogin = ['login', 'not-found', 'test']
//设置路由守卫
router.beforeEach(async(to, from, next) => {
  if (to.meta.title) {
    //拼接新标题
    var newtitle = to.meta.title + '-' + SystemTitle
    document.title = newtitle
  }
  // 判断是否登录
  const token = getToken();
  //如果token不存在
  if (!token) {
    //在NoLogin数组中,表示不需要登录,就直接放行
    if (NoLogin.includes(to.name)) {
      next()
    }
    //如果不在NoLogin数组中,就表示需要登录,没有token就跳转到登录页面
    else {
      // next({ name: 'login' })
      next(`/login?redirect=${to.path}`)
    }
  }
  //token存在
  else {
    //如果在登录页面,就跳转到首页
    if (to.name == 'login') {
      // next({ name: 'main' })
      next('/')
    }
    else {
      //读取用户信息
      const userstore = userStore();
      console.log(userstore)
      if (userstore.username) {
        //放行
        next();
      }
      else {
        //如果token存在,用户信息没查询到就去请求用户信息
        var res = await getuserinfo();
        console.log(res);
        //请求之后&#
<think>好的,用户想了解在Vue3中如何跳转页面并传递参数。首先,我需要Vue3的路由机制,特别是Vue Router的使用方法。Vue3中常用的路由跳转方式有两种:声明式导航(<router-link>)和编程式导航(使用router实例的方法)。 接下来,参数传递的方式主要有两种:query参数和params参数。需要分别解释这两种方法的区别和使用场景。比如,query参数会显示在URL中,适合传递非敏感数据,而params参数则更隐蔽,但需要提前在路由配置中定义好参数名。 然后,要详细说明每种方法的实现步骤。对于编程式导航,可能需要使用router.push方法,并举例说明如何传递参数。同时,要提醒用户如果使用params,必须确保路由配置中有对应的动态字段,比如path: &#39;/user/:id&#39;,否则参数可能无法正确传递。 另外,在目标页面如何接收参数也是一个重点。在Vue3的setup函数中,可以通过useRoute钩子来获取路由对象,进而访问query或params中的参数。需要给出具体的代码示例,比如使用route.params.id来获取动态参数,或者route.query.name获取查询参数。 还要考虑用户的常见问题,例如在传递对象等复杂数据类型时,直接使用params可能无法正常工作,这时候可能需要使用本地存储(如localStorage)或者状态管理(如Pinia)来辅助传递数据。这时候需要给出替代方案的建议,确保用户了解不同的场景下如何选择合适的方法。 此外,要检查是否有遗漏的细节,比如在路由跳转时如何替换当前历史记录而不是添加新记录(使用router.replace),或者在编程式导航中如何处理错误和异常情况。虽然用户可能没有明确提到这些,但作为全面的教程,简要提及这些高级用法可能会有帮助。 最后,要确保所有的代码示例符合Vue3Vue Router的最新语法,特别是组合式API的使用,比如使用import { useRouter, useRoute } from &#39;vue-router&#39;,并在setup()中调用它们。同时,保持示例简洁明了,避免复杂的配置让用户感到困惑。 总结下来,答的结构应该分为几个部分:路由跳转的方法、参数传递的方式、参数的接收、处理复杂数据的方法,以及注意事项和常见问题。每个部分都要有代码示例和解释,确保用户能够一步步理解和实现页面跳转参数传递的功能。</think>在Vue3中实现页面跳转传参主要有两种方式,下面分步骤说明具体实现方法: 1. **使用router-link声明式导航** ```html <!-- 传递query参数(URL可见) --> <router-link :to="{ path: &#39;/user&#39;, query: { id: 123, name: &#39;John&#39; } }"> 用户页面 </router-link> <!-- 传递params参数(需路由配置动态字段) --> <router-link :to="{ name: &#39;user&#39;, params: { userId: 456 } }"> 用户详情 </router-link> ``` 2. **编程式导航(推荐方式)** ```javascript import { useRouter } from &#39;vue-router&#39; const router = useRouter() // 方式一:query传参(URL可见) function gotoUser() { router.push({ path: &#39;/user&#39;, query: { id: 123, name: &#39;John&#39; } }) } // 方式二:params传参(需路由配置) function gotoDetail() { router.push({ name: &#39;userDetail&#39;, // 必须使用命名路由 params: { userId: 456 } }) } ``` 3. **路由配置示例** ```javascript // router.js { path: &#39;/user/detail/:userId&#39;, // 动态字段以冒号开头 name: &#39;userDetail&#39;, component: UserDetail } ``` 4. **接收参数的两种方式** ```javascript import { useRoute } from &#39;vue-router&#39; // 在目标页面组件中 setup() { const route = useRoute() // 接收query参数 console.log(route.query.id) // 输出123 console.log(route.query.name) // 输出John // 接收params参数 console.log(route.params.userId) // 输出456 return { /* ... */ } } ``` **注意事项:** - 当使用params传参时,参数不会显示在URL中(动态路由参数除外) - 刷新页面时,params参数会丢失(除非使用动态路由) - 传递对象等复杂数据时建议: 1. 使用Vuex/Pinia状态管理 2. 通过localStorage临时存储 3. 将对象转为JSON字符串传递 **参数类型对比:** | 方式 | URL可见性 | 数据持久性 | 路由配置要求 | |--------|-----------|------------|--------------| | query | 可见 | 刷新保留 | 无 | | params | 不可见 | 刷新丢失 | 需要预定义 | 根据实际需求选择传参方式,对于需要持久化的参数推荐优先使用query传参,敏感数据建议通过状态管理工具传递。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

25号底片~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值