SPA模式和前端路由

  • 一、SPA模式介绍
  • 二、前端路由工作原理
  • 三、配置前端路由
  • 三、路由的其他使用方式
  • 四、动态路由与参数说明
  • 五、导航卫士

一、SPA模式介绍

    SPA(single page web application),SPA 是一种特殊的 Web 应用,是加载单个 HTML 页面并在用户与应用程序交互时动态更新该页面的。它将所有的活动局限于一个 Web 页面中,仅在该 Web 页面初始化时加载相应的 HTML 、 JavaScript 、 CSS 。一旦页面加载完成, SPA 不会因为用户的操作而进行页面的重新加载或跳转,而是利用 JavaScript 动态的变换 HTML(采用的是 div 切换显示和隐藏),从而实现UI与用户的交互。如今SPA的应用逐渐显著,像Vue和react都是采用这种模式。

二、前端路由工作原理

(1)用户点击页面中的路由连接;
(2)导致URL地址栏中的Hash值发生了改变;
(3)前端路由监听到了Hash地址的变化;
(4)前端路由将当前Hash地址渲染到浏览器中。
    数据模拟测试(利用锚点实现修改导航栏路由):

通过window对象我们能够绑定监听到hash地址的变化,hash地址是网站初始url后边的内容,可以通过location来获取到。

三、配置前端路由

    Vue.js拥有自己的处理单页面的前端路由环境,因此没必要使用最原生的监听hash变化切换路由。路由的配置方式如下:

npm i vue-router@3.5.2 -S

在根目录下创建route文件,并在目录下新建一个index.js,在其中构建路由的初始化配置:

// 导入路由模块
import Vue from 'vue'
import VueRouter from 'vue-router'// 挂载路由模块
Vue.use(VueRouter)// 创建路由实例对象
const router = new VueRouter()// 向外导出路由模块
export default router

初始化完成之后,需要在main.js中引入路由模块,这样才能够在代码中使用路由,使用方式如下:
引入路由模块:

import routeObj from '@/route/index.js'
//import routeObj from '@/route'
//如果导入的模块是文件,那么将会默认导入文件下面的index.js文件

同时需要在构建vue实例的时候增加route模块:

new Vue({render: h => h(App),router: routeObj//引入路由模块,注意这里的名字叫做router
}).$mount('#app')

在前端路由中,路由通过组件名称引入对应的页面,每一个组件对应一个具体页面,使用方法如下:
(1)首先引入组件:

import Home from '@/components/home.vue'
import Movie from '@/components/movie.vue'
import About from '@/components/about.vue'

(2)构建路由的绑定关系:

 routes: [{path: '/home', component: Home},{path: '/movie', component: Movie},{path: '/about', component: About}]

在页面中使用路由:

 <router-link to="/home">首页</router-link><router-link to="/movie">电影</router-link><router-link to="/about">关于</router-link><!--占位符,之后存放实际路由组件的具体内容--><router-view></router-view>

说明:这里实现的功能是,router-link相当于a连接,可以用来切换页面。切后的页面内容将出现在占位符中。

三、路由的其他使用方式

(1)路由的默认配置:

{path: '/', component: Home},

(2)路由的重定向:
    使用方法比较简单:

 {path: '/', redirect: '/about'},

补充说明:vue的路由和thinkPHP类似,默认匹配最近路由,换句话说,如果当前路由规则有多条,默认匹配最开始的那条。
(3)嵌套路由:
这里的嵌套路由指的是路由对应的组件页面中,本身还包含有相对应的路由规则,使用方法如下(以在首页中配置默认路由为例):

 <div class="home-container">首页<router-link to="/tab1">tab1</router-link><router-link to="/tab2">tab2</router-link><!--占位符,之后存放实际路由组件的具体内容--><router-view></router-view></div>

对应的router/index.js文件里面的路由配置:

