【面试题】Vue2的$nextTick原理解析

简介: 【面试题】Vue2的$nextTick原理解析

大厂面试题分享 面试题库

前后端面试题库 (面试必备) 推荐:★★★★★

地址:前端面试题库  web前端面试题库 VS java后端面试题库大全

nextTick原理

  1. 平时在获取真实DOM的时候获取不到最新的DOM元素,使用$nextTick就可以
  2. 为什么$nextTick就可以获取到最新的DOM元素?

带着以上问题,来解析nextTick的原理

为什么获取不到最新的DOM元素?

因为Vue修改视图是异步执行的,这也是为了优化性能,在我们修改data中的数据时,Vue内部监听到依赖数据发生了改变,通过dep通知组件的watcher执行视图更新,每一次视图更新都需要重新生成vnode再进行新旧vnode比对,生成DOM元素挂载到页面上,这一轮操作是非常消耗性能的,所以Vue内部会把页面更新watcher推入到一个队列中,并加入了节流方法,当同步代码执行完了之后才会把队列中的watcher拿出来遍历更新视图,我们在使用this.$refs获取DOM的时候是同步代码,其实DOM还没有更新,所以是获取不到的

为什么使用$nextTick就可以获取到最新DOM?

Vue的视图更新是异步执行的,使用的就是nextTick,这也是能获取到最新DOM的原因,在Vue内部有一个nextTick函数,他也是使用队列去处理回调函数,并不是调用后就马上执行,首先是推入到一个队列中,当所有的同步代码执行完的时候再通过循环取出调用,接下来可以通过代码了解

let callback = []
let pending = false
let timerFunc
function flush() {
  callback.forEach((cb) => cb())
  pending = false
  callback = []
}
// 处理兼容问题
if (Promise) {
  timerFunc = () => {
    Promise.resolve().then(flush)
  }
} else if (MutationObserver) {
  let observe = new MutationObserver(flush)
  let textNode = document.createTextNode(1)
  observe.observe(textNode, {
    characterData: true,
  })
  timerFunc = () => {
    textNode.textContent = 2
  }
} else if (setImmediate) {
  // ie浏览器支持得定时器
  timerFunc = () => {
    setImmediate(flush)
  }
}
export function nextTick(cb) {
  callback.push(cb)
  // Promise.then
  if (!pending) {
    console.log('执行了')
    timerFunc() // 这个方法就是异步方法
    pending = true
  }
}
  1. 定义一个callback数组,每次调用nextTick就会把回调函数push到callback数组中,因为callback.push是同步代码,timerFunc是异步代码,所以执行完所有push后才会调用timerFunc
  2. 那么视图更新和获取DOM的流程是怎么样的呢

通过伪代码来解释

data(){
    return {
        name: 'zs',
        list: [1,2,3]
    }
}
this.name = 'ls'
this.list.push(4)
const fn = () => {
  this.$el.innerHTML // 获取最新DOM
}
this.$nextTick(fn)

this.namethis.list修改了2个数据,会触发两次视图更新,这个时候就会把watcher推入到队列中,下面调用了$nextTick获取DOM,nextTick中的fn函数也会推入到队列中,这个时候的数组是这样的[watcher,fn]通过循环调用,先执行视图更新,后获取DOM就可以获取到最新DOM了

大厂面试题分享 面试题库

前后端面试题库 (面试必备) 推荐:★★★★★

地址:前端面试题库  web前端面试题库 VS java后端面试题库大全

 

相关文章
|
2天前
|
算法 网络协议 安全
HTTP 原理和面试题
HTTP 原理和面试题
|
2天前
|
存储 芯片
【期末不挂科-单片机考前速过系列P11】(第十一章:15题速过串行口的工作原理和应用)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P11】(第十一章:15题速过串行口的工作原理和应用)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P10】(第十章:11题中断系统的工作原理及应用)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P10】(第十章:11题中断系统的工作原理及应用)经典例题盘点(带图解析)
|
2天前
|
C语言 C++
【期末不挂科-单片机考前速过系列P1】(第一章:27题搞定单片机&其工作原理)经典例题盘点【选择题&判断题&填空题】(带图解析)
【期末不挂科-单片机考前速过系列P1】(第一章:27题搞定单片机&其工作原理)经典例题盘点【选择题&判断题&填空题】(带图解析)
|
2天前
|
JavaScript 前端开发 算法
vue生命周期函数原理解析,vue阻止事件冒泡方法实现
vue生命周期函数原理解析,vue阻止事件冒泡方法实现
|
3天前
|
芯片
EDA设计:原理、实践与代码深度解析
EDA设计:原理、实践与代码深度解析
13 2
|
3天前
|
算法 计算机视觉 Python
DSP技术深度解析:原理、实践与应用
DSP技术深度解析:原理、实践与应用
12 1
|
4天前
|
机器学习/深度学习 人工智能 算法
AI作画原理及相关理论解析
本文探讨了AI作画,特别是深度学习技术如何驱动这一艺术形式的发展。AI作画基于卷积神经网络(CNN),通过学习艺术作品风格和内容生成新作品。流程包括数据收集、模型训练、风格迁移和后处理。文章介绍了风格迁移理论,包括内容损失和风格损失,以及生成对抗网络(GAN)的基本概念。提供的代码示例展示了使用TensorFlow和Keras实现风格迁移的简化过程。为了优化结果,可以调整优化器、权重参数、模型选择及图像处理技术。
|
4天前
|
机器学习/深度学习 数据采集 人工智能
【热门话题】AI作画算法原理解析
本文解析了AI作画算法的原理,介绍了基于机器学习和深度学习的CNNs及GANs在艺术创作中的应用。从数据预处理到模型训练、优化,再到风格迁移、图像合成等实际应用,阐述了AI如何生成艺术作品。同时,文章指出未来发展中面临的版权、伦理等问题,强调理解这些算法对于探索艺术新境地的重要性。
17 3
|
6天前
|
JavaScript 前端开发 开发者
深入比较Input、Change和Blur事件:Vue与React中的行为差异解析
深入比较Input、Change和Blur事件:Vue与React中的行为差异解析

推荐镜像

更多