nextTick的作用

相当于window.onload;
使用nextTick就能再组件加载完了以后才运行。

nextTick的使用场景

当改变数据,视图没有按预期渲染时;都应该考虑是否是因为本需要在dom执行完再执行,然而实际却在dom没有执行完就执行了代码,如果是就考虑使用将逻辑放到nextTick中,有的时候业务操作复杂,有些操作可能需要更晚一些执行,放在nextTick中仍然没有达到预期效果,这个时候可以考虑使用setTimeout,将逻辑放到宏任务中。

如何使用

语法:Vue.nextTick([callback, context])
参数:
{Function} [callback]:回调函数,不传时提供promise调用
{Object} [context]:回调函数执行的上下文环境,不传默认是自动绑定到调用它的实例上。

案例一 生命周期函数中的使用

		<div id='app'>
			<h2>{{msg}}</p>
		</div>
		<script>
			var vm = new Vue({
				el: '#app',
				data: {
					msg:"hello"
				},
				methods: {},
				beforeCreate(){
					console.log(this.msg)
					this.$nextTick(()=>{
						console.log(this.msg)
						this.msg="ljy666"
					})
				}
				
			})
		</script>

在这里插入图片描述
可以看到我们直接在beforeCreate中去获取data中的msg是没有定义的,而放在nextTick中就可以获取并更改了

案例二 ECharts引入

直接引入会导致无法获取到box中的宽高

		<script src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/vue/2.6.12/vue.js"></script>
		<script src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/echarts/5.3.0-rc.1/echarts.js"></script>
	</head>
	<body>
		<style type="text/css">
			.box {
				width: 500px;
				height: 500px;
			}
		</style>
		<div id='app'>
			<div class="box" v-echarts>

			</div>
		</div>
		<script>
			var vm = new Vue({
				el: '#app',
				directives: {
					echarts: {
						inserted(el) {
                           Vue.nextTick(()=>{
							   var myChart = echarts.init(el);
							   let options={
							   	title: {
							   		text: 'Referer of a Website',
							   		subtext: 'Fake Data',
							   		left: 'center'
							   	},
							   	tooltip: {
							   		trigger: 'item'
							   	},
							   	legend: {
							   		orient: 'vertical',
							   		left: 'left'
							   	},
							   	series: [{
							   		name: 'Access From',
							   		type: 'pie',
							   		radius: '50%',
							   		data: [{
							   				value: 1048,
							   				name: 'Search Engine'
							   			},
							   			{
							   				value: 735,
							   				name: 'Direct'
							   			},
							   			{
							   				value: 580,
							   				name: 'Email'
							   			},
							   			{
							   				value: 484,
							   				name: 'Union Ads'
							   			},
							   			{
							   				value: 300,
							   				name: 'Video Ads'
							   			}
							   		],
							   		emphasis: {
							   			itemStyle: {
							   				shadowBlur: 10,
							   				shadowOffsetX: 0,
							   				shadowColor: 'rgba(0, 0, 0, 0.5)'
							   			}
							   		}
							   	}]
							   }
							   myChart.setOption(options)
						   })
						}
					}
				}
			})
		</script>

在这里插入图片描述

Logo

前往低代码交流专区

更多推荐