Vue --- 区分vm.$data.msg、data.msg、vm.msg

本文探讨Vue实例中vm.$data.msg、data.msg与vm.msg的区别。Vue在创建实例时,将data对象的property加入响应式系统。vm.msg直接引用data.msg,两者通常指向同一地址,但在某些情况下,如在生命周期钩子之间赋值,仅修改data.msg不会触发视图更新。Vue实例的$data属性提供了一种访问data中属性的方式,而vm.msg则用于描述实例的msg属性,$watch监听通常基于vm对象。Vue实例还提供了许多以$开头的方法和property。

上代码:

<body>
	<div id="app">
		{{msg}}
	</div>
	<script>
		let datas = {   //声明一个名为data的对象
			msg: "hello"
		}
		let vm = new Vue({
			el: '#app',
			data: datas   //把声明的date对象赋值给date属性
		})
		//现在,有三种方法可以获取到msg的值
		console.log(datas.msg);  //=> hello
		console.log(vm.msg);	//=> hello
		console.log(vm.$data.msg);	//=> hello
		//而且,他们指向的是同一个地址
		console.log(datas.msg === vm.msg);  //=> true
		console.log(vm.msg === vm.$data.msg);	//=> true
		console.log(vm.$data.msg === datas.msg);	//=> true
	</script>
</body>

由于datas对象我们已经声明了,显然,如果datas对象的地址的指向没有改变的话,另外两个对象(即vm.msgvm.$data.msg)是引用了datas对象的地址

官方文档描述:

当一个 Vue 实例被创建时(在钩子函数beforeCreate触发之后,钩子函数created触发之前),它将 data 对象中的所有的 property 加入到 Vue 的响应式系统中。当这些 property 的值发生改变时,视图将会产生“响应”,即匹配更新为新的值。

所以vm示例下面会有一个msg属性,指向datas对象的msg属性,即vm.msg === datas.msg
暴露两个相同的属性,这样做有什么意义呢?

  1. 第一点,假如有如下情况(事实上,更常见的就是这种情况),那么你只能只用vm.msg来访问或修改属性
    let vm = new Vue({
    	el: "#app",
    	data: {
    		msg: "hello"
    	}
    })
    
  2. 第二点,你得知道两个数据指向同一个地址并不意味着什么时候他们两个对象都是等价的。例如在Node.js中,modulemodule.export虽然也指向同一个地址,但是导出的对象是以module.export为准。
    同样的道理,在Vue中监听msg的变化时是以vm.msg为准的,而data下的属性是在声明周期中的beforeCreate和created之间才被挂载的,这就意味着改变data下的且vm中不存在的属性是不会触发updatedbeforeUpdate函数的
    let data = {
    	msg: "hello"
    }
    let vm = new Vue({
    	el: '#app',
    	data: data,
    	updated:function(){   //目前只会检测vm.msg是否变化
    		console.log("update!")
    	}
    })
    vm.msg = 123;   //=> update!  vm.msg变化了,触发updated
    data.msg2 = "hello";  //没有触发updated,无输出
    

那为什么还要暴露vm.$data.msg呢?
官方描述:

除了数据 property,Vue 实例还暴露了一些有用的实例 property 与方法。它们都有前缀 $,以便与用户定义的 property 区分开来

  1. 所以当出现下述情况的时候,vm.$data.msgvm.msg能更好的描述data下的msg属性(语义上),而vm.msg用来被监听数据的变化
 	let vm = new Vue({
		el: "#app",
		data: {
			msg: "hello"
		}
	})
  1. 如官方描述,Vue示例不止暴露了$data属性,还暴露了许多属性和方法,例如可以这样使用:
    let vm = new Vue({
    	el: "#app",
    	data: {
    		msg: "hello"
    	}
    })
    console.log(vm.$el); //可以访问和修改el属性
    vm.$watch('a', function(newValue, oldValue)  {  //可以定义监听函数
    	console.log(`before: ${oldValue},after:${newValue}`)
    })
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值