前端单页应用以及状态保持的探索

工作中对单页应用和状态保持有些研究希望和大家分享一下:

我们主要探讨两个内容:单页应用、状态保持

一、单页应用

先说第一个:单页应用,单页应用就是指应用所有的交互都是在一个页面中进行的,当然实现方式有多种:

1、页面中放多个div对应多个虚拟页面,通过显示隐藏来切换

  优点:切换速度快,状态可保持

  缺点:所有的虚拟页面都放到一个真实页面里,先不说浏览器能不能受得了,开发时可能遇到各种id,class冲突,事件冲突等等,少量页面估计还行。

2、通过类似android的activity生命周期来管理虚拟页面,这里详细介绍一下:

  每个页面对应一个js对象,类似android前端.xml都有一个.java文件对应一样,如下:

    XXX.page.index = new XXX.view({
             cache:true, //如果页面需要保持状态设置为true
             init:function(){
                 //调用时机:路由到此页面时基类调用此方法
             //作用:主要是初始化相关属性 例如:pageindex  pagesize等
                 this.render();
             },
             render:function(){
             //调用时机:init方法调用
                 //作用:渲染页面(拉取数据配合模板引擎生成html放到页面中)
                 this.bindEvent();
             },
             bindEvent:function(){
             //调用时机:1、render方法调用 2、基类页面会在调用resume后调用此事件
                //作用:绑定事件
             },
             resume:function(){
                 //调用时机:cache:true则检查如果有缓存则基类恢复页面基本信息后调用此方法
             //作用:手动恢复页面上比较特殊的地方。 例如:倒计时时间的重新计算
             },
             dispose:function(){
                 //调用时机:下一个页面init时 基类主动调用此方法。
                 //作用:销毁不需要的对象,例如定时器
             },
       })    
页面基类如下:

 //页面基类
    XXX.view = function(opt){
        _extend(this,opt);
        this._cache = null;//cache实例的字符串
        this._cacheKey = "";
        this.disposeTime = 0;//页面销毁时间
        //路由调用baseInit方法
        this._baseInit = function(){this._cacheKey = XXX.page.getPageCacheKey();
            //检查是否有缓存
            this._cache = sessionStorage[this._cacheKey];
            if(this.cache === true && this._cache){
                this._cache = JSON.parse(this._cache);
                this._cache.instance = JSON.parse(this._cache.instance);
                //把_baseInit参数继续传入_baseResume
                this._baseResume.apply(this,arguments);
            }
            else{
                if(typeof this.init === "function"){
                    this.init.apply(this,arguments);
                }
                else{
                    console.log("no init method");
                }
            }
        };
        this._baseResume = function(){
            //恢复事件
            var cache = this._cache;
            var renderDom = $("#"+XXX);
            renderDom.html(cache.html);
            $("body").scrollTop(cache.scrollTop);
            //还原各个属性
            for(var key in cache.instance){
                this[key] = cache.instance[key];
            }
            //离开的时间
            this.disposeTime = cache.disposeTime;
            //执行resume恢复事件
            if(typeof this.resume === "function"){
                //arguments为_baseInit的参数
                this.resume.apply(this,arguments);
            }
            else{
                console.log("no resume method");
            }
            //重新执行bindEvent
            if(typeof this.bindEvent === "function"){
                this.bindEvent();
            }
            else{
                console.log("no bindEvent method");
            }
        };
        this._baseDispose = function(){
            var html = $("#"+XXX).html();
            if(this.cache === true && html && html.length > 0){
                //添加或更新缓存
                var cache = {
                    html:$("#"+meishijia.page.renderId).html(),
                    disposeTime:+new Date,
                    scrollTop:$("body").scrollTop(),
                    instance:JSON.stringify(this)
                }
                sessionStorage[this._cacheKey] = JSON.stringify(cache);
            }
            if(typeof this.dispose === "function"){
                this.dispose();
            }
            else{
                console.log("no dispose method");
            }
        };
        this.clearCache = function(){
            if(this._cacheKey){
                //检查是否有缓存
                sessionStorage.removeItem(this._cacheKey);
            }
        }
    }

  这下基本知道基类的工作原理了吧。

二、状态保持(比如滚动高度、按钮点击状态,pageindex等)

  咱们可以用chrome切换到手机调试模式,查看京东或淘宝的商品列表,当你滑啊滑,找到一个感兴趣的商品时点进去,待会再返回来可就坑爹了,不在刚才的位置了,还得重新找。手机浏览器上即使可以也是浏览器帮做的,而且各个手机浏览器又不太一致。这就是状态保持的问题(可不仅仅是滚动高度的问题)。

  按照咱们上面讨论的方案,基类已经做了状态保持的大部分工作,特殊的可以手动还原,这样就做到了真正的状态保持。当然这里只是最基本的功能,很多细节问题还得实践中不断发现并解决,也希望大家提出更好的方案。

时间: 2024-08-06 14:03:20

前端单页应用以及状态保持的探索的相关文章

前端单页应用微服务化解决方案2 - Single-SPA

