坚持造轮子第五天 - 时间旅行

简介: 坚持造轮子第五天 - 时间旅行

看点


  • 针对大厂笔试、面试必考手写题目


  • TDD方式开发


  • 配合视频讲解


造轮子计划


(计划赶不上变化 随时迭代 欢迎留言 随时摸鱼)


  • 框架基础







  • 洋葱圈Compose


  • Flux模式


  • Promise


  • Thunk


  • HTML编译器


  • Pipe管道


  • 原生Ajax


  • JS基础


  • Promise.all/race


  • 路由


  • new


  • call/apply/bind


  • Object.create


  • 深拷贝、浅拷贝


  • 算法、设计模式


  • 二分查找


  • 快排


  • 二分查找


  • 冒泡排序


  • 选择排序


  • 订阅发布


  • 斐波那契算法


  • 去重


时间旅行


时间旅行就是让程序可以在自己历史状态里面任意穿梭,想想Office和PS软件中的Undo和Redo就知道。再想想王者荣耀的录像功能。


时间旅行实际上就是设计模式中的备忘录模式。这个到我们可以练习设计模式的时候再升华,先不在这里强行渡劫。


首先Redux为时间旅行做了基础性工作,首先所有组件上缴了状态,地主家不存余粮,然后使用纯函数加工数据,不存在秘方和小料,保证了加工结果的可预测性。


然后要做的就是找一个容器我们可以叫做历史和时间轴,把状态变更的历史存储起来。

把状态分为三个时间段:


  • 过去 (过去状态数组)


  • 现在(只有一个状态)


  • 将来 (将来状态数组)


  • gotoState 函数则是用来做时间旅行的,把过去、现在、将来重新分配


需求


1. UNDO


it("前进undo ", () => {
    const history = createHistory()
    history.push({num: 1})
    history.push({num: 2})
    history.push({num: 3})
    history.undo()
    expect(history.present.num).toBe(2)
  });


2. REDO


it("回退redo ", () => {
    const history = createHistory()
    history.push({num: 1})
    history.push({num: 2})
    history.push({num: 3})
    history.push({num: 4})
    history.undo()
    history.undo()
    history.undo()
    history.redo()
    expect(history.present.num).toBe(2)
  });


3. 定点漂移


it("定点回退 ", () => {
    const history = createHistory()
    history.push({num: 1})
    history.push({num: 2})
    history.push({num: 3})
    history.gotoState(1)
    expect(history.present.num).toBe(2)
  });


功能实现


超级简单是吧 我就不解释了


module.exports = createHistory = () => {
  const timeline = {};
  timeline.past = [];
  timeline.futrue = [];
  timeline.gotoState = (index) => {
    const allState = [...timeline.past, timeline.present, ...timeline.futrue];
    timeline.present = allState[index];
    timeline.past = allState.slice(0, index);
    timeline.futrue = allState.slice(index + 1, allState.length);
  };
  timeline.getIndex = () => {
    // 获取当前状态index
    return timeline.past.length;
  };
  // 保存当前状态
  timeline.push = (currentState) => {
    // 将状态都保存,并更新当前状态
    if (timeline.present) {
      timeline.past.push(timeline.present);
    }
    timeline.present = currentState;
  };
  // 后退
  timeline.undo = () => {
    if (timeline.past.length !== 0) {
      timeline.gotoState(timeline.getIndex() - 1);
    }
  };
  // 前进
  timeline.redo = () => {
    if (timeline.futrue.length !== 0) {
      timeline.gotoState(timeline.getIndex() + 1);
    }
  };
  return timeline;
};


测试


网络异常,图片无法展示
|


OK 任务完成


源码地址


>>>>>>>>>>>>>>>【源码地址】 <<<<<<<<<<<<<<<<


本文使用 mdnice 排版


相关文章
|
6月前
|
安全 NoSQL Java
单体项目偶遇并发漏洞!短短一夜时间竟让老板蒸发197.83元!
单体项目偶遇并发漏洞。故事基于真实事件而改编,如有雷同,纯属巧合~
|
9月前
|
算法 决策智能
如何用算法规划完美的相亲假期 - 小美的春节排班挑战
排班是一个经典的组合优化问题,而相亲排班可谓是它的一种别出心裁的应用。小美的挑战在于,如何在有限的8天空闲时间内,安排至少12场有效的相亲,并且满足诸如“父母严选”和通勤时间等一系列复杂的条件。
|
9月前
|
机器学习/深度学习 程序员
程序员日常上下班通勤时间都在干什么?
对于许多人来说,通勤时间是每天工作日必不可少的一部分,但是对于程序员来说,通勤时间是一个宝贵的机会,可以利用这段时间做一些有意义的事情,而如何利用这段时间成为了一个重要的问题。那么本文就来简单分享一下程序员在日常上下班通勤时间里所做的事情,看看程序员们到底在干什么?以及展示他们如何充分利用这段时间提升自己和进行技术学习,还有程序员在通勤时间里的活动以及对个人发展的收获。
266 1
程序员日常上下班通勤时间都在干什么?
|
安全 C++
重生之我要学C++第一天
重生之我要学C++第一天
104 0
|
存储 前端开发 数据库
闲谈时间
闲谈时间
75 0
L2-029 特立独行的幸福 (25 分)
L2-029 特立独行的幸福 (25 分)
233 0
|
存储 数据可视化 开发者
带薪玩一周游戏,还要涨工资
带薪玩游戏,是多么开心的事情,我就找到了。 前段时间,公司接到一个模拟业务场景的项目,需要在图形界面上模拟业务场景,比如人跑动,拖拽物体等,从而获取不太业务场景的模拟数据。
124 0
|
安全 Java 程序员
2020 年的第一天,程序员鸭血粉丝又碰上生产事故
hello~各位读者新年好,我是鸭血粉丝(大家可以称呼我为「阿粉」),一位喜欢吃鸭血粉丝的程序员!2019 年,阿粉写了很多 bug,这不前一段时间 OOM 差点就把服务器搞挂。跨年的时刻,阿粉默默立下一个 flag,2020 年再见 bug。
2020 年的第一天,程序员鸭血粉丝又碰上生产事故
|
达摩院
【非广告】半年时间 90% 的收益就问你慌不慌
先说明这篇文章不包含任何广告内容,也不提供任何投资理财建议,股市有风险,投资需谨慎! 都说牛市来了,今年的 A 股的行情确实很不错,从上面的截图中可以看到阿粉的一只基金已经收益 90% 了。90% 是什么概念,反正阿粉是没有过的,估计很多人都没有经历过这种收益,所以这几天阿粉慌的一批,除了慌的很之外,另一个就是懊悔的很,当初应该多买点的,只能说人性是贪婪的。
【非广告】半年时间 90% 的收益就问你慌不慌