在VUE里面ref获取dom,$ref和使用echarts,nextTick很重要

779 阅读1分钟

在VUE里面获取dom和使用echarts
去vue官网好好看看ref和nextTick
首先说一下原因吧,就是echarts里面需要使用dom来挂载画布,这就意味着我们要获取dom,获取dom的方法呢有几种,普遍的就是getElementById,在vue里面还有一种方法,就是使用ref,在标签中写上ref=“test”,在methods里面就使用this.$ref.test 就可以实现获取dom,这里要注意$ref要注意下面两点。

1、ref 需要在dom渲染完成后才会有,在使用的时候确保dom已经渲染完成。比如在生命周期 mounted(){} 钩子中调用,或者在 this.$nextTick(()=>{}) 中调用。

这里项目里面就是在mounted(){} 钩子中调用,调用后使用了if(this.$ref.test)来判断是否为空,跳过空状态。注意这个不能直接判断而不使用mounted,不然可就是真的空着的了。
this.$nextTick(()=>{})这个的意思就是说在dom状态更新之后立即执行回调函数,这就是说获取新的dom,可以看看下面的博客。记住要点,vue对dom的更新diff是异步的。
www.jianshu.com/p/98148196a…

2、如果ref 是循环出来的,有多个重名,那么ref的值会是一个数组 ,此时要拿到单个的ref 只需要循环就可以了。

www.cnblogs.com/goloving/p/…

备注:

ref 被用来给元素或子组件注册引用信息。引用信息将会注册在父组件的 $refs 对象上。如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件实例:

在上面的例子中,input的引用信息为input1 ,$refs 是所有注册过的ref的一个集合,

console.log(this.$refs.input1)//
console.log(document.getElementById('input1'))//

 这两种方法获得的都是Dom节点,而$refs相对document.getElementById的方法,会减少获取dom节点的消耗。

		<div id="app">
			<!--在组件上使用ref属性-->
			<my-component-01 ref="component01"></my-component-01>
			<button type="button" @click="getElement">点击调用子组件的方法</button>
		</div>
		
		<template id="temp01">
			<h1>{{msg}}</h1>
		</template>
		
		<script type="text/javascript">
			var vm=new Vue({
				el:'#app',
				data:{},
				methods:{
					getElement:function(){
						// 获取子组件的data
						console.log(this.$refs.component01.msg)
						
						// 调用子组件的方法
						this.$refs.component01.func()
					}
				},
				components:{
					'my-component-01':{
						template:'#temp01',
						data:function(){
							return {
								msg:'我是子组件'
							}
						},
						methods:{
							func:function(){
								alert('我是组件上的方法')
							}
						}
					}
				}
			})
		</script>
	</body>