Vue的双向数据绑定的原理

VUE实现双向数据绑定的原理就是利用了 Object.defineProperty() 这个方法重新定义了对象获取属性值(get)和设置属性值(set)的操作来实现的
Object.defineProperty可以传递三个参数:defineProperty的用法var obj = { };var name;//第一个参数:定义属性的对象。//第二个参数:要定义或修改的属性的名称。//第三个参数:将被定义或修改的属性描述符。
双向数据绑定,model2

<body>
		<input type = "text"
		id = "text1"/>
		<p id = "text2"></p>
	</body>
	<script type="text/javascript">
		var input1 = document.querySelector("#text1");
		var input2 = document.querySelector("#text2");
		var data = {};
		Object.defineProperty(data, "text12", {
			configurable: true,
			get: function() {
			    console.log('调用get')
				return data
			},
			set: function(newValue) {
				input2.innerHTML = newValue;
			}
		})
		//赋值的时候是监听的set方法
		input1.addEventListener("keyup",function(e){
			data.text12 = e.target.value;
		})
	    //当使用data的时候调用get的方法
		data.text12;
	</script>

vue是双向绑定响应式更新视图的,这个自动更新视图主要是针对在data里面存在的属性或者对象的键,比如有个data:{ test : ‘test’};这里修改 test的值就可以自动更新相关的视图,但是如果你后来添加一个进去然后修改 是没法自动更新的,这就涉及vue的双向绑定原理啦,vue 默认的是给data 属性 添加到侦察器(发布者——订阅者模式)上观察,如果有变化就响应视图更新,后面新增的属性和对象是没有做这个添加到观察器的这步操作的,需要手动添加,就需要用到他的set方法来。
Vue 数组:
数组无法实现view视图改变,但是数据发生了改变,如果重新赋值可以实现view更新

<ul>
   <li v-for="item in arr" :key='item'>{{item}}</li>
 </ul>
<p>{{msg}}</p>
 data:{
     arr:[1,2,3],
      msg:[]
   },
    methods:{
     changeArr(){
      //改变数据无法实现view更新,只能实现数据改变
        this.arr[2]='999'
       如果重新赋值可以实现view更新
       //  this.msg=this.arr
        console.log(this.arr)
     }
   }
数组更新视图
changeArr(){
/* 第一种直接改变数据 无法改变view*/
//  this.arr[2]='999'
//  this.msg=this.arr
/* 第二种 $set 改变数据可以改变view */
// module.$set(this.arr,1,'$set')
/* 第三种通过数组的方法实现view改变 */
  this.arr.splice(0, 1,'change')
}
对象更新视图
changeObj(){
   /* 第一种 可以实现视图更新 */
   //  this.obj.sex='女'
   /* 第二种 $set 实现视图更新 */
   module.$set(this.obj,'sex', '女')
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值