keep-alive
当我们想要实现一个表单切换,表单填写一共有三个步骤,想实现将之前的填写的步骤缓存住可以回头操作,就可以试试使用组件中的keep-alive ~
- 首先vue本身就是一个组件化编程,一个.vue文件就是一个组件,和万事万物一样,都有从出生到消亡的过程,vue的组件也是这样,有自己的生命周期:created创建数据、mounted挂在数据、update更新数据、destroy销毁实例。
- 使用keep-alive就是保持组件的活跃,不会被destroy销毁,组件没有被销毁的话,组件上的数据就一直存在,状态保留,所以keep-alive就可以保持组件状态!
- 此keep-alive非彼keep-alive……http协议的请求头中也有一个keep-alive,用来保持http连接状态:Connection: keep-alive。虽然是两个功能,但是本质上都是保持活跃状态~
原理:vue.js内部将DOM节点抽象成一个个VNode节点,keep-alive组件的缓存也是基于VNode节点的,而不是直接存储DOM结构。它将满足条件的组件在cache对象中缓存起来,在需要重新渲染的时候再将VNode节点从cache中取出并渲染 ~
堆和栈
堆和栈实际上是操作系统对进程占用的内存空间的两种方式 ~
区别:
- 管理方式不同
栈由操作系统自动分配释放,无需手动控制;堆的申请和释放工作由程序员控制,容易产生内存泄露! - 空间大小不同
每个进程拥有的栈的大小要远远小于堆的大小。理论上程序员可申请的堆的大小为虚拟内存的大小,进程栈的大小64bits的Windows默认1MB,64bits的Linux默认10MB。 - 生长方式不同 堆的生长方向向上,内存地址由低到高;栈的生长方向向下,内存地址由高到低。
- 分配方式不同 堆都是动态分配的,没有静态分配的堆。栈有两种分配方式:静态分配和动态分配。
- 分配效率不同 栈由操作系统自动分配,会在硬件层级对战提供支持;堆由C/C++提供的库函数或运算法来完成申请与管理,实现机制较为复杂,频繁的内存申请容易产生内存水平。显然,堆的效率比栈低许多。
- 存放内容不同 栈存放的内容,函数返回地址、相关参数、局部变量和寄存器内容等;堆在一般情况下使用一个字节的空间来存放堆的大小,而堆中存放内容由程序员来填充。
use strict 是什么东东
use strict是一种ECMAscript5添加的严格运行模式,这种模式使得JavaScript在更加严格的条件下运行。
设立“ 严格模式 ”的目的,主要原因有:
- 消除JavaScript语法的一些不合理、不严谨之处,减少一些怪异行为;
- 消除代码运行一些不安全的地方,保证代码能够安全运行;
- 提高编译效率,增加运行速度;
- 为未来的新版本做铺垫;
防抖和节流是什么?
接下来会出一篇文章专门讲讲“防抖”和“节流”!
本质上,它们都是优化高频率执行代码的一种手段,比如:浏览器的resize、scroll、keypress、mousemove等事件在触发的时候会不断调用绑定在事件上的回调函数,会极大地浪费资源,降低前端性能!
为了优化体验,提升性能,需要限制对此类事件调用次数,对此我们可以采用 debounce(防抖)和throttle(节流)的方式来减少调用频率 ~
定义:
- 防抖:n秒后在执行该事件,若在n秒内被重新触发,则重新计时;
- 节流:n秒内只执行一次,若在n秒内重复触发,只有一次生效;
用比较贴近生活的例子:
- 防抖:假设电梯门打开后等待5秒会自动关闭。当电梯门快合上时,有个人在门外按了电梯开门键,电梯关门的时间将再次被刷新,从5秒开始倒计时。后续若再有人点开门按钮,将重新倒计时。
- 节流:当我们提交一个表单时,若未对按钮进行限制,用户一秒钟点击10次按钮,那么将提交10次表单,对服务器会造成压力,也可能造成数据重复,当我们对按钮进行节流处理,用户在一定的时间内就只能提交一次表单。