vue中的this.$nextTick 到底完成了什么

this.$nextTick 到底完成了什么

先看一下官网的解释

将回调延迟到下次 DOM 更新循环之后执行。在修改数据之后立即使用它,然后等待 DOM 更新。它跟全局方法 Vue.nextTick 一样,不同的是回调的 this 自动绑定到调用它的实例上。


每个字都看的懂但是组合起来就有点蒙了…
在网上看了几篇博客渐渐有了一些自己的理解


前言

Vue生命周期的created()钩子函数是一般是不能进行DOM操作的,因为在created()中挂载阶段还没开始$el现在还拿不到就没办法对DOM进行操作.
如果一定要进行DOM操作就把对DOM进行操作的代码放到Vue.nextTick的回调函数中,与之对应的就是mounted钩子函数,因为该钩子函数执行时所有的DOM挂载和渲染都已完成,此时在该钩子函数中进行任何DOM操作都不会有问题


一、nextTick作用

在实际项目中不可避免需要,这时候要就可以用nextTick 实现所想的效果

二、使用

1.示例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <div @click="currentBut" ref="test">{{message}}</div>
    </div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            message: '蓝骑士'
        },
        created() {
            console.log(this.$refs.test)
            this.$nextTick(function() {
                console.log(this.$refs.test)
            })
        },
        methods: {
            currentBut() {
                console.log(this.$refs.test)
            }
        }
    })
</script>
</html>

以上例子运行,第一个打印的是什么? ----------------第二个第二个运行打印的什么?
undifande
<div>蓝骑士</div>

在这里插入图片描述
在created中第一次就拿不到dom里面的数据但是使用了$nextTick之后就能拿到这个元素了

2 示例二

上面那个例子如果还不清楚,再看看这个

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
		  <div ref="test1">{{message}}</div>
		  <div v-if="message1">第一个 $nextTick: {{message1}}</div>
		  <div v-if="message2">第二个 $nextTick: {{message2}}</div>
		  <div v-if="message3">第三个 $nextTick: {{message3}}</div>
		  <button @click="currentBut">点击</button>
		</div>
	</body>
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	<script>
		var app = new Vue({
		        el: '#app',
		        data: {
		            message: '蓝骑士',
					message1: '',
					message2: '',
					message3: '',
					
		        },
		        created() {
		        },
		        methods: {
		            currentBut() {
						this.message="Blue-Knight"
						this.message1=this.$refs.test1.innerHTML
						this.$nextTick(()=>{
							this.message2=this.$refs.test1.innerHTML
						})
						this.message3=this.$refs.test1.innerHTML
		            }
		        }
		    })
	</script>
</html>

设想一下在按钮单击后会显示成什么样子?

答案出现
第一次单击
单击第一次的效果
是不是跟你设想的不一样

第二次单击

二次单击的效果
为什么第二次才是这个样子的

vue实例数据虽然发生了变化,但是dom不会立刻发生改变,所以以此会产生一些问题 nextTick就可以解决以此引发的数据不同步问题


总结

通过这两个dom 你应该知道this.$nextTick到底做了什么了,

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值