Vue 路由
认识前端路由
- 路由其实是网络工程中的一个术语
- 在架构一个网络时,非常重要的两个设备就是路由器和交换机
- 路由器主要维护的是一个映射表,映射表会决定数据的流向
- 路由的概念在软件工程中出现,最早是在后端路由中实现的
路由的发展历程
后端路由阶段
- 早期的网站开发,整个 HTML 页面是由服务器来渲染
- 服务器生成渲染好对应的 HTML 页面,返回给客户端
- 浏览器接收到服务器响应后,开始从上往下解析整个 HTML 文档
- 后端路由的处理流程
- 访问页面时,每个页面的
URL会发送给服务器 - 服务器会通过正则对该 URL 进行匹配,最后交给一个
Controller进行处理 - 处理完成后,最终生成 HTML 或数据,返回给客户端
- 访问页面时,每个页面的
- 后端路由的优点
- 请求不同的路径时,交给服务器来进行处理,服务器渲染好整个页面
- 对于客户端,不需要单独加载任何的 Js 和 CSS,直接交给浏览器展示,也有利于 SEO 优化
- 后端路由的缺点
- 整个页面的模块由后端人员来编写和维护
- 通常情况下 HTML 代码和数据以及对应的逻辑会混在一起 ,不利于编写和维护
前后端分离阶段
- 随着
Ajax的出现,有了前后端分离的开发模式 - 后端只提供 API 来返回数据,前端通过 Ajax 获取数据,通过 JavaScript 将数据渲染到页面中
- 后端专注于数据处理上,前端专注于交互和可视化上
单页面富应用阶段
-
前端框架的发展带来了单页面富应用(SPA)
-
SPA 最主要的特点就是在前后端分离的基础上,加了一层前端路由
-
前端来维护一套路由映射,不同的
URL来匹配不同的组件
前端路由的两种模式
hash 模式
-
URL 的 hash 也就是锚点
#,本质上是改变window.location的href属性- 直接赋值
location.hash,页面不会发生刷新 - 监听
hashchange事件,不同的hash渲染不同的内容
<a href="#home">Home</a>
<a href="#login">Login</a>
<div id="router-view"></div>
<script>
const routerView = document.querySelector('#router-view');
window.addEventListener('hashchange', () => {
console.log('location', location.hash)
switch(location.hash) {
case '#home':
routerView.textContent = 'Home';
break;
case '#login':
routerView.textContent = 'Login';
break
default:
routerView.textContent = 'default';
}
});
</script> - 直接赋值
-
hash模式的优缺点- 优点:浏览器兼容性好
- 缺点:路径上多了
#,不像一个真实的路径
history 模式
-
history接口是 HTML5 新增的,通过匹配location.pathname来渲染不同内容 -
跳转方法
replaceState():替换原来的路径,不会产生历史记录pushState():使用新的路径popState():路径的回退go():向前或向后改变路径forward:向前改变路径back:向后改变路径
<a href="/home">Home</a>
<a href="/login">Login</a>
<div id="router-view"></div>
<script>
const routerView = document.querySelector('#router-view');
const aTagList = document.querySelectorAll('a');
function historyChange() {
switch (location.pathname) {
case '/home':
routerView.textContent = 'Home';
break;
case '/login':
routerView.textContent = 'Login';
break;
default:
routerView.textContent = 'default';
}
}
aTagList.forEach(a => {
const href = a.getAttribute('href');
a.addEventListener('click', (e) => {
e.preventDefault();
history.pushState({}, '', href);
historyChange();
});
});
window.addEventListener('popstate', historyChange);
</script>
认识 Vue Router
- Vue Router 是 Vue.js 的官方路由,与 Vue.js 核心深度集成
- Vue Router 是基于路由和组件的
- 路由用于设定访问路径 , 将路径和组件映射起来
- 在单页面应用中 , 页面的路径的改变就是组件的切换
注册路由
-
安装路由
npm i vue-router -
创建路由映射表
import Test from '../components/Test.vue';
import Demo from '../components/Demo.vue';
const routes = [
{ path: '/test', component: Test },
{ path: '/demo', component: Demo }
]; -
创建路由对象
import { createRouter, createWebHistory, createWebHashHistory } from 'vue-router';
import Test from '../components/Test.vue';
import Demo from '../components/Demo.vue';
const routes = [
{ path: '/test', component: Test },
{ path: '/demo', component: Demo }
];
const router = createRouter({
routes,
/**
* 使用 createWebHistory 创建的是 history 模式的路由
* 使用 createWebHashHistory 创建的是 hash 模式的路由
*/
history: createWebHistory()
});
export default router; -
全局注册
import { createApp } from 'vue';
import router from './router';
createApp(App).use(router).mount('#app'); -
在需要渲染路由组件的地方使用
<RouterView>组件进行占位
路由内置组件
RouterLink
-
用来渲染一个链接的组件,该链接在被点击时会触发导航
-
配置属性
to:导航目标,一个字符串或配置对象replace:导航时使用router.replace()进行跳转active-class:设置激活 a 元素后应用的class
<RouterLink to="/users/1" active-class="router-active" />
<RouterLink :to="{ path: '/home', replace: true }" />
RouterView
用于显示用户当前所处路由的组件,相当于一个占位符
<RouterView />