vue3.0 router路由跳转传参问题(router.push)

 更新时间:2023年02月15日 10:12:19   作者:普通网友  
这篇文章主要介绍了vue3.0 router路由跳转传参问题(router.push),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

vue3 router路由跳转传参

vue3.0取消了2.0部分api,所以路由跳转传值方式有所不同。

这里主要讲编程式导航,也就是router.push(location, onComplete?, onAbort?)

vue3.0新增API:useRouter和useRoute

路由跳转

1.首先在需要跳转的页面引入API—useRouter

import { useRouter } from 'vue-router'

2.在跳转页面定义router变量

const router = useRouter()

3.用router.push跳转页面

// 字符串
router.push('home')

// 对象
router.push({ path: 'home' })

// 命名的路由
router.push({ name: 'user', params: { userId: '123' }})

// 带查询参数,变成 /register?userId=123
router.push({ path: 'register', query: { userId: '123' }})

4.如果有参数的话,在接收页面引入API–useRoute

import { useRoute } from 'vue-router'

5.在接收页面定义变量route,获取传过来的变量

//query
let userId=route.query.userId;

//params
let userId=route.params.userId;

页面传参需要注意的问题

1.如果提供了path,params会被忽略,但query没有这种情况,此时需要提供路由的name或手写完整的带有参数的path

const userId = '123'
router.push({ name: 'user', params: { userId }}) // -> /user/123
router.push({ path: `/user/${userId}` }) // -> /user/123
// 这里的 params 不生效
router.push({ path: '/user', params: { userId }}) // -> /user

2.上述规则同样适用于router-link组件的to属性

3.如果目的地和当前路由相同,只有参数发生了改变 (比如从一个用户资料到另一个/users/1->/users/2),你需要使用[这里是代码018]来响应这个变化 (比如抓取用户信息)

路由(vue-router)配置及语法

来看一下vue3.0的路由(vue-router),在看vue3.0路由之前,我们先来和vue2.0的路由做个对比,看看现在两者之间的区别。

1、从引入来说

vue2.0 ,通过vue-router直接引入vueRouter

import VueRouter from "vue-router";

vue3.0, 通过vue-router引入createRouter, createwebHashHistory | createWebHistory

import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router'

2、创建实例

vue2.0,直接创建vueRouter实例

const router = new VueRouter({
  mode: "history",
  base: process.env.BASE_URL,
  routes,
});

vue3.0,调用createRouter方法

const router = createRouter({
  history: createWebHashHistory(),
  routes
});

3、从路由跳转

vue2.0,直接$router

this.$router.push({path: 路径, query: 参数})

vue3.0,调用useRouter方法

import { useRouter } from 'vue-router'
const router = useRouter();
router.push('/')

上面我们看了vue3.0的vue2.0的区别,那么接下来

我们看看vue3.0路由(router的写法)

1、路由表配置

创建router.ts,在其中写路由

const routes: Array<RouteRecordRaw> = [
  {   
   path: '/',   
   name: 'supplier',    
   component: () => import(/* webpackChunkName: "body" */ '../views/supplier/index.vue') 
   meta: {
        icon: 'ion:grid-outline',
        title: '供应商',
        orderNo: 4,
      }, 
  }, 
  {
    path: '/login', 
    name: 'login',
    component: () => import(/* webpackChunkName: "login" */ '../views/user/login/index.vue')
     meta: {
        title: '登录',
      }, 
  }
];
exprot default routes

2、路由出口

创建router下的index.ts

// 从vue-router中引入createRouter,以及模式
import {
  createRouter,
  createWebHashHistory
} from 'vue-router'
// 引入routes.ts文件
import routes from './routes.ts'
const router = createRouter({
  history: createWebHashHistory(), //createWebHashHistory是hash模式
  routes
});
 
export default router

3、注入项目

// 在main.ts/js里面
import router from './router'
createApp(App).use(router).mount('#app')

上面就是vue-router的引入以及简单配置,那么接下来看看vue-router的页面跳转及传参

1、页面跳转及传参、

