vue的响应式和异步更新队列-----nextTick()的用法

在这里插入图片描述在这里插入图片描述
图解
在这里插入图片描述
事件循环:
第一个 tick(图例中第一个步骤,即’本次更新循环’):

首先修改数据,这是同步任务。同一事件循环的所有的同步任务都在主线程上执行,形成一个执行栈,此时还未涉及 DOM 。
Vue 开启一个异步队列,并缓冲在此事件循环中发生的所有数据改变。如果同一个 watcher 被多次触发,只会被推入到队列中一次。
第二个 tick(图例中第二个步骤,即’下次更新循环’):

同步任务执行完毕,开始执行异步 watcher 队列的任务,更新 DOM 。Vue 在内部尝试对异步队列使用原生的 Promise.then 和 MessageChannel 方法,如果执行环境不支持,会采用 setTimeout(fn, 0) 代替。

第三个 tick(图例中第三个步骤):

此时就是文档所说的

下次 DOM 更新循环结束之后
此时通过 Vue.nextTick 获取到改变后的 DOM 。通过 setTimeout(fn, 0) 也可以同样获取到。

简单总结事件循环:

同步代码执行 -> 查找异步队列,推入执行栈,执行Vue.nextTick[事件循环1] ->查找异步队列,推入执行栈,执行Vue.nextTick[事件循环2]…

总之,异步是单独的一个tick,不会和同步在一个 tick 里发生,也是 DOM 不会马上改变的原因。

对于事件循环,可以在这里查看更详细的内容: https://segmentfault.com/a/11…

用途

应用场景:需要在视图更新之后,基于新的视图进行操作。
created、mounted
需要注意的是,在 created 和 mounted 阶段,如果需要操作渲染后的试图,也要使用 nextTick 方法。
官方文档说明:
注意 mounted 不会承诺所有的子组件也都一起被挂载。如果你希望等到整个视图都渲染完毕,可以用 vm.KaTeX parse error: Expected '}', got 'EOF' at end of input: …on () { this.nextTick(function () {
// Code that will run only after the
// entire view has been rendered
})
}

其他应用场景
其他应用场景如下三例:

例子1:

点击按钮显示原本以 v-show = false 隐藏起来的输入框,并获取焦点。

showsou(){
this.showit = true //修改 v-show
document.getElementById(“keywords”).focus() //在第一个 tick 里,获取不到输入框,自然也获取不到焦点
}
修改为:

showsou(){
this.showit = true
this.$nextTick(function () {
// DOM 更新了
document.getElementById(“keywords”).focus()
})
}
例子2:

点击获取元素宽度。

{{ message }}

getMyWidth() {
this.showMe = true;
//this.message = this. r e f s . m y W i d t h . o f f s e t W i d t h ; / / 报 错 T y p e E r r o r : t h i s . refs.myWidth.offsetWidth; //报错 TypeError: this. refs.myWidth.offsetWidth;//TypeError:this.refs.myWidth is undefined
this.KaTeX parse error: Expected '}', got 'EOF' at end of input: …message = this.refs.myWidth.offsetWidth;
})
}
例子3:

使用 swiper 插件通过 ajax 请求图片后的滑动问题。

实例理解 nextTick 应用
下面的例子来自 https://www.cnblogs.com/hity-…, 稍有改动。各位可以复制运行一遍,加深理解。

  • {{item}}
  • {{item}}
  1. {{item}}
  1. {{item}}
  1. {{item}}

}

结果:
在这里插入图片描述
总结:每次监听到数据变化,不会立马更新到视图中,而是放进异步队列,等下一个时间循环(就是同步任务的主线程执行完),就会去执行异步回调的任务(此时会去更新到dom中)。所有当你改变了数据,想要得到更新后的dom,需要nextTick()这个方法了。(平时自己再校验的时候,这个事件循环机制肉眼看不见过程,所有你会发现你改变data的属性数据,视图立马就更新了,但是这中间是有一个过程的)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值