这篇文章主要介绍了小程序单页面应用特征是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。
单页面应用特征
"假设:“在一个web页面中,有1个按钮,点击可跳转到站内其他页面。
“多页面应用:“点击按钮,会从新加载一个html资源,刷新整个页面;
“单页面应用:“点击按钮,没有新的html请求,只发生局部刷新,能营造出一种接近原生的体验,如丝般顺滑。
水疗单页面应用为什么可以几乎无刷新呢?因为它的SP -单页。在第一次进入应用时,即返回了唯一的html页面和它的公共静态资源,后续的所谓“跳”转,都不再从服务端拿html文件,只是DOM的替换操作,是模(jia)拟(壮族)的。
那么js又是怎么捕捉到组件切换的时机,并且无刷新变更浏览器url呢?靠哈希和HTML5History。
哈希路由
<强>特征强>
- <李>
类似www.xiaoming.html酒吧就是哈希路由,当#后面的哈希值发生变化时,不会向服务器请求数据,可以通过hashchange事件来监听到url的变化,从而进行DOM操作来模拟页面跳转
李> <李>不需要服务端配合
李> <李>对SEO不友好
李>原理
哈希
<强> HTML5History路由强>
<强>特征强>
- <李>
历史模式是HTML5新推出的功能,比之哈希路由的方式直观,长成类似这个样子www.xiaoming.html酒吧,模拟页面跳转是通过历史。pushState(国家、标题、url)来更新浏览器路由,路由变化时监听popstate事件来操作DOM
李> <李>需要后端配合,进行重定向
李> <李>对SEO相对友好
李> <李>
<强>原理强>
<强> HTML5History 强>
vue-router源码解读
以Vue的路由vue-router为例,我们一起来撸一把它的源码。
提示:因为,本篇的重点在于讲解单页面路由的两种模式,所以,下面只列举了一些关键代码,主要讲解:
- <李>
注册插件
李> <李>VueRouter的构造函数,区分路由模式
李> <李>全局注册组件
李> <李>散列/HTML5History模式的推动和监听方法
李> <李> transitionTo方法
<强>注册插件强>
首先,作为一个插件,要有暴露一个安装方法的自觉,给Vue爸爸去使用。
源码的安装。js文件中,定义了注册安装插件的方法安装,给每个组件的钩子函数混入方法,并在beforeCreate钩子执行时初始化路由:
Vue.mixin ({ ,beforeCreate (), { ,if (isDef(这一点。options.router美元)),{ this._routerRoot =,这 this._router =,这。options.router美元 ,this._router.init(这) ,Vue.util.defineReactive(这,& # 39;_route& # 39;,, this._router.history.current) ,}else { ,this._routerRoot =,(这一点。parent 美元;,,,这个。parent._routerRoot美元),| |, ,} ,registerInstance (,,) }, ,//全文中以…来表示省略的方法 ,…… });
<强>区分模式强>
然后,我们从索引。js找到整个插件的基类VueRouter,不难看出,它是在构造函数中,根据不同模式采用不同路由实例的。
… import {安装},得到& # 39;。/安装# 39;; import {HashHistory},得到& # 39;。/历史/散列# 39;; import {HTML5History},得到& # 39;。/历史/html5 # 39;; … export default  class VueRouter  { ,static 安装:(),=祝辞,无效; ,constructor (选项:,RouterOptions =, {}), { ,if (this.fallback), {=,mode & # 39;散列# 39; ,} ,if (! inBrowser), {=,mode & # 39;抽象# 39; ,}=,this.mode 模式 ,, ,switch (模式),{ ,case & # 39;历史# 39;:=,,this.history  new HTML5History(这个,,options.base) ,打破 ,case & # 39;散列# 39;:=,,this.history  new HashHistory (options.base,这一点,还以为;this.fallback) ,打破 ,case & # 39;抽象# 39;:=,,this.history  new AbstractHistory(这个,,options.base) ,打破 ,默认值: ,if (process.env.NODE_ENV !==, & # 39;生产# 39;),{ ,断言(假,,”模式:invalid ${模式}') ,} ,} ,} }小程序单页面应用特征是什么