vue3路由新玩法useRoute和useRouter详解

目录
  • 我们通过useRouter来手动控制路由变化
  • 通过useRouter传参的三种方式
    • 隐式传参params
  • 显式传参query
    • 动态路由传参
  • useRouter 的push和replace

原来的vue2路由是通过this.$route和this.$router来控制的。现在vue3有所变化,useRoute相当于以前的this.$route,而useRouter相当于this.$router

我们通过useRouter来手动控制路由变化

import { useRouter } from 'vue-router'
export default {
    setup() {
        const userRouter = useRouter()
        userRouter.push("/home")
    }
}

通过useRouter传参的三种方式

隐式传参params

import { useRouter } from 'vue-router'
export default {
    setup() {
        const userRouter = useRouter()
        userRouter.push({
            name: 'Home',
            params: {
                name: 'dx',
                age: 18
            }
        })
    }
}

请注意params只与name搭配生效,name就是route配置时的name

const routes: Array<RouteRecordRaw> = [
  {
    path: '/',
    name: 'Home',
    component: Home
  }
]

通过useRoute来接收params参数

import { useRoute } from 'vue-router'
export default {
    setup() {
        const route = useRoute()
        console.log(route.params)
    }
}

显式传参query

import { useRouter } from 'vue-router'
export default {
    setup() {
        const userRouter = useRouter()
        userRouter.push({
            path: '/',
            query: {
                name: 'dx',
                age: 18
            }
        })
    }
}

path与query是一对,name和params是一对,请别混用。

通过useRoute来接收query参数

import { useRoute } from 'vue-router'
export default {
    setup() {
        const route = useRoute()
        console.log(route.query)
    }
}

总结一下显式路由和隐式路由的区别

除了他们的传递和接收方式不同外

显式query会很明显的跟在新的url上,而隐式params不会

隐式params在刷新后可能会消失,我们可以在它存在的时候存如缓存中,如localstorage

隐式params比显式query相对而言更安全,不会将参数直接暴露给用户

显示query在浏览器的url上,如果你直接通过字符串的方式去取,可能会涉及转码等问题,当然useRoute将这些都处理好了,所以还是推荐通过useRoute.query去取显式路由的参数

动态路由传参

首页跟以前一样,我们在配置页面路由的时候就需要配置动态路由的名称,这里配置id

const routes: Array<RouteRecordRaw> = [
  {
    path: '/about/:id',
    name: 'About',
    component: About
  }
]

useRouter 传递动态参数id = 1 ,大多数时候动态参数都是简单数据类型,如果不是,你没必要用动态参数。

import { useRouter } from 'vue-router'
export default {
    setup() {
        const userRouter = useRouter()
        userRouter.push({
            path: '/about/1',
        })
    }
}

通过useRoute来接收动态参数的方式和params一样

import { useRoute } from 'vue-router'
export default {
    setup() {
        const route = useRoute()
        console.log(route.params)
    }
}

useRouter 的push和replace

push就是如上面的代码一样,就是在浏览器的历史记录中追加一个新的记录,你可以通过window.history看到这个记录。

而replace则是将当前的路由记录替换掉,替换后你如果回退,会发现上一个路由地址已经消失了。

import { useRouter } from 'vue-router'
export default {
    setup() {
        const userRouter = useRouter()
        userRouter.replace({
            path: '/about/1',
        })
    }
}

我在无意之间发现一个有意思的问题,也不知道是不是一个bug

import { useRouter } from 'vue-router'
export default {
    setup() {
        const userRouter = useRouter()
        userRouter.push({
            path: '/about/1',
            replace: true
        })
    }
}

当我调用push方法传入replace为true时,真的就是replace的形式,传入replace为false才恢复正常

然后我又试了一下replace

import { useRouter } from 'vue-router'
export default {
    setup() {
        const userRouter = useRouter()
        userRouter.replace({
            path: '/about/1',
            replace: false
        })
    }
}
import { useRouter } from 'vue-router'
export default {
    setup() {
        const userRouter = useRouter()
        userRouter.replace({
            path: '/about/1',
            push: true
        })
    }
}

以上两种方式都是replace的形式。

push的时候传入replace为true结果是replace,那还需要replace方法么,也不知道是不是bug。

当然了,你可能还有许多关于vue3使用路由的问题,去这里基本都可以得到解决 https://router.vuejs.org/zh/api/

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

