今天必须拿下nextTick实现原理

514 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 9 天,点击查看活动详情

大家好,我是林家少爷,是一位专注于前端技术,立志成为前端技术专家的热血青年。

从2023年2月17日开始,我决定开辟一个新的专栏【刷爆LeetCode】,每天至少刷一道LeetCode原题,并且使用Typescript和原生JS来编写代码。

今天是第5天ヾ(◍°∇°◍)ノ゙

没想到之前的月份居然全部写错了!!

掘金要重新审核太慢了,太不谨慎了,前面8天连续写错!!

现在写作时间是晚上23:06,还剩下一个小时作文时间。

此时此地我还在公司的机房,和一群服务器待在一起。

整间房子都是服务器运作的声音,呼出的热气,让整个房子暖的像个火炉一样。

一点都不像在春天。

此时此刻其实并没有在加班,只是在做我昨天刚接了一个小程序私单,赚点小钱嘻嘻(#^.^#)。

我爱钱,也爱生活,有钱能够更好地生活(*^▽^*)

今天在开发过程中,遇到了一个小挫折,看到项目中多处使用了nextTick,因为工期紧张的缘故(因为原本下周一就要提测的,我硬生生拖到周四,真不熟悉这套element-ui封装的框架,太多自定义的写法),照抄里面的代码,结果报错了,改了好几次还是报错,顿时挫败感满满,所以今天不拿下nextTick,是不打算回家了。

前言

众所周知,Vue的DOM更新操作时异步的,为了获取更新后的DOM,官方提供了相应的API nextTick,文档中对该API的描述为:将回调延迟到下次DOM更新循环之后执行,所谓的下一次,到底是哪一次呢?

DOM更新时异步任务,nextTick的回调也是异步任务,nextTick中的回调一定就能获取到最新的DOM吗?

要想回到以上问题,先来解决两个最基础的问题:

为什么会有nextTick这种东西存在

因为Vue采用的是【异步更新策略】,当监听到数据发生变化的时候,不会立即去更新DOM,而是开启一个任务队列,并缓存在同一个事件循环中发生的所有数据变更。

这种做法带来的好处就是可以将多次数据更新合并成一次,减少操作DOM的次数;

如果不采用这种方法,假设数据改变100次就要去更新100次DOM,而频繁的DOM更新是很消耗性能的。

nextTick的作用

nextTick接收一个回调函数作为参数,并将这个回调函数延迟到DOM更新后才执行;

nextTick的使用场景有哪些?

想要操作机遇最新数据生成的DOM时,就将这个操作放在nextTick的回调中。

nextTick实现原理

将传入的回调函数包装成异步任务,异步任务又分为微任务和宏任务,为了尽快执行所以优先选择微任务。

nextTick提供了四种异步方法:
Promise.then
MutationObserver
setImmediate
setTimeout(fn,0)

源码解读

我看了一下nextTick源码,并不复杂,三个函数,60多行代码,真的很精简。

我还在看,沉下心学习中,如无意外明天凌晨还会发一篇文章。

细讲nextTick源码。

现在写完今天的稿子,看时间,23:35,刚好写了半个小时。

好了,继续去完成私单的工作吧,今晚写完明天一手交钱一手交货。

有三个月没写小程序,技术生疏了,努力补课中。

要知道,我工作中写的第一行代码就是小程序的代码。

也是因为小程序,我才踏入了前端开发的大门。

还有好多故事想跟大家分享,像【摸鱼的春哥】一样,分享点我经历的开心的不开心的事情让大家开心一下,也不错!!

下期再见ヾ( ̄▽ ̄)ByeBye