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

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

看点


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


  • 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 排版


相关文章
|
3月前
|
存储 前端开发 JavaScript
太爽了!这12个前端库,帮我在工作中赢得了不少摸鱼时间!!
太爽了!这12个前端库,帮我在工作中赢得了不少摸鱼时间!!
|
存储 前端开发 数据库
闲谈时间
闲谈时间
66 0
|
程序员 区块链
面试周连续剧之走马观花
在前面四天的面试中已经适应了面试的套路和节奏,自己的知识储备也越来越完善,而且自己的要求也不是太高,个人以为自己是属于容易满足的那种类型,所以从面试的第三天开始就停止约面试了,但是好多招聘人事不知道在哪里搞得我的联系方式,直接就是安排面试,有一种推着你往前走的赶脚,所以已经开始拒绝约面和电面。俗话说的好,手中有offer,心里不慌,那么接下来就开启新的一天的面试经历吧!
138 1
面试周连续剧之走马观花
|
机器学习/深度学习 人工智能 自然语言处理
【paddlehubOCR项目】网课手酸酸,眼花花,救星来啦!
大家好这里是三岁,今天给大家带来的是在AiStudio项目平台的一个精选项目,虽然很短,但是效果拔群,使用到了最近特别火的paddleOCR~~~
274 0
【paddlehubOCR项目】网课手酸酸,眼花花,救星来啦!
|
敏捷开发 人工智能 安全
周末来个王炸!!
为了让学习更有趣,这篇文章我会列出计算机科学理论和一些概念,并且用类比的方式和尽量少的技术术语来为你进行解释。这样做的目的就是为了让你快速了解计算机,查漏补缺。
周末来个王炸!!
|
Java 数据库连接
刚入职没多久,连夜手写了一个代码生成器,项目开发速度瞬间屌炸了!(二)
各位网友,大家好,我是阿粉! 最近刚入职一个新团队,还没来得及熟悉业务,甲方爸爸就要求项目要在2个月内完成开发并上线! 本想着往后推迟1个月在交付,但是甲方爸爸不同意,只能赶鸭子上架了! 然后根据业务需求,设计出了大概30多张表,如果这30多张表,全靠开发人员手写 crud,开发所需的时间肯定会大大的延长,甚至可能直接会影响交付时间! 于是就想着,能不能通过代码生成器一键搞定全部的 crud,开发团队只需要根据业务需求编写逻辑代码就可以?
刚入职没多久,连夜手写了一个代码生成器,项目开发速度瞬间屌炸了!(二)
|
Java 关系型数据库 MySQL
刚入职没多久,连夜手写了一个代码生成器,项目开发速度瞬间屌炸了!(一)
各位网友,大家好,我是阿粉! 最近刚入职一个新团队,还没来得及熟悉业务,甲方爸爸就要求项目要在2个月内完成开发并上线! 本想着往后推迟1个月在交付,但是甲方爸爸不同意,只能赶鸭子上架了! 然后根据业务需求,设计出了大概30多张表,如果这30多张表,全靠开发人员手写 crud,开发所需的时间肯定会大大的延长,甚至可能直接会影响交付时间! 于是就想着,能不能通过代码生成器一键搞定全部的 crud,开发团队只需要根据业务需求编写逻辑代码就可以?
刚入职没多久,连夜手写了一个代码生成器,项目开发速度瞬间屌炸了!(一)