(0)

相关推荐

  • 关于VueRouter导入的全过程

    目录 router nanoid的使用 引入 使用 路由 1-1 安装依赖 1-2 引入 1-3 在main.js中使用 1-4 App.vue 全局过滤器 element-ui 全局组件 Vuc-cli中的视配 1-1 安装依赖 1-2 配置文件 1-3 main.js 1-4 public/index.html 1-5 在pc端视配 slot封装动画 项目初始化 1-1 .router-link-active 1-2 动态显示tabbar 1-3 跳转回前一个页面 1-4轮播 vant ui

  • vue-router传参的4种方式超详细讲解

    目录 一.router-link路由导航方式传参 二.调用$router.push实现路由传参 三.通过路由属性name匹配路由,再根据params传递参数 四.通过query来传递参数 总结 一.router-link路由导航方式传参 父组件:<router-link to="/跳转到的路径/传入的参数"></router-link> 子组件:this.$route.params.content接受父组件传递过来的参数 例如: 路由配置: bashbash{p

  • vue性能优化之cdn引入vue-Router的问题

    目录 cdn引入vue-Router问题 vue引入外部cdn报错 'XXX is not defined' 及事件处理 解决办法 cdn引入vue-Router问题 关于vue的性能优化,有一个非常重要的点,就是用cdn的方式引入vue.vue- router.ElementUI.vuex.axios.jquery,那么到底怎么引呢? 1.打开国内cdn服务网址: https://www.bootcdn.cn/ 2.查看你的项目 package.json ,查看你安装的是哪个版本 3.在cdn

  • vue router-link下划线和颜色问题及解决

    目录 router-link下划线和颜色问题 解决方法 "router-link"各种属性解释 1.":to" 属性 2."replace" 属性 3."tag" 属性 4."active-class" 属性 5."exact" 属性 router-link下划线和颜色问题 使用router-link链接的文字,默认为蓝色并带下划线,很不好看. 解决方法 在<style scope

  • Vue--Router动态路由的用法示例详解

    目录 官网网址 动态路由概述 同一路由多个参数 path-to-regexp Api用法 1. pathToRegexp() 2.exec() 3. parse() 4. compile() 本文介绍Vue-Router中动态路由的用法. 官网网址 Vue官网:带参数的动态路由匹配 | Vue Router 动态路由概述 说明 很多时候,我们需要将给定匹配模式的路由映射到同一个组件.例如,我们可能有一个 User 组件,它应该对所有用户进行渲染,但用户 ID 不同.在 Vue Router 中,

  • vue-router后台鉴权流程实现

    目录 前言: 路由拦截鉴权常用的两种方法 比较: 与动态路由相关的通常有以下几个文件: router.js permission.js store.js 退出登录: 结尾: 前言: 最近项目遇到一个管理系统,感觉权限配置挺有意思,记录一下流程实现的过程,便于自己学习以及整理思路,部分思路整合在代码的注释中: 路由拦截鉴权常用的两种方法 路由拦截:单纯给路由加字段标识符,通过路由拦截实现动态路由:第二种是通过路由的拆分另外需要后端的配合去实现的动态路由配置 比较: 路由拦截实现方式比较简单,只需要

  • vue3路由新玩法useRoute和useRouter详解

    目录 我们通过useRouter来手动控制路由变化 通过useRouter传参的三种方式 隐式传参params 显式传参query 动态路由传参 useRouter 的push和replace 原来的vue2路由是通过this.$route和this.$router来控制的.现在vue3有所变化,useRoute相当于以前的this.$route,而useRouter相当于this.$router 我们通过useRouter来手动控制路由变化 import { useRouter } from

  • 关于vue3 option api新玩法分享

    可能一些朋友看到标题,瞬间就不淡定了,vue3+option api,在大家都在使用setup做组合式API的今天,这不就是开历史的倒车吗?别急啊,我们这么做,也是有苦衷的. 这是2个月之前在一篇介绍script setup的文章里面,我发布一个评论.事情就如同评论所说,考虑到成员之间水平不一样,太灵活了,你写代码煮面条我也煮面条,彼此之间反而互相看不懂代码了.那做eslint规范约束吧,约束到最后得到一个长得像option api但效果又没有option api好的规范,最终团队默默退回了op

  • vue新玩法VueUse工具库具体用法@vueuse/core详解

    VueUse官方链接 一.什么是VueUse VueUse不是Vue.use,它是为Vue 2和3服务的一套Vue Composition API的常用工具集,是目前世界上Star最高的同类型库之一.它的初衷就是将一切原本并不支持响应式的JS API变得支持响应式,省去程序员自己写相关代码. VueUse 是一个基于 Composition API 的实用函数集合.通俗的来说,这就是一个工具函数包支持了更好的逻辑分离,它可以帮助你快速实现一些常见的功能,免得你自己去写,解决重复的工作内容.以及进

  • Vue路由钩子之afterEach beforeEach的区别详解

    vue-router作为vue里面最基础的服务,学习一段时间,对遇到的需求进行一些总结 使用vue-cli作为开发前提 vue-router已经配置好了 路由写法 routes: [ { path: '/cart', name: 'cart', component: cart, meta :{ title: "购物车"} //用于给定网页名 } ] vue-router 的路由跳转的方法 第一种 : 编程式的导航 <router-link to="/" tag

  • 使用Vite+Vue3+Vant全家桶快速构建项目步骤详解

    目录 引言 一.vue3全家桶模板介绍 1.版本依赖 2.全家桶内置集成 二.安装 tive-cli 命令行工具 三.生成项目 四.项目体验 引言 随着Vue3 和 Vite 版本的不断更新完善,开发体验有了质的飞跃.因此,越来越多的大厂也逐步拥抱 Vue3. 利用Vite 脚手架工具可以很轻松生成以 Vue3 为模板的项目,但是作为Vue全家桶的 vue-router.vuex.axios等成员,需要自己一个一个去配置.于是便自行开发了本文讲到的 tive-cli 脚手架模板工具,只需短短几个

  • vue3中的透传attributes教程示例详解

    目录 引言 绑定样式 对象 数组 透传的attributes 透传 attributes 之样式绑定 透传 attributes 之事件绑定 特殊1:组件嵌套 特殊2:禁用透传attributes 特殊3:在 javascript 中访问透传的attributes 总结 引言 最近两年都是在使用 react 进行项目开发,看技术博客都是针对 react 和 javaScript 高级方面的,对 vue 的知识基本上遗忘的差不多了.最近开始慢慢回顾 vue 的知识以及对新的语法进行学习,为后面的计

  • Vue3 diff算法之双端diff算法详解

    目录 双端Diff算法 双端比较的原理 简单Diff的不足 双端Diff介绍 Diff流程 第一次diff 第二次diff 第三次diff 第四次diff 双端Diff的优势 非理想情况的处理方式 添加新元素 移除不存在得节点 双端Diff完整代码 双端Diff算法 双端Diff在可以解决更多简单Diff算法处理不了的场景,且比简单Diff算法性能更好.本篇是以简单Diff算法的案例来展开的,不过没有了解简单Diff算法直接看双端Diff算法也是可以看明白的. 双端比较的原理 引用简单Diff算

  • js es6系列教程 - 新的类语法实战选项卡(详解)

    其实es6的面向对象很多原理和机制还是ES5的,只不过把语法改成类似php和java老牌后端语言中的面向对象语法. 一.用es6封装一个基本的类 class Person{ constructor( uName ){ this.userName = uName; } sayName(){ return this.userName; } } 是不是很向php和java中的类, 其实本质还是原型链,我们往下看就知道了 首先说下语法规则: class Person中的Person就是类名,可以自定义

  • iOS新功能引导提示界面实例详解

    在开发中,现在很多app更新了新功能时都会给出用户一个提示,以方便用户更好的体验,那么这个功能如何实现的呢? 首先看下效果图: 1.首先创建第一个viewcontroller 在上面放上一个imageview和一个按钮 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. UIImageView *imageview=[[UIImageView alloc]ini

  • PHP 7.4 新语法之箭头函数实例详解

    短闭包,也叫做箭头函数,是一种用 php 编写的短函数.当向函数中传递闭包时,这个功能是非常有用的,比如使用 array_map 或是 array_filter函数时. 这就是它们看起来的样子: // Post 对象的集合 $posts = [/* - */]; $ids = array_map(fn($post) => $post->id, $posts); 而以前,你必须这样写: $ids = array_map(function ($post) { return $post->id

随机推荐