vue-router 4 你真的熟练吗?
虽然 vue-router 4 大多数 API 保持不变,但是在 vue3 中以插件形式存在,所以在使用时有一定的变化。接下来就学习学习它是如何使用的。
一、安装并创建实例
安装最新版本的 vue-router
npm install vue-router@4 或 yarn add vue-router@4
安装完成之后,可以在 package.json 文件查看vue-router的版本
"dependencies": {
"vue": "^3.2.16",
"vue-router": "4"
},
新建 router 文件夹,新建 index.js文件:
import { createRouter,createWebHashHistory } from "vue-router"; const routes = [
{
path:'',
component:()=>import("../views/login/index.vue")
},
{
path:'/home',
component:()=>import("../views/home/index.vue")
}
] const router = createRouter({
history:createWebHashHistory('/'),
routes
}) export default router
然后在main.js 中引入 router 。
import { createApp } from 'vue'
import App from './App.vue'
import router from "./router/index" const app = createApp(App)
app.use(router)
app.mount('#app')
注意:之前 component 引入组件的时候,后边可以省略 .vue 后缀,但在 vue-router 4这不能省略后缀,否则就报错了。
二、vue-router4 新特性
2.1、动态路由
addRoute 动态添加路由时,有两种情况,分别为:
//动态添加路由--默认添加到根
router.addRoute({
path:'/my',
name:'my',
component:()=>import("../views/my/index.vue")
}) //动态添加子路由
router.addRoute('my',{
path:'/info',
component:()=>import("../views/my/info.vue")
})
添加子路由时,第一个属性值是父级路由的 name 属性值。
2.2、与 composition 组合
在 事件中获取 router ,进行路由跳转等操作。
<template>
<button @click="backToHome">跳转到首页</button>
</template> <script>
import { useRouter } from "vue-router"
export default {
setup(){
const router = useRouter()
return{
backToHome(){
router.push("/")
},
}
}
}
</script>
通过 useRouter 获取到路由之后再进行操作。也可以对当前路由route进行操作。以下是监听route.query的案例:
<template>
<div>监听路由变化</div>
</template> <script>
import { useRouter,useRoute } from "vue-router"
import { watch } from "@vue/runtime-core"
export default {
setup(){
const route = useRoute()
//route时响应式对象,可监控变化
watch(()=>route.query,query=>{
console.log('最新的',query)
})
}
}
</script>
三、导航守卫
导航守卫主要用来通过跳转或取消的方式守卫导航,有很多种方式植入路由导航中:全局的、单个路由独享的或者组件级的。
3.1、全局守卫
router.beforeEach((to,from,next)=>{
console.log('全局前置守卫');
})
router.afterEach((to,from)=>{
console.log('全局后置钩子');
})
与之前的使用都一样,没有任何变化。
3.2、路由独享守卫
router.addRoute({
path:'/my',
name:'my',
component:()=>import("../views/my/index.vue"),
beforeEnter:(to,from)=>{
console.log('路由独享守卫');
}
})
3.3、组件内的守卫
组件内的守卫与之前使用不同,vue-router4中,需要从vue-router内引入需要的插件。
<script>
import { onBeforeRouteLeave } from "vue-router"
export default {
setup(){
onnBeforeRouteLeave((to,from)=>{
const answer = window.confirm('是否确认离开')
if(answer){
console.log('不离开');
return false
}
})
}
}
</script>
四、vue-router4 发生破坏性变化
4.1、实例创建方式
//以前创建方式
const router = new VueRouter({ })
new Vue({
router,
render:h=>h(App)
}).$mount("#app") //vue-router4创建方式
import { createRouter } from "vue-router"
const router = createRouter({ })
createApp(App).use(router).mount("#app")
4.2、模式声明方式改变
//之前
const router = new VueRouter({
mode:"hash"
}) //新的
import { createRouter, createWebHashHistory } from "vue-router"
const router = createRouter({
history:createWebHashHistory()
})
之前的mode替换成了 history ,它的选项变化分别为:
- history -> createWebHistory
- hash -> createWebHashHistory
- abstract -> createMemoryHistory
4.3、base属性被合并
base 选项被移至 createWebHistory 中。
//之前
const router = new VueRouter({
base:"/"
}) //新的
import { createRouter, createWebHashHistory } from "vue-router"
const router = createRouter({
history:createWebHashHistory('/')
})
4.4、通配符 * 被取消
//之前
{
path:'*',
component:()=>import("../components/NotFound.vue")
} //vue-router 4
{
path:'/:pathMatch(.*)*',
component:()=>import("../components/NotFound.vue")
}
//是一个正则表达式
4.5、isReady() 替代 onReady
//之前
router.onReady(onSuccess,onError)//成功和失败回调 //vue-router 4
router.isReady().then(()=>{
//成功
}).catch(err=>{
//失败
})
4.6、scrollBehavior 变化
const router = createRouter({
scrollBehavior(to, from, savedPosition) {
// 始终滚动到顶部
return { top: 0, left:0 }
},
})
//之前使用的{ x:0, y:0 } 替换成了 { top: 0, left:0 }
4.7、keep-alive 和 transition 必须用在 router-view 内部
//之前
<keep-alive>
<router-view />
</keep-alive> //vue-router 4
<router-view v-slot="{component}">
<keep-alive>
<component :is="component" />
</keep-alive>
</router-view>
4.8、router-link 移除了一部分属性
- 移除 append 属性
//之前
<router-link to="child" append >跳转<router-link> //vue-router 4
<router-link :to="append( $route.path , 'child' )" append >跳转<router-link>
- tag 被移除
//之前
<router-link to="/" tag="span">跳转</router-link> //vue-router 4
<router-link to="/" custom>
<span>跳转</span>
</router-link>
- event 被移除
4.9、route 的 parent 属性被移除
4.10、pathToRegexpOptions选项被移除,其他内容替换
4.11、routes选项是必填项
4.12、跳转不存在的命名路由报错
之前跳转到不存在的路由,页面是空的,会重定向根路径,这是不合理的,所以vue3报错了。
4.13、缺少必填参数会抛出异常
4.14、命名子路由如果 path 为空的时候,不再追加 /
之前生成的 url 会自动追加一个 / ,如:"/dash/"。副作用:给设置了 redirect 选项的子路由带来副作用。
vue-router 4 你真的熟练吗?的更多相关文章
- Vue 2.0 + Vue Router + Vuex
用 Vue.js 2.x 与相配套的 Vue Router.Vuex 搭建了一个最基本的后台管理系统的骨架. 当然先要安装 node.js(包括了 npm).vue-cli 项目结构如图所示: ass ...
- vue router 只需要这么几步
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- Vue.js 2.x笔记:路由Vue Router(6)
1. Vue Router简介与安装 1.1 Vue Router简介 Vue Router 是 Vue.js 官方的路由管理器.它和 Vue.js 的核心深度集成,构建单页面应用. Vue Rout ...
- Vue Router学习笔记
前端的路由:一个地址对应一个组件 Vue Router中文文档 一.路由基本使用 第1步:导入Vue Router: <script src="https://unpkg.com/vu ...
- vue router.push(),router.replace(),router.go()和router.replace后需要返回两次的问题
转载:https://www.cnblogs.com/lwwen/p/7245083.html https://blog.csdn.net/qq_15385627/article/details/83 ...
- 前端MVC Vue2学习总结(八)——Vue Router路由、Vuex状态管理、Element-UI
一.Vue Router路由 二.Vuex状态管理 三.Element-UI Element-UI是饿了么前端团队推出的一款基于Vue.js 2.0 的桌面端UI框架,手机端有对应框架是 Mint U ...
- 深入浅出的webpack4构建工具---webpack+vue+router 按需加载页面(十五)
1. 为什么需要按需加载? 对于vue单页应用来讲,我们常见的做法把页面上所有的代码都打包到一个bundle.js文件内,但是随着项目越来越大,文件越来越多的情况下,那么bundle.js文件也会越来 ...
- 深入浅出的webpack构建工具--webpack4+vue+router项目架构(十四)
阅读目录 一:vue-router是什么? 二:vue-router的实现原理 三:vue-router使用及代码配置 四:理解vue设置路由导航的两种方法. 五:理解动态路由和命名视图 六:理解嵌套 ...
- python 全栈开发,Day91(Vue实例的生命周期,组件间通信之中央事件总线bus,Vue Router,vue-cli 工具)
昨日内容回顾 0. 组件注意事项!!! data属性必须是一个函数! 1. 注册全局组件 Vue.component('组件名',{ template: `` }) var app = new Vue ...
- vue router 跳转到新的窗口方法
在CreateSendView2.vue 组件中的方法定义点击事件,vue router 跳转新的窗口通过采用如下的方法可以实现传递参数跳转相应的页面goEditor: function (index ...
随机推荐
- Docker系列(16)- 容器数据卷
什么是容器数据卷 docker的理念回顾 将应用和环境打包成一个镜像 数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!新增一个需求:数据可以持久化 MySQL,容器删了等于删库跑路!新增一个 ...
- LeetCode2-链表两数和
目录 LeetCode2-链表两数和 题目描述 示例提示 经验教训 参考正解 题目描述 示例提示 经验教训 链表题的判空条件不是万能的,有时候示例会极其复杂,根本难以通过判空来区分不同情况. /** ...
- AT4995-[AGC034E] Complete Compress【树形dp】
正题 题目链接:https://www.luogu.com.cn/problem/AT4995 题目大意 \(n\)个点的一棵树,上面有一些棋子,每次可以选择两个棋子移动到他们之间的路径上相邻的点上, ...
- 在windoes server2008部署kettle遇到的问题
本机电脑是windows10,在部署ketle时一切顺利,但在windows server2008服务器上部署,各种报错,毕竟线上环境比较复杂-- 问题一:启动kettle的spoon.bat文件时, ...
- 【C++ Primer Plus】编程练习答案——第12章
1 // chapter12_1_cow.h 2 3 4 #ifndef LEARN_CPP_CHAPTER12_1_COW_H 5 #define LEARN_CPP_CHAPTER12_1_COW ...
- div标签的理解
在HTML里面,div标签是一个块状元素,不会和其他元素排列在同一行,会默认和下面的元素换行,但是如果我们需要把几个div标签排在同一行,需要怎么做? 第一种:修改块状元素 源码: <div i ...
- 题解 [POI2013]SPA-Walk
题目传送门 题目大意 给出两个长度为 \(n\) 的 \(01\) 串,问是否可以通过某一位把 \(s\) 变为 \(t\),但是中途不能变为 \(k\) 个 \(01\) 串中任意一个,问是否可行. ...
- CF1092F Tree with Maximum Cost(dfs+dp)
果然我已经菜到被\(div3\)的题虐哭了 qwq 首先看到这个题,一个比较显然的想法就是先从1号点开始\(dfs\)一遍,然后通过一些奇怪的方式,再\(dfs\)一遍得到其他点的贡献. 那么具体应该 ...
- c语言中一条竖线是什么符号?
"|"在C语言中表示按位或,是双目运算符.其功能是参与运算的两数各对应的二进位(也就是最后一位)相或.只要对应的二个二进位有一个为1时,结果位就为1.参与运算的两个数均以补码出现. ...
- 请问:c语言中d=1/3*3.0;与d=1.0/3*3;d=?有什么区别
请问:c语言中d=1/33.0;与d=1.0/33;d=?有什么区别 d=1/33.0; 这时d=0,d=(1/3)3.0,这里1是整形,1/3也是整形,等于0,所以03.0=0 d=1.0/33; ...