单页应用程序&路由
单页应用程序 SPA-Single Page Application
开发分类 |
实现方式 |
页面性能 |
开发效率 |
用户体验 |
学习成本 |
首屏加载 |
SEO |
单页 |
一个 html 页面 |
按需更新性能高 |
高 |
非常好 |
高 |
慢 |
差 |
多页 |
多个 html 页面 |
整页更新性能低 |
中等 |
一般 |
中等 |
快 |
优 |
单页面应用:系统类网站/内部网站/文档类网站/移动端站点
多页面应用:公司官网/电商类网站
路由
单页应用程序开发效率高,性能好,用户体验好,最大的原因就是:页面按需更新
要按需更新,首先就需要明确:访问路径和组件的对应关系,就需要用到路由
生活中的路由:设备和 ip 的映射关系
Vue 中的路由:路径和组件的映射关系
首页 http://localhost:8080/#/home
评论 http://localhost:8080/#/comment
搜索 http://localhost:8080/#/search
不同的路径对应着不同的组件
根据路由就能知道不同路径应该匹配渲染哪个组件
VueRouter 插件
作用:修改地址栏路径时,切换显示匹配的组件
说明:Vue
官方的一个路由插件,是一个第三方包
官网:https://v3.router.vuejs.org/zh/
VueRouter 的使用(5+2 步)
以我的音乐应用为例
效果如下:
发现音乐组件 Find.vue:
我的音乐组件 My.vue:
朋友组件 Friend.vue:
5 个基础步骤(固定)
- 下载:下载
VueRouter
模块到当前工程,版本 3.6.5(vue2 对应的 VueRouter 版本)
1
| npm add vue-router@3.6.5
|
- 引入
在main.js
中引入
1
| import VueRouter from 'vue-router';
|
- 安装注册
- 创建路由对象
1
| const router = new VueRouter();
|
- 注入,江路有对象注入到
new Vue
实例中,建立关联
1 2 3 4
| new Vue({ render: h => h(App), router, }).$mount('#app');
|
2 个核心步骤
- 创建需要的组件(views 目录),配置路由规则
组件:Find.vue
、My.vue
、Friend.vue
路由规则:
1 2 3 4 5 6 7 8 9 10 11
| import Find from './views/Find.vue'; import My from './views/My.vue'; import Friend from './views/Friend.vue'; const router = new VueRouter({ routes: [ { path: '/find', component: Find }, { path: '/my', component: My }, { path: '/Friend', component: Friend }, ], });
|
引入时可能报错,命名规范要求组件名由多个单词组成
这里是一个单词的组件名,在各个组件配置中添加 name 即可
如:
My.vue:
1 2 3
| export default { name: 'MyMusic', };
|
- 配置导航,配置路由出口(路径匹配的组件显示的位置)
1 2 3 4 5 6 7 8 9
| <div class="footer_wrap"> <a href="#/find">发现音乐</a> <a href="#/my">我的音乐</a> <a href="#/friend">朋友</a> </div> <div class="top"> <router-view></router-view> </div>
|
组件存放目录问题
注意:.vue
文件本质上无区别
路由相关的组件,放在views
目录下是为了组件分类
组件分类:.vue 文件分 2 类(页面组件&复用组件)
src/views
文件夹
src/components
文件夹
分类开来更易维护
完整代码:
App.vue:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| <template> <div> <div class="footer_wrap"> <a href="#/find">发现音乐</a> <a href="#/my">我的音乐</a> <a href="#/friend">朋友</a> </div> <div class="top"> <router-view></router-view> </div> </div> </template>
<script> export default {}; </script>
<style> body { margin: 0; padding: 0; } .footer_wrap { position: relative; left: 0; top: 0; display: flex; width: 100%; text-align: center; background-color: #333; color: #ccc; } .footer_wrap a { flex: 1; text-decoration: none; padding: 20px 0; line-height: 20px; background-color: #333; color: #ccc; border: 1px solid black; } .footer_wrap a:hover { background-color: #555; } </style>
|
main.js:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| import Vue from 'vue'; import App from './App.vue';
import VueRouter from 'vue-router'; import Find from './views/Find.vue'; import My from './views/My.vue'; import Friend from './views/Friend.vue';
Vue.use(VueRouter);
const router = new VueRouter({ routes: [ { path: '/find', component: Find }, { path: '/my', component: My }, { path: '/friend', component: Friend }, ], });
Vue.config.productionTip = false;
new Vue({ render: h => h(App), router: router, }).$mount('#app');
|
Find.vue/My.vue/Friend.vue:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <template> <div> <p>发现音乐</p> </div> </template> <script> export default { name: 'FindMusic', }; </script> <style lang="less" scoped></style>
|