{path: '/home',component: Home,redirect:'/home/tab1',//和第一行的子路由配置一个意思children: [{ path: '/', component: Tab1 },{ path: '/home/tab1', component: Tab1, alias:'/nightowl' },//alias为路由设置别名{ path: '/home/tab2', component: Tab2 }]},

四、动态路由与参数说明

(1)动态路由:
在thinkPHP中也测出现过如下路由匹配规则:

http://localhost/index.php?student/show/:id

用来获取学生信息,动态传递学生的id信息。在Vue的路由规则中,同样支持使用这样的动态路由规则,因为如同上面提到的电影组件,我们可能存在很多部电影,但我们不可能不去复用电影模本,这是我们也可以参照这种后端写法,获取电影的id信息,动态渲染到页面中,使用方法如下:

{path: '/movie',component: Movie,children: [//如下写法显然尴尬//{ path: '/1', component: Movie}//{ path: '/2', component: Movie}///...{ path: '/:id', component: Movie, props: true }//props是用来开启参数的可视化,默认为false]},

在组件中获取参数:

开启props之后可以利用$route.params获取到绑定的动态路由。
(2)path与fullPath:
    可以看出,这里的路由有很多参数,比如说比较清晰的pathfullPath,但是总觉得这两个应该是不同的参数,fullPath按照语义应该更长。fullPath其实用在有个get请求的环境下更好理解:

结论fullPath=path+query,但是注意一点,query类似于cookie的键值对方式处理,不存在类型鉴别,实际可能需要手动将num转为整型。
(3)重定向的高级用法:

  redirect: (params) => {console.log('输出param参数:', params)return '/home/tab2'},

redirect可以写成函数形式,但是获取到的参数params其实就是this.$route里面的内容,对于redirect而言,这里使用的其实是只读参数。修改的话会提示read only报错,利用return可以返回重定向之后的路径。

五、导航卫士

    跳转卫士其实挺容易理解的,利用beforeEach向router上面挂载导航卫士,挂载的导航卫士里面包含一个闭包函数(to,before,next)=>{},其中第一参数表示跳转的目的路由信息,from表示的是当前路由信息,next是一个回调函数,类似于promise里面的resolve()函数,使用举例如下:

router.beforeEach((to, from, next) => {console.log('输出before,from参数', to, from)if (to.path === '/home' || to.path === '/movie') {next()} else {console.log('当前路由无法匹配')next('/home')//没有匹配默认跳回去}
})

限制跳转到home与movie组件。

Vue学习杂记(八)——SPA模式和前端路由相关推荐

  1. history 改成 模式_前端路由三种模式

    hash:任何情况下都可以做前端路由,缺点是SEO不友好(服务器收不到hash,浏览器是不会把#后面的内容发给服务器) history模式:后端将所有前端路由都渲染到同一个页面(不能是404页面),缺 ...

  2. 少侠请重新来过 - Vue学习笔记(八) - Vuex

    Vuex 是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. State Vuex ...

  3. vue学习(八)vue2.0路由vue-router的简单入门使用

    vue-router官网中文文档:Vue Router Vue Router 是 Vue.js 官方的路由管理器.它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌.路由实际上就是可以理 ...

  4. Vue学习笔记(八) 组件进阶

    1.插槽 (1)插槽内容 像 HTML 元素一样,我们常常需要给组件传递内容 比如在下面的例子中,我们给自定义组件 prompt-info 传入 出错啦 的文本 <!DOCTYPE html&g ...

  5. vue学习十八(axios)

    文章目录 安装 get方法 post方法 批量请求 后端代码 安装 通过npm install axios安装 或者直接用cdn <script src="https://unpkg. ...

  6. vue学习笔记 element-plus/icons-vue el-menu动态菜单(路由)

    安装icon npm install @element-plus/icons-vue 当前版本 "dependencies": {"@element-plus/icons ...

  7. Vue + Spring Boot 项目实战(七):前端路由与登录拦截器

    文章目录 前言 一.前端路由 二.使用 History 模式 三.后端登录拦截器 3.1. LoginController 3.2. LoginInterceptor 3.3. WebConfigur ...

  8. vue拦截器刷新登陆页面_Vue + Spring Boot 项目实战(六):前端路由与登录拦截器-Go语言中文社区...

    前言 这一篇主要讲前端路由与登录拦截器的实现.放在一起讲是因为我在开发登录拦截器时因为这个路由的问题遇到了很多坑,花费了很长时间,网上的解决方案都不怎么靠谱,综合了好几种办法才最终成功,其实关于这个部 ...

  9. VUE学习(二十)、插槽

    VUE学习(二十).插槽 一.默认插槽 1.Category.vue <template><div class="category"><h3>{ ...

最新文章

  1. 串口屏与6050_MPU6050温度值的读取与转换及串口通信,请指导
  2. matlab正弦序列频谱,【求助】正弦信号序列fft频谱分析!!!
  3. 3.2 python实战_线性回归的梯度下降法
  4. spring的aop注解配置(了解)
  5. 基于java的银行ATM系统设计(含源文件)
  6. 编程语言对比 引用数据类型-列表
  7. 任正非卸任上海华为董事;百度“云手机”今日线上发布;Inkscape 1.0 RC 版发布 | 极客头条...
  8. ImportError : No module named graphics
  9. Spring之AntPathMatcher
  10. 针式PKM V5.78
  11. 冰点还原精灵和惠普增霸卡安装软件的方法
  12. 电脑屏幕保护插件-Fliqlo
  13. java 英文翻译工具类
  14. Matlab如何在一个窗口绘制多张子图
  15. 阿里云天池大赛赛题解析——深度学习篇
  16. BackTrack5完全配置
  17. html居中小圆点点怎么打出来,目录的点怎么打 WORD目录里的点点怎么打
  18. python培训学校-上海python培训学校
  19. 作为一个自动化本科生到底应该学些什么(讲讲个人经历和感受)
  20. 今天动手打了女儿,但是她的行为却让我即感动又惭愧

热门文章

  1. 2018上海区块链国际周倒计时,汇聚全球意见领袖的技术盛会
  2. 解决git: 'subtree' is not a git command. See 'git --help'.
  3. 【Web技术】985- 当聊到前端性能优化时,我们会关注什么?
  4. html如何使表单在页面居中显示,html怎样将表单居中
  5. 基于NABCD评论作品,及改进建议
  6. Visual Studio2022 运行代码时“发生生成错误,是否继续并运行上次的成功生成”
  7. 传奇黑客成『吹哨人』,推特麻烦了;谷歌20+技术学习路线;Python数据科学电子书;游戏智能体开发平台;前沿论文 | ShowMeAI资讯日报
  8. 【问题解决】xlwings处理excel复制粘贴时数字自动变成科学计数法
  9. DICOM标准中关于C-Find,运用StudyTime进行查找时无法查找到数据的问题
  10. (转)JAVA 十六个常用工具类