前端路由是如何做到URL和内容进行映射呢?监听URL的改变。
URL的hash也就是锚点(#), 本质上是改变window.location的href属性;
我们可以通过直接赋值location.hash来改变href, 但是页面不发生刷新;
hash的优势就是兼容性更好,在老版IE中都可以运行,但是缺陷是有一个#,显得不像一个真实的路径。
Vue Router 是 Vue.js 的官方路由。它与 Vue.js 核心深度集成,让用 Vue.js 构建单页应用变得非常容易。
vue-router是基于路由和组件的
npm install vue-router@4
我们这里还有一个不太好的实现:
渲染首页的内容;如何可以让路径默认跳到到首页, 并且
渲染首页组件呢?
我们在routes中又配置了一个映射:
当打包构建应用时,JavaScript 包会变得非常大,影响页面加载:
其实这里还是我们前面讲到过的webpack的分包知识,而Vue Router默认就支持动态来导入组件:
其实webpack从3.x开始支持对分包进行命名(chunk name):
const routes = [
{
path: '/',
redirect: '/home'
},
{
path: '/home',
component: () => import(/* webpackChunkName: "home-chunk" */'../pages/Home')
},
{
path: '/about',
component: () => import(/* webpackChunkName: "about-chunk" */'../pages/About')
}
]
name属性:路由记录独一无二的名称;
meta属性:自定义的数据
很多时候我们需要将给定匹配模式的路由映射到同一个组件:
那么在User中如何获取到对应的值呢?
$route.params
获取值;this.$route.params
获取值;对于哪些没有匹配到的路由,我们通常会匹配到固定的某个页面
注意:我在/:pathMatch(.*)后面又加了一个 *;
它们的区别在于解析的时候,是否解析 /:
什么是路由的嵌套呢?
<template>
<div id="app">
<p>
<router-link to="/home">home</router-link>
<router-link to="/about">about</router-link>
<router-link to="/user/zep">user</router-link>
</p>
<div>
<button @click="jumpToAbout">关于</button>
<button @click="forwardOneStep">前进一步</button>
</div>
<router-view></router-view>
</div>
</template>
<script>
import {useRouter} from "vue-router";
export default {
name: 'App',
// methods: {
// jumpToAbout() {
// this.$router.push('/about')
// }
// }
setup() {
const router = useRouter()
const jumpToAbout = () => {
// router.push('/about')
router.push({
path: '/about',
query: {
name: 'zep',
age: 22
}
})
}
const forwardOneStep = () => {
router.go(1)
}
return {
jumpToAbout,
forwardOneStep
}
}
}
</script>
<style scoped>
.router-link-active {
color: red;
}
</style>
使用push的特点是压入一个新的页面,那么在用户点击返回时,上一个页面还可以回退,但是如果我们希望当前页面是一个替换操作,那么可以使用replace:
在vue-router3.x的时候,router-link有一个tag属性,可以决定router-link到底渲染成什么元素
v-slot如何使用呢?
首先,我们需要使用custom表示我们整个元素要自定义
其次,我们使用v-slot来作用域插槽来获取内部传给我们的值:
router-view也提供给我们一个插槽,可以用于
和
组件来包裹你的路由组件:
某些情况下我们可能需要动态的来添加路由:
如果我们是为route添加一个children路由,那么可以传入对应的name:
删除路由有以下三种方式:
路由的其他方法补充:
vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。
全局的前置守卫beforeEach是在导航触发时会被回调的:
它有两个参数:
它有返回值:
可选的第三个参数:next