我们知道VUE是异步更新队列,详情见官网http://doc.vue-js/v2/guide/reactivity.html
通过官网,我们也可以知道$nextTick是在DOM渲染之后执行的方法,初次接触可能有点蒙,哥呢,就是懒,利用菜鸟编译器就动手了。这上面的东西也是非常好,来个连接:https://www.runoob/vue2/vue-watch.html
下面来两个实例助你理解并可以写这部分代码:
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
</head>
<body>
<script src="https://unpkg/vue/dist/vue.js"></script>
<div class="app">
<div ref="msgDiv">{{msg}}</div>
<div v-if="msg1">在$nextTick之前渲染: {{msg1}}</div>
<div v-if="msg2">$nextTick渲染: {{msg2}}</div>
<div v-if="msg3">在$nextTick之后渲染: {{msg3}}</div>
<button @click="changeMsg">
点击触发
</button>
</div>
<script type="text/javascript">
new Vue({
el: '.app',
data: {
msg: 'Hello Vue.',
msg1: '',
msg2: '',
msg3: ''
},
methods: {
changeMsg() {
this.msg = "Hello world."
alert("1")
this.msg1 = this.$refs.msgDiv.innerHTML
alert("2")
this.$nextTick(() => {//证明它是最后运行的
this.msg2 = this.$refs.msgDiv.innerHTML
alert("3")
})
this.msg3 = this.$refs.msgDiv.innerHTML
alert("4")
}
}
})
</script>
</body>
</html>
上面这个例子是通过按钮绑定的事件,其执行顺序是$nextTick最后执行,结果也是DOM
渲染之后的结果。到这理解了,但是还写不了代码,那在看下面这个例子。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 测试实例 - 菜鸟教程(runoob)</title>
<script src="https://cdn.staticfile/vue/2.4.2/vue.min.js"></script>
</head>
<body>
<div id = "computed_props">
千米 : <input type = "text" v-model = "kilometers">
米 : <input type = "text" v-model = "meters">
</div>
<p id="info"></p>
<script type = "text/javascript">
var vm = new Vue({
el: '#computed_props',
data: {
kilometers : 0,
meters:0
},
methods: {
},
computed :{
},
watch : {
kilometers:function(val) {
this.kilometers = val;
this.meters = this.kilometers * 1000;
this.$nextTick(() => {
this.meters = this.kilometers * 0;//很调皮,让这个值一直为0
})
},
meters : function (val) {
this.kilometers = val/ 1000;
this.meters = val;
}
}
});
// $watch 是一个实例方法
vm.$watch('kilometers', function (newValue, oldValue) {
// 这个回调将在 vm.kilometers 改变后调用
document.getElementById ("info").innerHTML = "修改前值为: " + oldValue + ",修改后值为: " + newValue;
})
</script>
</body>
</html>
由于每次DOM渲染完都要执行
this.$nextTick(() => {
this.meters = this.kilometers * 0;//很调皮,让这个值一直为0
})
所以总是框总是为0,删了就回复了。
相信运行了这两个实例后就可以下手写代码了。哈哈
更多推荐
两个例子教你弄懂VUE中的$nextTick
发布评论