技术选型 经过各种技术调研我们最终选择的方案是基于 Single-SPA 来实现我们的前端微服务化. Single-SPA 一个用于前端微服务化的JavaScript前端解决方案 使用Single-SPA之后,你可以这样做: (兼容各种技术栈)在同一个页面中使用多种技术框架(React, Vue, AngularJS, Angular, Ember等任意技术框架),并且不需要刷新页面. (无需重构现有代码)使用新的技术框架编写代码,现有项目中的代码无需重构. (更优的性能)每个独立模块的代码可做

单页应用Scrat实践

单页应用Scrat实践 1.开始 随着前端工程化深入研究,前端工程师现在碉堡了,甚至搞了个自己的前端网站http://div.io/需要邀请码才能注册,不过里面的技术确实牛.距离顶级的前端架构,目前博主应该是far away,幸运的是现在有很多前端大神积极的分享自己的经验,比如百度这位https://github.com/fouber/blog/issues/4. 将iframe项目使用多页HTML与FIS重构以后,前端已经得到了极大的优化,然而多页HTML带来的状态丢失(登录信息,菜单信息),

#前端的挑战——单页应用的体验

---恢复内容开始--- ##什么是单页应用所谓单页应用,指的是在一个页面上集成多种功能,甚至整个系统就只有一个页面(一个html),所有的业务功能都是它的子模块,通过特定的方式挂接到主界面上. ##为什么会有单页应用我们知道ajax技术的产生,一部分原因就是为了让访问网页的用户在不刷新页面的情况下,在页面上查看数据的变更.我们可以说ajax提升了体验. 随着互联网的发展,浏览器端承载的业务愈发复杂,web前端早已不再是一个简单页面,ajax局部刷一刷的小玩意.动辄数十个子页面的应用市面上随处可

好程序员web前端分享如何构建单页Web应用

好程序员web前端分享如何构建单页Web应用,首先我们来看一看单页应用是什么?所谓单页应用,指的是在一个页面上集成多种功能,甚至整个系统就只有一个页面,所有的业务功能都是它的子模块,通过特定的方式挂接到主界面上.它是AJAX技术的进一步升华,把AJAX的无刷新机制发挥到极致,因此能造就与桌面程序媲美的流畅用户体验. 其实单页应用我们并不陌生,很多人写过ExtJS的项目,用它实现的系统,很天然的就已经是单页的了,也有人用jQuery或者其他框架实现过类似的东西.用各种JS框架,甚至不用框架,都是可

前端 SPA 单页应用数据统计解决方案 (ReactJS / VueJS)

前端 SPA 单页应用数据统计解决方案 (ReactJS / VueJS) 一.百度统计的代码: UV PV 统计方式可能存在问题 在 SPA 的前端项目中 数据统计,往往就是一个比较麻烦的事情,React 和 Vue 也是一样. 在 发现问题之前,我们得来思考下 百度统计的 统计原理 是什么? 1-1: 百度统计代码 var _hmt = _hmt || []; (function () { var hm = document.createElement("script"); hm.

vue单页(spa)前端git工程拆分实践

背景 随着项目的成长,单页spa逐渐包含了许多业务线 商城系统 售后系统 会员系统 ... 当项目页面超过一定数量(150+)之后,会产生一系列的问题 可扩展性 项目编译的时间(启动server,修改代码)越来越长,而每次调试关注的可能只是其中1.2个页面 需求冲突 所有的需求都定位到当前git,需求过多导致测试环境经常排队 基于以上问题有了对git进行拆分的技术需求.具体如下 目标 依然是spa 由于改善的是开发环境,当然不希望拆分项目影响用户体验.如果完全将业务线拆分成2个独立页面,那么用户

《单页web应用 javaScript从前端到后端》3.1 开发shell小例子demo

目前看到这里,还不懂什么是单页应用,这不就是一个普通的点击滑开收缩的动画而已--作者写的那么复杂666 请转载此文的朋友务必附带原文链接,谢谢. 原文链接:http://xuyran.blog.51cto.com/11641754/1891022 spa.html: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <li

Vue单页式应用(Hash模式下)实现微信分享

前端微信分享的基本步骤: 一.绑定域名: 先登录微信公众平台进入"公众号设置"的"功能设置"里填写"JS接口安全域名".这个不多说,微信开发的都应该清楚. 二.引入js文件: 在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.0.0.js.请注意,如果你的页面启用了https,务必引入 https://res.wx.qq.com/open/js/jweixi

单页应用的三大优势及监控方法

最近,开发者们越来越理解,为用户提供愉悦的用户体验的重要性,这也是实现业务目标的关键因素.作为高端用户,开发者本身也越来越意识到网站的性能对提升用户体验的重要性. 同样地,开发者也越来越清楚地认识到,用户从移动端访问网站的发展趋势,即移动流量的增长速度领先于传统的台式机/网络通信,而且移动设备的用户已经习惯于原生应用的表现和速度. 因此,开发者们认识到,要满足越来越多的移动端用户的需求,他们要采取一些迎合用户的行动,比如打造出拥有原生应用体验和性能的产品,从而给用户安全感,给他们带来乐趣,从而留