Vue—监听属性

vue监听属性_watch

类似于Java中的监听器,用于监听vue中的数据变化

    <div id = "computed_props">
         千米 : <input type = "text" v-model = "kilometers">
         米 : <input type = "text" v-model = "meters">
      </div>
	   <p id="info"></p>
      <script type = "text/javascript">
         var vm = new Vue({
            el: '#computed_props',
            data: {
               kilometers : 0,
               meters:0
            },
            methods: {
            },
            computed :{
            },
            watch : {
               kilometers:function(val) {
                  this.kilometers = val;
                  this.meters = this.kilometers * 1000
               },
               meters : function (val) {
                  this.kilometers = val/ 1000;
                  this.meters = val;
               }
            }
         });
         // $watch 是一个实例方法
		vm.$watch('kilometers', function (newValue, oldValue) {
			// 这个回调将在 vm.kilometers 改变后调用
		    document.getElementById ("info").innerHTML = "修改前值为: " + oldValue + ",修改后值为: " + newValue;
		})
      </script>

深度监视

监听多级结构多层变化

当被监测对象不是普通变量(比如对象)时,被对象内的(属性)数据变化无法直接监测,因为对象的值保存的是地址,只有当地址发生变化时,才能被watch监测到

所以当被监测对象是一个对象而不是普通变量时,要监测它内部的所有属性(数据)变化时,可以加上 deep:true(deep默认为false)

immediate:ture//初始化时调用方法

<body>
<div id="root">
			
			<h3>a的值是:{{numbers.a}}</h3>
		  <!--numbers对象中的属性a的值发生了变化,但numbers的值保存的是a的地址,a的地址没有发生变化,故numbers的值不变-->
			<button @click="numbers.a++">点我让a+1</button>
			<!--numbers对象中的属性b的值发生了变化,但numbers的值保存的是b的地址,b的地址没有发生变化,故numbers的值不变-->
			<h3>b的值是:{{numbers.b}}</h3>
			<button @click="numbers.b++">点我让b+1</button>
			<!--numbers保存的地址发生变化,故numbers的值改变,能被watch监听到-->
			<button @click="numbers = {a:666,b:888}">彻底替换掉numbers</button>
			{{numbers.c.d.e}}
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
		
		const vm = new Vue({
			el:'#root',
			data:{
				
				numbers:{
					a:1,
					b:1,
					c:{
						d:{
							e:100
						}
					}
				}
			},
		,
			watch:{
				//监视多级结构中某个属性的变化
				/* 'numbers.a':{
					handler(){
						console.log('a被改变了')
					}
				} */
				//监视多级结构中所有属性的变化
				numbers:{
				//immediate:ture//初始化时调用handler()
					deep:true,
					handler(){
						console.log('numbers改变了')
					}
				}
				//简写,使用简写时deep,immediate等其他属性不能写
				numbers(newValue, oldValue){
						console.log('numbers改变了');
				}
			}
		})

	</script>

watch与computer

  1. computer能完成的,watch也可以完成
  2. watch能开启异步任务,computer不能开启异步任务
this指向vue实例方法

1.所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm 或 组件实例对象。
2.所有不被Vue所管理的函数(定时器的回调函数、ajax的回调函数等、Promise的回调函数),最好写成箭头函数, 这样this的指向才是vm 或 组件实例对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值