vue 異步更新隊列 $nextTick

Vue 異步執行 DOM 更新。只要觀察到數據變化,Vue 將開啓一個隊列,並緩衝在同一事件循環中發生的所有數據改變。如果同一個 watcher 被多次觸發,只會被推入到隊列中一次。如果你想在 DOM 狀態更新後做點什麼,這就可能會有些棘手。雖然 Vue.js 通常鼓勵開發人員沿着“數據驅動”的方式思考,避免直接接觸 DOM,但是有時我們確實要這麼做。爲了在數據變化之後等待 Vue 完成更新 DOM ,可以在數據變化之後立即使用 Vue.nextTick(callback)

下面寫一個 柱狀圖自適應寬度的demo

直接上代碼

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style type="text/css">
		.box{
			width: 200px;
			height: 200px;
			border: 1px solid skyblue;
		}
		.case{
			width: 100%;
			height: 200px;
		}
		.cWidth{
			width : 400px;
		}
	</style>
</head>
<body>
	<div id="app">
		<div :class="{box : true, cWidth : changeWidth}">
			<div class="case" id="demo"></div>
		</div>
		<button @click="changeW">改變寬</button>
	</div>
</body>	
	<script src="https://cdn.bootcss.com/vue/2.5.11/vue.js"></script>
	<script src="https://cdn.bootcss.com/echarts/4.0.2/echarts.min.js"></script>
	<script type="text/javascript">
		var vm = new Vue({
			el: "#app",
			data : {
				changeWidth : false,
				chart : null
			},
			mounted(){
				var demo = document.getElementById("demo");
				let myChart = echarts.init(demo);
				this.chart = myChart;
		        myChart.setOption({
		            title: { text: '在Vue中使用echarts' },
		            tooltip: {},
		            xAxis: {
		                data: ["襯衫","羊毛衫","雪紡衫","褲子","高跟鞋","襪子"]
		            },
		            yAxis: {},
		            series: [{
		                name: '銷量',
		                type: 'bar',
		                data: [5, 20, 36, 10, 10, 20]
		            }]
		        });
			},
			methods :{
				changeW : function(){
					this.changeWidth = !this.changeWidth;//改變寬度
					// this.chart.resize();//如果直接resize,柱狀圖並不會自適應寬度
					this.$nextTick(()=>{//在Dom更新後調用resize,柱狀圖就會自適應
						this.chart.resize();
					})
				}
			}
		})
	</script>
</html>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章