this.$nextTick的用法和原理
先来看一下我遇到的问题,万一以后你们遇到了也可以尝试这样解决文章有点长,耐心看完vue项目中使用轮播图效果:使用swiper动态加载数据,动态轮播数据显示为空。在网上看了很多博主都是说保证在数据请求之后再渲染页面...
·
先来看一下我遇到的问题,万一以后你遇到了也可以尝试这样解决
文章有点长,耐心看完
vue项目中使用轮播图
效果:
使用swiper动态加载数据,动态轮播数据显示为空。在网上看了很多都是说
保证在数据请求之后再渲染页面,意思也就是说数据还没有请求成功就开始渲染页面,导致没有数据,
顺序是:先请求数据在渲染页面
然后我就把轮播图的方法写到了调用数据成功之后,数据返回成功之后,执行轮播图
…
但是还是没有什么效果
this.$nextTick()
没错,我就在调用轮播图方法的时候加了个 this.$nextTick() ,然后就好了,不会出现没有数据的那种情况了
介绍this.$nextTick()
官方给的解释:
将回调延迟到下次 DOM 更新循环之后执行。在修改数据之后立即使用它,然后等待 DOM 更新。它跟全局方法 Vue.nextTick 一样,不同的是回调的 this 自动绑定到调用它的实例上。
…难以理解…
例子:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app" @click="handleClick" ref="test">{{message}}</div>
</body>
<script>
var app = new Vue({
el: '#app',
data: {
message: 'aaa'
},
methods: {
handleClick() {
this.message = 'bbb'
console.log(this.$refs.test.innerText)
this.$nextTick(function () {
console.log(this.$refs.test.innerText)
})
}
}
})
</script>
</html>
绑定了一个点击事件,触发点击事件时,打印的值又是什么??? OK,通过控制得到结果是:
aaa
bbb
为什么已经改变了message的值,而我的输出还是aaa呢?
通过以上例子,大概明白this.nextTick是怎么用的了,但是其中背后的原理是什么呢。这是因为:
- dom更新:在vue中,你修改了data的某一个值,并不会立即反应到该ele中。vue将你对data的更 改放到watcher的一个对列中(异步),只有在当前任务空闲时才会去执行watcher队列任务。这就有一个延迟时间了。
- 当执行到 n e x t T i c k 的 时 候 , 这 是 一 个 异 步 事 件 , 他 也 会 把 这 个 事 件 放 到 一 个 队 列 当 中 , 异 步 事 件 是 不 会 立 即 执 行 的 代 码 , 会 被 j s 处 理 器 放 到 一 个 队 列 里 , 按 照 队 列 的 顺 序 优 先 级 等 一 个 个 按 次 序 执 行 , 新 添 加 的 事 件 都 会 放 在 队 列 末 尾 。 所 以 , 当 第 一 个 也 就 是 d a t a 的 修 改 执 行 渲 染 在 页 面 之 后 , 这 个 时 候 执 行 nextTick的时候,这是一个异步事件,他也会把这个事件放到一个队列当中,异步事件是 不会立即执行的代码,会被js处理器放到一个队列里,按照队列的顺序优先级等一个个按次序执行, 新添加的事件都会放在队列末尾。所以,当第一个也就是data的修改执行渲染在页面之后,这个时候执行 nextTick的时候,这是一个异步事件,他也会把这个事件放到一个队列当中,异步事件是不会立即执行的代码,会被js处理器放到一个队列里,按照队列的顺序优先级等一个个按次序执行,新添加的事件都会放在队列末尾。所以,当第一个也就是data的修改执行渲染在页面之后,这个时候执行nextTick,就肯定能获取dom的东西la。
- 同理也是,创建一个setTimeout,他也会放到队列中,当上一个事件执行完之后,才会这个他这个事件,才会执行他里面的回调,也就能成功获取啦。
懂了撒?
点个赞撒?!
更多推荐
已为社区贡献1条内容
所有评论(0)