zoukankan      html  css  js  c++  java
  • 返回上一页时,保存恢复浏览记录(模拟返回不刷新)

    sessionStorage

      与 localStorage 相似,不同之处在于 localStorage 里面存储的数据没有过期时间设置,而存储在 sessionStorage 里面的数据在页面会话结束时会被清除。页面会话在浏览器打开期间一直保持,并且重新加载或恢复页面仍会保持原来的页面会话。在新标签或窗口打开一个页面会初始化一个新的会话。

    大致思路:

    1. 用户在点击新的链接时,保存上一页的信息(包括页码、滚轮位置、页面标识符等,建议保存于sessionStorage);
    2. 在打开上一页时先做判断,是否有保存过当页的记录;
    3. 如果有记录:删除记录 => 重新定义页码 => 获取数据 => 渲染页面 => 移动滚轮位置;
    4. 如果没有记录:从第一页开始显示;

    主要代码:

    common.js:

    import Vue from 'vue'
    
    export default {
        install(Vue, options) {
            Vue.prototype.SEstorage = {
                page_type: function() {
                    return window.location.hash.split('?')[0];
                },
                container: window.sessionStorage,
                savePage: function(page) {
                    let cur_page = parseInt(page) || 1;
                    this.container.setItem(`${this.page_type()}_page`, cur_page);
                },
                saveScroll: function() {
                    var cur_scroll = document.body.scrollTop || document.documentElement.scrollTop || window.pageYOffset;    //兼容滚动条高度
                    this.container.setItem(`${this.page_type()}_scroll_top`, cur_scroll);
                },
                saveOther: function(other) {
                    Object.keys(other).map(item => {
                        this.container.setItem(`${this.page_type()}_${item}`, other[item]);
                    });
                },
                saveBackInfo: function(page, other) {
                    this.savePage(page);
                    this.saveScroll();
                    if(typeof other === 'object'){
                        this.saveOther(other);
                    }
                },
                isBack: function(other) {
                    let cur_page = this.container.getItem(`${this.page_type()}_page`);
                    let cur_scroll = this.container.getItem(`${this.page_type()}_scroll_top`);
                    if(typeof other === 'object'){
                        Object.keys(other).map(item => {
                            other[item] = this.container.getItem(`${this.page_type()}_${item}`);
                            this.container.removeItem(`${this.page_type()}_${item}`);
                        });
                    }
                    let result = {};
                    if(cur_page){
                        this.container.removeItem(`${this.page_type()}_page`);
                        this.container.removeItem(`${this.page_type()}_scroll_top`);
                        result = {
                            page: parseInt(cur_page),
                            scroll_top: parseInt(cur_scroll),
                        };
                        if(typeof other === 'object'){
                            Object.keys(other).map(item => {
                                result[item] = other[item];
                            });
                        }
                    }else{
                        result = {};
                    }
                    return result;
                },
            }
            // 回到记录的滚动位置
            Vue.prototype.scrollToHistory = (scroll) => {
                document.body.scrollTop = document.documentElement.scrollTop = window.pageYOffset = scroll;
            }
        }
    }

    list.vue:

    export default {
        data() {
            return {
                list: [],
                page: 1,
                category: '',    //额外的信息
                history: {}, //保存的记录
            }
        },
        created() {
            this.history = this.SEstorage.isBack({category: this.category});    //获取到记录
            this.category = this.history.category;
            this.page = this.history.page || this.page;    //修改page
            this.getList();    //获取数据
        },
        methods: {
            getList() {
                this.axios.get(`${this.APIURL}?page=${this.page}`).then(resp => {
                    this.list = resp.data.data;
                    // 恢复滚轮保存的位置,这里dom渲染是个一部的过程,所以写在nextTick的回调里面
                    if (this.history.page) {
                        this.$nextTick(() => this.scrollToHistory(this.history.scroll_top));
                    }
                });
            },
            // 跳转到内容页面时,保存阅读记录
            toAudioList(_id) {
                this.SEstorage.saveBackInfo(this.page, {category: this.category});
                this.$router.push({ path: './next_page', query: { _id: _id } });
            },
        }
    }
    飞鸟尽,良弓藏
  • 相关阅读:
    [Windows]wmic查看运行进程的参数
    Java8中的foreach跳出循环break/return
    Python Learning(6)字典
    SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 后端篇(三): 整合阿里云 OSS 服务 -- 上传、下载文件、图片
    SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 后端篇(四): 整合阿里云 短信服务、整合 JWT 单点登录
    SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 后端篇(五): 数据表设计、使用 jwt、redis、sms 工具类完善注册登录逻辑
    Servlet、Jsp
    BIO、NIO、AIO
    HashMap (JDK1.8) 分析
    mysql常见笔试题
  • 原文地址:https://www.cnblogs.com/shenshangzz/p/7777187.html
Copyright © 2011-2022 走看看