Vue2.x与Vue3.x的双向绑定原理

双向的绑定的原理

通过Object.defineproperty()重新定义对象属性的set方法get方法来实现的,从这个属性中取值时会触发get方法,改变这个属性时会触发set方法,所以我们只要将一些需要更新view的方法放在这里面就可以实现data更新view了,而view更新data其实可以通过事件监听实现

  • 视图上的数据发生改变时, data 中的数据也发生改变
  • data 中的数据发生改变时,视图中的数据也发生改变
Object.defineProperty()
  • Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。

    • 语法Object.defineProperty(obj, prop, descriptor)

    • 参数

      • obj
        要定义属性的对象。
      • prop
        要定义或修改的属性的名称或 Symbol 。
      • descriptor
        要定义或修改的属性描述符。
    • 返回值
      被传递给函数的对象。

  • 对象里目前存在的属性描述符有两种主要形式:数据描述符存取描述符。数据描述符是一个具有值的属性,该值可以是可写的,也可以是不可写的。存取描述符是由 getter 函数setter 函数所描述的属性。一个描述符只能是这两者其中之一;不能同时是两者

  • 作用
    * 可以给对象的一个属性设置两个方法:
    * get:从这个属性中取值时会触发get方法
    * set:给这个属性赋值时会触发set方法

  let obj = {}
  // 给obj的name属性设置两个方法get&set
  Object.defineProperty(obj,'name',{
    set:function (value){//value就是给name赋值的结果
      console.log('触发了set');
      this._name=value//保存这个值  这里不能直接用name,因为会触发set
    },
    get:function(){
      console.log('触发了get');
      // 将保存的值返回回来
      return this._name
    }
  })

在这里插入图片描述

  • 在给name属性赋值的时候触发set方法,在set方法中将值存起来
  • 取值时触发get方法,在get方法中将值返回回来

vue2.x双向绑定原理

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <!-- 这里相当于V -->
  <div id="v"></div>
  <input type="text" id="ipt">
</body>
<script>
  // MVVM:
  // 当V改变,M自动改变
  // 当M改变,V自动改变
  // 这里相当于M

  let data = {}
  // 给data中的name属性设置两个方法get ,set
  Object.defineProperty(data,'name',{
    set:function(value){
      // 当M改变时,V自动改变
      document.querySelector('#v').innerHTML = value
    },
    get:function(){
      return this._name
    }
  })
  // 给input添加一个内容改变的之后会触发的事件
  document.querySelector('#ipt').oninput = function(e){
    data.name = e.target.value
  }
</script>
</html>
  • 一旦输入框中的内容发生改变,就会触发oninput事件马上改变data中的内容,一旦data中的name发生改变就会触发set方法将最新的值赋值给v,这样就实现了数据的双向绑定
    在这里插入图片描述

vue3.x双向绑定原理

  • Vue3.x是通过proxy(代理)实现的数据的双向绑定
proxy
  • Object.defineProperty一样也可以给对象的属性添加两个方法get&set
  • 区别:
    • Object.defineProperty一次性只能给对象的一个属性添加get&set方法
    • Proxy:一次性给对象所有属性都设置get&set方法
  • 用法:
    • 创建一个新的proxy对象
	let p  = new Proxy(obj,{get:function(){},set:function(){}})
<script>
  let obj = {}
  let p = new Proxy(obj,{
    get:function(obj,prop){
      //obj :被代理的对象  prop:要操作的属性
      console.log('触发了get');
      return obj[prop]
    },
    set:function(obj,prop,value){
      // obj:被代理的对象
      // prop要赋值的属性
      // value要赋值的结果
      console.log('触发了set');
      // 将赋值的结果保存起来
      obj[prop] = value
    }
  })
</script>

在这里插入图片描述
vue3.x实现数据的双向绑定

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue2.x中,父组件与子组件之间的双向绑定问题可以通过使用v-model和自定义事件来解决。 首先,在父组件中,使用v-model指令来绑定一个属性,同时在子组件中使用props接受这个属性,并定义一个名为value的属性接收这个属性的值。这样就可以实现父组件向子组件的单向数据传递。 然后,在子组件中,通过emit方法来触发一个自定义事件,并传递一个参数来通知父组件更新数据。父组件在接收到这个自定义事件后,可以通过更新绑定的属性来实现子组件向父组件的单向数据传递。 但是要实现父组件与子组件的双向绑定,就需要在子组件中使用v-model指令来绑定一个名为value的属性,并在子组件中通过$emit方法来触发一个名为input的自定义事件,并传递参数来更新父组件的值。 具体步骤如下: 1. 在父组件中,使用v-model指令来绑定一个名为value的属性,同时在子组件中定义一个名为value的属性来接收这个值。 父组件: <template> <ChildComponent v-model="parentData"></ChildComponent> </template> 子组件: <template> <input :value="value" @input="$emit('input', $event.target.value)"> </template> props: ['value'] 2. 在子组件中,通过$emit方法来触发一个名为input的自定义事件,并传递参数来更新父组件的值。 子组件: <template> <input :value="value" @input="$emit('input', $event.target.value)"> </template> props: ['value'] 在父组件中,可以通过监听这个名为input的自定义事件来更新父组件的值。 父组件: <template> <ChildComponent v-model="parentData"></ChildComponent> </template> data() { return { parentData: '' } }, methods: { updateParentData(value) { this.parentData = value; } }, components: { ChildComponent }, watch: { parentData(value) { this.updateParentData(value); } } 这样就可以实现父组件与子组件之间的双向绑定问题解决了。当子组件的输入框内容发生改变时,会通过emit方法触发input自定义事件通知父组件更新数据;同时父组件监听父组件的值变化并更新,实现双向绑定

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值