SPA 路由记忆

SPA 路由记忆

名词解释

在中后台系统开发中,访问任何页面时,认证是永远绕不过的槛。以登录为例,如果检测出当前用户未登录,会强制跳转到登录页面提示用户进行登录。登录完成后,系统需要跳转至用户原先想访问的页面。这个过程,暂且称之为路由记忆,前面例子中的登录页面称之为记忆节点

解决方案

由前面的例子我们不难得出路由记忆的关键逻辑:

  • 进入记忆节点时记录目标页面
  • 离开记忆节点时跳往目标页面(如果存在)
// 目标页面
const target = undefined;

但如此只能满足存在一个记忆节点的应用,而实际开发中,我们可能需要多个记忆节点。当应用中存在多个记忆节点时,问题就会慢慢的浮现。

接下来,我们对上面的方案进行扩展。

记忆节点集合

首先,我们需要维护一个记忆节点的集合:

// 记忆节点集合
const nodes = [];
上次访问记录

在这之前我们得先思考一个问题:由记忆节点跳往记忆节点时,是否需要触发路由记忆?

当然不需要!!!

当进入记忆节点时,我们首先得判断上一个访问页面是否为记忆节点,是则忽略,否则记录目标页面。

在这之前,我们需要定义一个变量用来记录上次访问页面,这个变量仅记录上次访问页面即可,无论是否为记忆节点:

// 上次访问页面
const previous = undefined;
记录目标页面

为保证路由记忆结果的质量,我们需要对每次路由跳转结束进行监控(不论成功、取消或者失败)。

结合前面的例子,我们现在不难得出,只有在常规页面进入记忆节点时,需要对目标页面进行记录。

/**
 * @param to {string} 去往页面
 */
function mark (to) {
    // 备份上次访问页面,防止被覆写
    const backup = previous;
    // 记录上次访问页面
    previous = to;
    // 如果上一个访问页面是记忆节点,中断函数
    if (~nodes.indexOf(backup)) return;
    // 如果去往页面不是记忆节点,中断函数
    if (!~nodes.indexOf(to)) return;
    // 记录目标页面
    target = backup;
}
跳往目标页面

在每次路由跳转之前,我们需要检测是否是记忆节点进入常规页面且是否存在目标页面记录,如果条件都满足,则打断原有操作跳往目标页面,并清空目标页面记录。

/**
 * @param to {string} 去往页面
 */
function check (to) {
    // 若目标页面不存在,中断函数
    if (!target) return;
    // 备份目标页面,防止在使用之前被清空
    const backup = target;
    // 如果去往页面是记忆节点,中断函数
    if (~nodes.indexOf(to)) return;
    // 如果上次访问不是记忆节点,中断函数
    if (!~nodes.indexOf(previous)) return;
    // 清空目标记录
    target = undefined;
    // 路由跳转,假定执行函数为 navigate
    navigate(target);
}

代码整合

ES5
var RouterMemory = function (nodes) {
    // 目标页面
    this.target = undefined;
    // 上次访问页面
    this.previous = undefined;
    // 记忆节点集合
    this.nodes = nodes && nodes instanceof Array ? nodes : [];
}

/**
 * 记录上次访问及目标页面
 * @param to {string} 去往页面
 */
RouterMemory.prototype.mark = function (to) {
    // 备份上次访问页面,防止被覆写
    var backup = this.previous;
    // 记录上次访问页面
    this.previous = to;
    // 如果上一个访问页面是记忆节点,中断函数
    if (~nodes.indexOf(backup)) return;
    // 如果去往页面不是记忆节点,中断函数
    if (!~nodes.indexOf(to)) return;
    // 记录目标页面
    this.target = backup;
}

/**
 * 跳往目标页面
 * @param to {string} 去往页面
 */
RouterMemory.prototype.check = function (to) {
    // 若目标页面不存在,中断函数
    if (!this.target) return;
    // 备份目标页面,防止在使用之前被清空
    const backup = this.target;
    // 如果去往页面是记忆节点,中断函数
    if (~nodes.indexOf(to)) return;
    // 如果上次访问不是记忆节点,中断函数
    if (!~nodes.indexOf(this.previous)) return;
    // 清空目标页面
    this.target = undefined;
    // 路由跳转,假定执行函数为 navigate
    navigate(this.target);
}
ES Next
class RouterMemory {
    constructor (nodes) {
        // 目标页面
        this.target = undefined;
        // 上次访问页面
        this.previous = undefined;
        // 记忆节点集合
        this.nodes = nodes && nodes instanceof Array ? nodes : [];
    }
    /**
    * @param to {string} 去往页面
    */
    mark (to) {
        // 备份上次访问页面,防止被覆写
        const backup = this.previous;
        // 记录上次访问页面
        this.previous = to;
        // 如果上一个访问页面是记忆节点,中断函数
        if (nodes.includes(backup)) return;
        // 如果去往页面不是记忆节点,中断函数
        if (!nodes.includes(to)) return;
        // 记录目标页面
        this.target = backup;
    }
    /**
    * @param to {string} 去往页面
    */
    check (to) {
        // 若目标页面不存在,中断函数
        if (!this.target) return;
        // 备份目标页面,防止在使用之前被清空
        const backup = this.target;
        // 如果去往页面是记忆节点,中断函数
        if (nodes.includes(to)) return;
        // 如果上次访问不是记忆节点,中断函数
        if (!nodes.includes(this.previous)) return;
        // 清空目标记录
        this.target = undefined;
        // 路由跳转,假定执行函数为 navigate
        navigate(this.target);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
电子图书资源服务系统是一款基于 Java Swing 的 C-S 应用,旨在提供电子图书资源一站式服务,可从系统提供的图书资源中直接检索资源并进行下载。.zip优质项目,资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目。 本人系统开发经验充足,有任何使用问题欢迎随时与我联系,我会及时为你解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(若有),项目具体内容可查看下方的资源详情。 【附带帮助】: 若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步。 【本人专注计算机领域】: 有任何使用问题欢迎随时与我联系,我会及时解答,第一时间为你提供帮助,CSDN博客端可私信,为你解惑,欢迎交流。 【适合场景】: 相关项目设计中,皆可应用在项目开发、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面中 可借鉴此优质项目实现复刻,也可以基于此项目进行扩展来开发出更多功能 【无积分此资源可联系获取】 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。积分/付费仅作为资源整理辛苦费用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值