VUE单页应用和路由实现

一、单页应用(SPA)

单页 Web 应用 (single-page application) 是一种特殊的 Web 应用,简单的说就是只有一张Web页面的应用。该页面在浏览器中运行的时候不会重新加载或跳转。
单页应用是利用 JavaScript 动态的变换HTML的内的元素的显示和隐藏,实现UI与用户的交互。

1.1 单页应用的优点:
  • SPA 可以提供较为流畅的用户体验: 没有页面之间的切换,就不会出现“白屏现象”,也不会出现假死并有“闪烁”现象。
  • 良好的前后端工作分离模式 :后端不再负责模板渲染、输出页面工作,后端API通用化,即同一套后端程序代码,不用修改就可以用于Web界面、手机、平板等多种客户端。
  • 减轻服务器压力 :服务器只用出数据就可以,不用管展示逻辑和页面合成
1.2 单页应用的缺点:
  • SEO难度较高 :由于所有的内容都在一个页面中动态替换显示,所以在SEO上其有着天然的弱势。
  • 前进、后退管理: 由于单页Web应用在一个页面中显示所有的内容,所以不能使用浏览器的前进后退功能
  • 初次加载耗时多 :为实现单页Web应用功能及显示效果,需要在加载页面的时候将JavaScript、CSS统一加载。
1.3 单页应用的实现原理:

实现单页应用,客户端路由有两种实现方式:基于hash 和基于html5 history api.

  1. window.history.pushState等触发popstate事件:window.history 对象包含浏览器的历史,history是实现SPA前端路由是一种主流方法,它有几个原始方法:
  • history.back() - 与在浏览器点击后退按钮相同
  • history.forward() - 与在浏览器中点击按钮向前相同
    history.go(n) - 接受一个整数作为参数,移动到该整数指定的页面,比如go(1)相当于forward(),go(-1)相当于back(),go(0)相当于刷新当前页面
  • 如果移动的位置超出了访问历史的边界,以上三个方法并不报错,而是静默失败
    HTML5中,history对象提出了 pushState() 方法和 replaceState() 方法,这两个方法可以用来向历史栈中添加数据,就好像 url 变化了一样(过去只有 url 变化历史栈才会变化),这样就可以很好的模拟浏览历史和前进后退了,现在的前端路由也是基于这个原理实现的。
  1. window.location.hash的变化触发hashchange事件:当点击导航时,通过哈希监听事件,如果哈希发生了变化,则改变哈希值:window.location.hash,来调用相应的js文件

二、理解路由

传统的页面应用,是用一些超链接来实现页面切换和跳转的。而vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。

路由中有三个基本的概念 routes, route, router。

  1. routes 是一组路由,把上面的每一条路由组合起来,形成一个数组。
  2. route,它是一条路由,由这个英文单词也可以看出来,它是单数
  3. router 是一个机制,相当于一个管理者,它来管理路由。因为routes 只是定义了一组路由,它放在哪里是静止的,当真正来了请求,怎么办? 就是当用户点击home 按钮的时候,怎么办?这时router 就起作用了,它到routes 中去查找,去找到对应的 home 内容,所以页面中就显示了 home 内容。
  4. 客户端中的路由,实际上就是dom 元素的显示和隐藏。当页面中显示home 内容的时候,about 中的内容全部隐藏,反之也是一样。

三、vue-router中的路由

vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用。vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。

  1. 页面实现(html模版中)
    在vue-router中, 定义了两个标签 和来对应点击和显示部分。 就是定义页面中点击的部分, 定义显示部分,就是点击后,区配的内容显示在什么地方。所以 还有一个非常重要的属性 to,定义点击之后,要到哪里去, 如:Home

  2. js 中配置路由
    首先要定义route, 一条路由的实现。它是一个对象,由两个部分组成: path和component. path 指路径,component 指的是组件。如:{path:’/home’, component: home}

我们这里有两条路由,组成一个routes:

const routes = [
  { path: '/home', component: Home },
  { path: '/about', component: About }
]

最后创建router 对路由进行管理,它是由构造函数 new vueRouter() 创建,接受routes 参数。

const router = new VueRouter({
      routes // routes: routes 的简写
})

配置完成后,把router 实例注入到 vue 根实例中,就可以使用路由了

const app = new Vue({
  router
}).$mount('#app')

执行过程:当用户点击 router-link 标签时,会去寻找它的 to 属性, 它的 to 属性和 js 中配置的路径{ path: ‘/home’, component: Home} path 一一对应,从而找到了匹配的组件, 最后把组件渲染到 标签所在的地方。所有的这些实现才是基于hash 实现的。

猜你喜欢

转载自blog.csdn.net/dreamingbaobei3/article/details/88971960