//从vue中引入router
import { useRouter } from "vue-router";
const router = useRouter();
//router 包含router对象的内容;如下图
// 跳转我们可以使用 router.push()
// 不带参数,直接填写路径,写法
router.push('path路径') || router.push({path: "path路径"}) ||router.push({name: 'name名字'})
// 带参数
router.push({path: 'path路径', query: '参数'})
router.push({name: 'name名字', params: '参数'})

2、接参

// 引入route
import { useRoute } from "vue-router";
const route = useRoute()
// route参数,如下图
// 如果对应params传递参数
route.params.参数值
// 如果使用query传参
route.query.参数

以上内容就是vue-router里面的参数以及页面跳转,参数,接参的方式。其中路由中重定向(redirect),路由守卫并没有变化。那么我们来看看路由守卫的前置守卫

路由守卫-前置守卫(beforeEach)

const WhiteList = ['/login']; // 配置白名单
router.beforeEach((to, from, next)=> {
  if (WhiteList.indexOf(to.fullPath) !== -1) { // 判断前往页面是都存在于白名单
    next()
  } else {
    if (localStorage.getItem('userInfo')) {// 判断用户是否d登录
      if (to.name) { // 判断是否存在路由的name名字,如果有则代表有路由表已经存在,name继续前往,反之,则不存在
        next()
      }
      else {// 当路由不存在,录取路由,动态添加路由表,
        let localRoutes: any = localStorage.getItem('routes');
        let recursionList = recursionParam(JSON.parse(localRoutes));
        for (let item of recursionList) {
          router.addRoute(item)
        }
        next({ ...to, replace: true })
      }
    } else {
      next('/login')
    }
  }
});

注意哦:

vue3.0中的addRoute()添加的是路由对象,而不是整个路由数组。

vue2.0是addRoutes(),直接添加路由表的数组。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue实现监听某个元素滚动,亲测有效

    Vue实现监听某个元素滚动,亲测有效

    这篇文章主要介绍了Vue实现监听某个元素滚动,亲测有效!具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 优化Vue页面中的表单布局和样式的技巧

    优化Vue页面中的表单布局和样式的技巧

    在日常开发中,Vue 项目中的表单布局和样式优化是一个重要的环节,通过合理的布局与美观的样式设计,不仅可以提升用户体验,还能增加页面的实用性和观赏性,本文将总结几个常见的表单和表格布局优化的技巧,需要的朋友可以参考下
    2024-10-10
  • Node.js+Vue脚手架环境搭建的方法步骤

    Node.js+Vue脚手架环境搭建的方法步骤

    这篇文章主要介绍了Node.js+Vue脚手架环境搭建的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2020-03-03
  • vue源码之首次渲染过程详解

    vue源码之首次渲染过程详解

    这篇文章主要为大家详细介绍了vue源码之首次渲染过程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • element-plus 如何设置 el-date-picker 弹出框位置

    element-plus 如何设置 el-date-picker 弹出框位置

    el-date-picker 组件会自动根据空间范围进行选择比较好的弹出位置,但特定情况下,它自动计算出的弹出位置并不符合我们的实际需求,故需要我们手动设置,这篇文章主要介绍了element-plus 如何设置 el-date-picker 弹出框位置,需要的朋友可以参考下
    2024-07-07
  • vue实现web滚动条分页

    vue实现web滚动条分页

    这篇文章主要为大家详细介绍了vue实现web滚动条分页,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • 关于ElementPlus中的表单验证规则详解

    关于ElementPlus中的表单验证规则详解

    这篇文章主要介绍了关于ElementPlus中的表单验证,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • vue做移动端适配最佳解决方案(亲测有效)

    vue做移动端适配最佳解决方案(亲测有效)

    这篇文章主要介绍了vue做移动端适配最佳解决方案(亲测有效),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • Vue 读取HTMLCollection列表的length为0问题

    Vue 读取HTMLCollection列表的length为0问题

    这篇文章主要介绍了Vue 读取HTMLCollection列表的length为0问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 使用Vue自定义数字键盘组件(体验度极好)

    使用Vue自定义数字键盘组件(体验度极好)

    最近做 Vue 开发,因为有不少页面涉及到金额输入,产品老是觉得用原生的 input 进行金额输入的话 体验很不好,于是自己动手写了一个使用Vue自定义数字键盘组件,具体实现代码大家参考下本文
    2017-12-12

最新评论