分析

这道题及考察使用,有考察原理,nextTick在开发过程中应用的也较少,原理上和vue异步更新有密切关系,对于面试者考查很有区分度,如果能够很好回答此题,对面试效果有极大帮助。

答题思路

  1. nextTick是做什么的?
  2. 为什么需要它呢?
  3. 开发时何时使用它?抓抓头,想想你在平时开发中使用它的地方
  4. 下面介绍一下如何使用nextTick
  5. 原理解读,结合异步更新和nextTick生效方式,会显得你格外优秀

回答范例:

  1. nextTick是等待下一次DOM更新刷新的工具方法。(其实一句话就可以把$nextTick这个东西讲明白:就是你放在 $ nextTick 当中的操作不会立即执行,而是等数据更新、DOM更新完成之后再执行,这样我们拿到的肯定就是最新的了。
    再准确一点来讲就是 $nextTick方法将回调延迟到下次DOM更新循环之后执行。(看不懂这句人话的,可以看上面)

  2. Vue有个异步更新策略,意思是如果数据变化,Vue不会立刻更新DOM,而是开启一个队列,把组件更新函数保存在队列中,在同一事件循环中发生的所有数据变更会异步的批量更新。这一策略导致我们对数据的修改不会立刻体现在DOM上,此时如果想要获取更新后的DOM状态,就需要使用nextTick。

  3. 开发时,有两个场景我们会用到nextTick

    • created中想要获取DOM时;
    • 响应式数据变化后获取DOM更新后的状态,比如希望获取列表更新后的高度。
  4. nextTick类型

function nextTick(callback?: () => void): Promise<void>

所以我们只需要在传入的回调函数中访问最新DOM状态即可,或者我们可以await nextTick()方法返回的Promise之后做这件事。

  1. 在Vue内部,nextTick之所以能够让我们看到DOM更新后的结果,是因为我们传入的callback会被添加到队列刷新函数(flushSchedulerQueue)的后面,这样等队列内部的更新函数都执行完毕,所有DOM操作也就结束了,callback自然能够获取到最新的DOM值。

我们可以看一下官方的案例:

<script>
import { nextTick } from 'vue'export default {data() {return {count: 0}},methods: {async increment() {this.count++// DOM 还未更新console.log(document.getElementById('counter').textContent) // 0await nextTick()// DOM 此时已经更新console.log(document.getElementById('counter').textContent) // 1}}
}
</script><template><button id="counter" @click="increment">{{ count }}</button>
</template>

给了一个count,想要在界面中绑定展示。一开始是0,如果用户点了increment,希望这个count能够++,我们希望界面中能够变成1,可是在紧接着的console.log中你会发现它并没有更新,结果仍然为0,并不是1,那么怎么输出1呢?await nextTick(),后面再输出结果就是1了。为什么会这样呢?这就是nextTick()带给我们最关键的东西了。说白了,就是nextTick()会返回一个promise,未来在异步的方式再来调用我们这行代码。也就是说nextTick()下的console.log将来执行的时候我们的DOM已经更新了。还有一种方式就是nextTick()中间加一个回调函数,在回调函数中输出我们的console.log里面的那一行代码。这样也是可以的。

具体地源码分析可以看面试题:Vue中$nextTick原理:讲的很清晰
总结一下:就是 $nextTick将回调函数放到微任务或者宏任务当中以延迟它地执行顺序;

重要的是理解源码中它的三个参数的意思:

  • callback:我们要执行的操作,可以放在这个函数当中,我们没执行一次$nextTick就会把回调函数放到一个异步队列当中;
  • pending:标识,用以判断在某个事件循环中是否为第一次加入,第一次加入的时候才触发异步执行的队列挂载
  • timerFunc:用来触发执行回调函数,也就是Promise.then或MutationObserver或setImmediate 或setTimeout的过程

理解之后,在看整个$nextTick里面的执行过程,其实就是把一个个 $nextTick中的回调函数压入到callback队列当中,然后根据事件的性质等待执行,轮到它执行的时候,就执行一下,然后去掉callback队列中相应的事件。

面试版

说说nextTick吧

nextTick:在下次DOM更新循环结束之后执行延迟回调。

nextTick知道吗?

这句话扩展开来说,就是由于Vue中DOM更新是「异步执行」的,即修改数据时,视图不会立即更新,而是会监听数据变化,并缓存在同一事件循环中,等同一数据循环中的所有数据变化完成之后,再统一进行视图更新。经常我们会在还未更新的时候就使用了某个元素,这样是拿不到变更后的dom的,所以为了确保能够得到更新后的DOM,所以设置了nextTick()方法。在修改数据之后立即使用这个方法,获取更新后的DOM。简单概括,vue中的nextTick主要用于处理数据动态变化后,DOM还未及时更新的问题,用nextTick可以获取数据更新后最新dom的变化。

在项目中什么时候用呢?

比如,当我们需要在生命周期的created()函数进行一些DOM操作的时候一定、要把相关代码放在Vue.nextTick()的回调函数中。原因:在created钩子函数中,DOM还未进行任何渲染,此时进行DOM操作是没用的,所以如果要在这里操作dom,一定要将相关js代码放进
Vue.nextTick回调函数中。又或者,在数据变化后要执行某个动作,而这个动作需要使用随数据变化而改变的DOM结构的时候,也需要把相关逻辑写入Vue.nextTick ()回调函数中。

$nextTick既然把它传入的方法变成微任务了,那它和其它微任务的执行顺序是怎样的呢?

这简单来说就是谁先挂载Promise对象的问题,在调用 $nextTick方法时就会将其闭包内部维护的执行队列挂载到Promise对象,在数据更新时Vue内部首先就会执行 $nextTick方法,之后便将执行队列挂载到了Promise对象上,其实在明白Js的Event Loop模型后,将数据更新也看做一个 $nextTick方法的调用,并且明白 $nextTick方法会一次性执行所有推入的回调,就可以明白执行顺序的问题了。

$nextTick和nextTick区别

$ nextTick和nextTick区别就是nextTick多了一个context参数,用来指定上下文。但两个的本质是一样的,$nextTick是实例方法,nextTick是类的静态方法而已;实例方法的一个好处就是,自动给你绑定为调用实例的this罢了。

【Vue面试题】说说nextTick的使用和原理?相关推荐

  1. dom不刷新 vue 加数据后_高频出现的Vue 面试题及答案

    前言 本文讲解高频出现的 Vue 面试题及答案. 复习前端面试的知识,是为了巩固前端的基础知识,最重要的还是平时的积累! 注意:文章的题与题之间用下划线分隔开,答案仅供参考. Vue 对 MVC.MV ...

  2. 常见的前端vue面试题

    常见的前端vue面试题 1.请讲述下VUE的MVVM的理解? MVVM 是 Model-View-ViewModel的缩写,即将数据模型与数据表现层通过数据驱动进行分离,从而只需要关系数据模型的开发, ...

  3. Web前端人员如何面试?常见vue面试题有哪些?

    Web前端人员如何面试?常见vue面试题有哪些?vue是一套用于构建用户界面的渐进式JavaScript框架,也是初创项目的首选前端框架.很多企业在招聘前端工程师时都会考察其对vue的了解,接下来小编 ...

  4. antd vue 树更新数据后不展开_很全面的vue面试题总结

    VUE面试题 v-show 与 v-if 区别 动态绑定class的方法 计算属性和 watch 的区别 怎样理解单向数据流 keep-alive 自定义组件的语法糖 v-model 是怎样实现的 生 ...

  5. Vue面试题 70道题目及答案

    Vue面试题 Vue.js介绍 Vue.js是一个轻巧.高性能.可组件化的MVVM库,同时拥有非常容易上手的API Vue.js是一个构建数据驱动的Web界面的库. Vue.js是一套构建用户界面的 ...

  6. web开发者工具,118页Vue面试题总结,涨姿势!

    逻辑运算符 JavaScript中有三个逻辑运算符,&&与.||或.!非. JavaScript 中的逻辑运算符可用来确定变量或者是值之间的逻辑关系.通常用于布尔型值,会返回一个布尔值 ...

  7. 高频率Vue面试题总结,vue面试就靠它!

    前言: 本文整理了一些高频率出现的 Vue 相关面试题. 大家可以先不看答案自测一下自己知道多少哈. 如果对答案有不一样见解或有更好的理解描述或更加详细的朋友欢迎评论区指出补充说明,谢谢~ 喜欢本文或 ...

  8. 一篇由简到难的 Vue 面试题+详解答案

    作者:Big shark@LX 原文:https://juejin.cn/post/6961222829979697165 前言 本文整理了「高频」出现的 Vue 相关面试题并且附带「详解答案」 难度 ...

  9. 最全最详细前端vue面试题+详解答案(拿到高薪offer不是梦)

    最全vue面试题+详解答案 1.MVC 和 MVVM 区别 MVC MVC全名是 Model View Controller,时模型 - 视图 - 控制器的缩写,一种软件设计典范. Model(模型) ...

  10. 【面试题】973- 一篇由简到难的 Vue 面试题+详解答案

    作者:Big shark@LX 原文:https://juejin.cn/post/6961222829979697165 前言 本文整理了「高频」出现的 Vue 相关面试题并且附带「详解答案」 难度 ...

最新文章

  1. springboot之定时任务
  2. Robocopy.exe使用详例
  3. 晋职称计算机过几,晋职称怎样考计算机 昨日记者采访市人事局有关负责人
  4. 导出远程mysql数据库中的表_shell脚本实现导出远程mysql数据库表数据至本地
  5. 【Java】用while循环实现1+2+3......+100
  6. ​inotify+rsync实时数据同步实践讲解17
  7. JKD16正式发布,新特新一览
  8. c 连接mysql自动断开_ESQL/C连接和断开数据库(INFORMIX) | 学步园
  9. android studio for android learning (六)在布局中常使用的单位
  10. 推荐个汇编语言编译器 XP系统
  11. 代码生成器技术乱弹十一,伽罗华理论与代码生成器
  12. Go 的时间转换和时区校对总记不住?给你一份备忘单
  13. QLCDNumber设置背景色和显示数字颜色
  14. 北邮 计算机网络实验二
  15. 计算机网络实验指导gns3,计算机网络实践教程——基于GNS3网络模拟器(CISCO技术)...
  16. 应用程序图标_如何制作完美的应用程序图标
  17. 百度大脑营业执照识别使用攻略
  18. 【学习笔记】树莓派(3B+)及VMware对于代理Proxy的使用
  19. usb接口驱动_win10系统USB接口没反应怎么解决
  20. 习题 8-28 打结(Knots, ACM/ICPC ACM/ICPC Jakarta 2012, UVa1624)

热门文章

  1. 抖音python广告用的什么音乐_抖音上超好听的神曲音乐,Python教你一次性下载
  2. pywinauto java_Robot Framework + Pywinauto 框架实现Windows GUI Automation
  3. 锐龙r75800x相当于什么档次 r75800x相当于i几 r7 5800x核显相当于什么显卡
  4. 发个2D太空射击游戏代码
  5. 几种常见音视频传输协议使用总结
  6. 《阿里云服务器搭建》------ 安装Jenkins
  7. PCI和PCIE插槽有什么区别?
  8. vim插件fzf安装与配置
  9. iphone android传照片大小,如何将照片从iPhone传输/切换到Android
  10. 动手制作一个可以手机APP控制的智能小夜灯