单页应用和多页应用
银商智能终端小程序使用Vue.js来进行前端应用开发。Vue.js最初是为Web平台设计的,小程序却是Android的原生应用,因此在应用开发模式上,银商小程序的开发与Vue传统的Web开发略有不同。 在页面的跳转方面,主要体现的就在单页应用(SPA)和多页应用(MPA)上:
单页应用模式 - SPA(Single-Page Application)
在Web开发中,加载时一次把所有的页面内容都同时加载到浏览器;在智能终端上是把所有内容都在一个安卓Activity内呈现。通常,我们会使用Vue-Router来实现单面应用。
SPA的优势:
1.避免多个页面重复加载资源(所有资源第一次全部加载好,打成Bundle)
2.可方便的自定义转场效果
3.几乎没有页面之间的等待
4.SPA与全局数据、全局状态共享可以做到天衣无缝的结合
SPA的劣势:
1.由于资源一次加载完成,会加大首次打开页面的开销。如果内容过多,首次打开页面会感觉加载时间过长。因此,应用如果复杂,不要把所有的页面都打包进SPA内;
2.多个页面共享一个内存,逻辑复杂的情况下,需要关注内存管理问题;
3.所有页面必须基于相同的JS框架
多页应用模式 - MPA(Multi-Page Application)
银商小程序默认每个页面都是一个安卓Activity(MPA模式),使用navigator的push方法打开。
MPA的优势:
1.多页架构意味着较弱的耦合,不同页面之间互不影响,可以独立开发、升级;
2.支持原生&开放规则的路由,支持原生的转场效果
MPA的劣势:
1.打开每一个页面或短或长都会有一加载页面动画——取决于页面JS Bundle的内容复杂度,在有些应用场景下,打开应用内所有页面都出现加载动画多少有些让人觉得奇怪
使用Vue-Router开发SPA示例
vue-router是vue.js提供的路由插件,这里主要是用来支持SPA页面跳转。使用Vue-router开发银商小程序SPA应用一般包含以下步骤:
1.创建路由:
/* 导入需要在Vue-Router内路由的页面 */
import homePage from './main.vue';
import helpPage from './help.vue';
import tucaoPage from './tucao.vue';
import errorPage from './error.vue';
const routes = [
{path:'/',redirect: '/homePage'},
{path:'/homePage',component:homePage},
{path:'/helpPage',component:helpPage},
{path:'/tucaoPage',component:tucaoPage},
{path:'/errorPage',component:errorPage}
];
/* 使用vue-router */
import VueRouter from 'vue-router';
Vue.use(VueRouter);
/* 将需要路由的页面routes做为参数,新建VueRouter对象router */
const router = new VueRouter({
routes
});
...
export default{
router, //export router
...
}
2.将路由插入Vue
<template>
<div class="wrapper" @back='handleBack' @menu='handleMenu'>
<!-- 使用router路由标签router-view -->
<router-view class="view"></router-view>
</div>
</template>
3.为页面添加导航
小程序内的vue-router只支持编程式导航,如下:
<div class="row1" :style="{height:rowHeight}">
<div class="item btn-help" :style="{height:rowHeight}" @click="jump('/helpPage')">
<image class="img-style" src="image/c_service.png"></image>
<text class="text-style">客户服务</text>
</div>
<div class="item btn-tucao" :style="{height:rowHeight}" @click="jump('/tucaoPage')">
<image class="img-style" src="image/tucao.png"></image>
<text class="text-style">我要吐槽</text>
</div>
</div>
export default {
methods: {
jump (to) {
if (this.$router) {
this.$router.push(to)
}
}
}
}
4.返回键拦截
由于银商小程序默认是MPA模式,每个页面都是一个Activity,SPA下如果不重定义Back键,则按下系统Back会直接退出SPA的Activity,而不是回退到上一个页面。 拦截Back,只要要在SPA的 根标签下添加一次@back,如下:
<template>
<div class="wrapper" @back='backMethod'>
<router-view class="view"></router-view>
</div>
</template>
method内定义back的行为如下:
backMethod() {
if (this.$route.path==='/homePage'){
this.umsApi.navigator.pop()
}
else {
this.jump('/')
}
}
MPA的页面路由示例:
MPA的页面路由使用umsApi的navigator下的push和pop方法
1.导入umsApi:
import umsApi from 'ums-api'
2.页面跳转:
umsApi.navigator.push({url: 'tucao.js'})
3.关闭当前页,回退上一页面:
umsApi.navigator.pop()
开发建议
在开发中,到底使用SPA模式还是使用MPA模式应视具体场景而定。对于复杂的应用,我们推荐SPA与MPA混合使用。