1.nextTick例子
- ①🌵:创建一个vue实例-vm
- ②🌵:通过
vm.message='爱琳琳真的是太好了'去修改vue里面的实例数据 - ③🌵:修改数据后,再直接通过
vm.$el.textContent去获取vue实例中的数据,发现并没有变化,打印结果仍然是--小马哥 - ④🌵:使用Vue.nextTick方法:
- ⚠️需要注意的是,vue的数据发生改变了,并不是立刻渲染到dom页面上的,可以在数据变化之后立即使用Vue.nextTick 在当前的回调函数中能获取最新的DOM
- ⑤🌵:这次
vm.$el.textContent的打印结果变成了爱琳琳真的是太好了
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app">
<h3>{{message}}</h3>
</div>
<script src="./vue.js"></script>
<script>
//①🌵
const vm = new Vue({
el:'#app',
data:{
message:'小马哥'
}
})
//②🌵
vm.message = '爱琳琳真的是太好了';
console.log(vm.$el.textContent); //③🌵小马哥
// 为了数据变化之后等待vue完成更新DOM,可以在数据变化之后立即使用Vue.nextTick 在当前的回调函数中能获取最新的DOM
//④🌵
Vue.nextTick(()=>{
console.log(vm.$el.textContent); // ⑤🌵爱琳琳真的是太好了
})
</script>
</body>
</html>
2.nextTick的应用
🍊需求:
-
在页面拉取一个接口,这个接口返回一些数据,这些数据是这个页面的一个浮层组件要依赖的,
然后我在接口一返回数据就展示了这个浮层组件。
-
展示的同时,上报一些数据给后台(这些数据是父组件从接口拿的)
-
✏️问题:虽然拿到数据了,但是浮层展现的时候,这些数据还未更新到组件上去,上报失败
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id='app'>
<App></App>
</div>
<script src="./vue.js"></script>
<script>
/*
需求:
在页面拉取一个接口,这个接口返回一些数据,这些数据是这个页面的一个浮层组件要依赖的,
然后我在接口一返回数据就展示了这个浮层组件,展示的同时,
上报一些数据给后台(这些数据是父组件从接口拿的),
这个时候,神奇的事情发生了,虽然我拿到数据了,但是浮层展现的时候,
这些数据还未更新到组件上去,上报失败
*/
//浮层组件pop
const Pop = {
data() {
return {
isShow: false
}
},
props: {
name: {
type: String,
default: ''
},
},
template: `
<div v-if='isShow'>
{{name}}
</div>
`,
methods: {
show() {
this.isShow = true; //弹窗组件展示
console.log(this.name); //①结果为空的;②号打印出小马哥
}
},
}
//
const App = {
data() {
return {
name: ''
}
},
created() {
// 模拟异步请求
setTimeout(() => {
// 数据更新
this.name = '小马哥';
//this.$refs.pop.show(); ①号🌵
this.$nextTick(()=>{
this.$refs.pop.show(); //②号🌵
})
}, 1000);
},
components: {
Pop
},
template: `<pop ref='pop' :name='name'></pop>`
}
const vm = new Vue({
el: '#app',
components: {
App
}
})
</script>
</body>
</html>
- ①号🌵:这个位置执行的时候,虽然页面的数据更新了,但是控制台打印出的结果是空的。
- ②号🌵:使用$nextTick函数的回调函数后,也就是在②号位置调用后,控制台可以打印出结果
小马哥