Tips:路由的原理就是通过url的改变, 将相应的内容放在容器里面
点击实现页面跳转切换, 但是这和以前的页面跳转不一样, 以前是多个.html之间切换, 现在之后一个html文件, 所以我们只能进行页面中部分内筒切换(单页面引用)。动态组件每次点击url不会改变, 不考虑这种方法实现。路由每次点击页面时url会改变, 根据url的不同在页面上显示不同的内容。
<p>
<a href="#hot">热映a> | <a href="#cinema">影院a> |
<a href="#wait">待映a> |
<a href="#classic">经典电影a>
p>
<div id="box">div>
const routes = [
{
path: "hot",
template: "这是热映页面",
},
{
path: "cinema",
template: "这是影院页面",
},
{
path: "wait",
template: "这是待映页面",
},
{
path: "classic",
template: "这是经典电影页面",
},
];
window.addEventListener("hashchange", () => {
// console.log("hash改变了");
const hash = location.hash.slice(1);
routes.forEach((item) => {
if (item.path === hash) {
document.querySelector("#box").innerHTML = item.template;
}
});
});
上述代码可见原生实现路由很麻烦, 所以vue官方提供了一个路由库Vue Router
官网路由https://router.vuejs.org/zh/introduction.html
路由不在脚手架安装也可以直接使用
可以直接使用cdn的方式引入路由
这里的vue3是通过CDN方式引入, 由于地址在国外可能会比较慢, 可以将代码复制到本地去引入, 注意这个网站有的cdn使用不了(可以往下找使用旧一点版本)
注意这里的vue3的使用的router4版本, 而vue2使用的是router3版本
Tips:
BootCDN极兔云官网https://www.bootcdn.cn/这个网站里面有大量的国内镜像资源, cdn是内容分发网络, 可以进入网站直接复制链接浏览器打开将源码复制下来在本地使用, 和vue的本地引入是一样的道理
HTML部分
<script src="https://unpkg.com/vue@3">script>
<script src="https://unpkg.com/vue-router@4">script>
<div id="app">
<h1>Hello App!h1>
<p>
<router-link to="/">Go to Homerouter-link>
<router-link to="/about">Go to Aboutrouter-link>
p>
<router-view>router-view>
div>
href
属性的
标签,to属性用来指定链接JavaScript部分
// 1. 定义路由组件.
// 也可以从其他文件导入
const Home = { template: 'Home' }
const About = { template: 'About' }
// 2. 定义一些路由
// 每个路由都需要映射到一个组件。
// 我们后面再讨论嵌套路由。
const routes = [
{ path: '/', component: Home },
{ path: '/about', component: About },
]
// 3. 创建路由实例并传递 `routes` 配置
// 你可以在这里输入更多的配置,但我们在这里
// 暂时保持简单
const router = VueRouter.createRouter({
// 4. 内部提供了 history 模式的实现。为了简单起见,我们在这里使用 hash 模式。
history: VueRouter.createWebHashHistory(),
routes, // `routes: routes` 的缩写
})
// 5. 创建并挂载根实例
const app = Vue.createApp({})
//确保 _use_ 路由实例使
//整个应用支持路由。
app.use(router)
app.mount('#app')
// 现在,应用已经启动了!
路由流程梳理:
在App里面加router-link和router-view标签,创建组件,这里的组件不再引入App.vue里面,而是引到路由表里面,通过每一个path去对应每一个组件。当我们点击router-link的时候路由就发生改变了,然后就会去路由表里面找对映的是哪个path,找到对应的path就去找对应的组件,将对应的组件放入router-view里面。
当我们做一个详情页面时(以猫眼电影为例子), 是根据详情页面的id去请求数据, 然后再渲染出来。
首先我们要知道如何获取到id。这是猫眼电影详情页的地址,可以看到地址栏url上有详情页的id,我们将这个id获取到,再拿这个 id做数据请求。
注意vue的路由默认是精准匹配,意思是说如果地址/后面还有东西就不能匹配到了。这里我们新建一个详情页path: “/detail/:id”,详情地址后面加上一个:id表示就是动态路由。这样我们在地址栏上写上其他东西页面也可以出来。
const router = createRouter({
history: createWebHashHistory(import.meta.env.BASE_URL),
// 精准匹配
routes: [
{
path:"/",
redirect:'/host'
},
{
path: "/host",
component: host,
},
{
path: "/detail/:id",
component: detail,
},
],
});
获取动态路由参数, 通过this.$route.params.id获取动态路由, 这里的params.id就是路由表中的 :id
export default {
created() {
console.log(this.$route);
this.id = this.$route.params.id;
},
watch: {
$route(val, oldVal) {
this.id = val.params.id;
},
},
};
这里的this. r o u t e 是一个对象 , 打印出来如下 , 可以看到对象里面有当前路径还有参数 i d , 我们把 t h i s . route是一个对象, 打印出来如下, 可以看到对象里面有当前路径还有参数id, 我们把this. route是一个对象,打印出来如下,可以看到对象里面有当前路径还有参数id,我们把this.route称之为当前页面的路由信息
Tips:这里我们添加了一个详情页2导航, 但我们在同一个路由不同参数的情况下跳转(也就是详情页跳转详情页), 这时候就无法监听到路由的改变触发相应的事件(created没有执行), 所以再次切换则不会打印。我们的需求还是一样只要地址改变就要做数据请求, 然后重新渲染。
<router-link to="/detail/23425">详情页|router-link>
<router-link to="/detail/222222">详情页2|router-link>
<template>
<h2>详情-{{ $route.params.id }}</h2>
</template>
<script>
export default {
data() {
return {
id: 0,
};
},
created() {
// fetch()
console.log(this.$route);
this.id = this.$route.params.id;
},
watch: {
$route(val, oldVal) {
// console.log(val);
// console.log(oldVal);
this.id = val.params.id;
},
},
};
</script>
routes: [
{
path: "/host",
component: host,
children: [
{
path: "/host/today",
component: today,
},
{
path: "/host/yesterday",
component: yesterday,
},
],
},
]
Tips: 编程式导航可以用于一个导航下一级组件跳转到另一个导航下
<template>
<h2>影院</h2>
<button @click="pump">跳转到待映</button>
</template>
<script>
export default {
methods: {
pump() {
this.$router.push("/wait");
// this.$router.push({ path: "/wait" });
},
},
};
</script>
replace方法是特换当前的历史记录, 后退时会跳过当前页面, 这是它与push的不同之处, 一般在登录页, 登录成功后点击历史回退时使用达到跳转首页效果
<script>
export default {
methods: {
pump() {
this.$router.replace("/wait");
},
},
};
</script>
go方法是用于前进或者后退, 里面写整数
export default {
methods: {
pump() {
this.$router.go("-1");
},
},
};
</script>
在路由表中加上name属性,作用就是在做编程式导航或者router-link的时候后面可以使用对象。
正常来说一个url对应一个组件,当一个url对应两个组件时, 我们将命名路由component改成components,在页面里面需要给router-view添加name属性。
{
path: "/wait",
// component:wait
components: {
a: wait,
b: wait2,
},
},
路由重定向指的是:用户在访问地址 A 的时候,强制用户跳转到地址 C ,从而展示特定的组件页面;通过路由规则的 redirect 属性,指定一个新的路由地址,可以很方便地设置路由的重定向
routes: [
{
path: "/",
redirect: "/host",
},
{
path: "/host",
component: host,
children: [
{
path: "/host",
redirect: "/host/today",
},
]
}
]
alias表示别名,给路由导航添加两个名字,可以通过别面跳转页面。
{
path: "/classic",
component: classic,
alias: "/jindian",
},