详解vue中$nextTick和$forceUpdate的用法
1、$nexttick
vm.$nexttick( [callback] )
this.$nexttick()将回调延迟到下次 dom 更新循环之后执行,在修改数据之后立即使用它,然后等待 dom 更新。它跟全局方法 vue.nexttick 一样,不同的是回调的 this 自动绑定到调用它的实例上。
应用场景:
1、 在vue生命周期的created()钩子函数进行的dom操作一定要放在vue.nexttick()的回调函数中。
2、 因为在created()钩子函数执行的时候dom 其实并未进行任何渲染,而此时进行dom操作无异于徒劳,所以此处一定要将
dom操作的js代码放进vue.nexttick()的回调函数中。与之对应的就是mounted()钩子函数,因为该钩子函数执行时所有的dom挂载和渲染都已完成,此时在该钩子函数中进行任何dom操作都不会有问题 。
在数据变化后要执行的某个操作,而这个操作需要使用随数据改变而改变的dom结构的时候,这个操作都应该放进vue.nexttick()的回调函数中。
<html> <head> <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script> </head> <body> <div id="app"> <section> <div ref="hello"> <h1>hello world ~</h1> </div> <button type="danger" @click="get">点击</button> </section> </div> </body> </html> <script> new vue({ el: '#app', methods: { get() { console.log(0); } }, mounted() { console.log(333); console.log(this.$refs['hello']); this.$nexttick(() => { console.log(444); console.log(this.$refs['hello']); }); }, created() { console.log(111); console.log(this.$refs['hello']); this.$nexttick(() => { console.log(222); console.log(this.$refs['hello']); }); } }) </script>
可以根据打印的顺序看到,在created()钩子函数执行的时候dom 其实并未进行任何渲染,而此时进行dom操作并无作用,而在created()里使用this.$nexttick()可以等待dom生成以后再来获取dom对象。
<html> <head> <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script> </head> <body> <div id="app"> <section> <h1 ref="hello">{{ value }}</h1> <button type="danger" @click="get">点击</button> </section> </div> </body> </html> <script> new vue({ el: '#app', data() { return { value: 'hello world ~' }; }, methods: { get() { this.value = '你好啊'; console.log(this.$refs['hello'].innertext); this.$nexttick(() => { console.log(this.$refs['hello'].innertext); }); } }, mounted() { }, created() { } }) </script>
this.$nexttick()在页面交互,尤其是从后台获取数据后重新生成dom对象之后的操作有很大的优势。
2、this.$forceupdate()
迫使vue实例重新(rander)渲染虚拟dom,注意并不是重新加载组件。结合vue的生命周期,调用$forceupdate后只会触发beforeupdate和updated这两个钩子函数,不会触发其他的钩子函数。它仅仅影响实例本身和插入插槽内容的子组件,而不是所有子组件;
应用场景: 当在data里没有显示的声明一个对象的属性,而是之后给该对象添加属性,这种情况vue是检测不到数据变化的,可以使用$forceupdate()
html: <span class="test">{{egdata.value}}</span> <el-button @click="changedata">改变</el-button> ------------------------------- js: data(){ return { egdata: {} } } ------------------------------- methods:{ changedata () { this.egdata.value = 'oldvalue' this.$forceupdate() // dom会更新 } }
但是这种做法并不推荐,官方说如果你现在的场景需要用forceupdate方法 ,那么99%是你的操作有问题,如上data里不显示声明对象的属性,之后添加属性时正确的做法时用 vm.$set() 方法,所以forceupdate请慎用。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。