Vue--如何自己实现双向数据绑定v-model ?

Vue2的响应式依赖于数据劫持和发布订阅者模式,通过Object.defineProperty()实现数据监听。Vue3则使用Proxy和ReactiveAPI。v-model是双向数据绑定的语法糖,基于事件和属性结合,如input事件和value属性。它在自定义组件中通过props和emit实现数据传递,完成双向绑定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Vue 响应式实现原理

        vue2响应式的原理是借助数据劫持发布订阅者模式

        1、数据劫持:

        目的:能够感知到数据的改变。

        数据劫持是:使用ES5的Object.defineProperty()。把data配置项中的所有数据进行遍历,转成setter和getter(或者说,给每个属性增加set和get函数)既就是:访问器属性。

        2、发布订阅者模式:

        目的:当数据改变时,(直接和间接)使用该数据的模板处都会有相应的改变(模板会重新渲染)

        Vue 3 的响应式原理基于 Proxy 对象和 Reactive API 实现

2. Vue v-model双向数据绑定实现原理

        v-model 指令是 Vue 提供的一个语法糖,它可以在表单控件上双向绑定数据。

        实际上,v-model 的背后是一个与组件相同的语法糖,其原理也是基于组件的通信功能。

        v-model的本质是利用事件和属性的结合,例如:

                1)、针对文本框(单行和多行):value属性和input事件。 如果加上修饰符 lazy。事件变成了change事件。

                2)、针对radio:使用的checked属性和change事件。同时,需要给radio加上value属性。

                3)、针对checkbox:使用的checked属性和change事件。

                        3.1)、如果应用在多选时,需要给checkbox加上value属性。

                        3.3)、如果应用在单选时,不需要加。

                4)、针对select:使用value属性和change事件。

        以下是 v-model 实现原理的详细步骤:

        1. 将表单控件封装成自定义组件 

                通过将表单控件封装成自定义组件,我们可以使用组件的 props 和 emit 方法方便地处理数据的双向绑定。

<template>
  <input :value="innerValue" @input="onInput">
</template>

<script>
export default {
  name: 'MyInput',
  props: {
    value: String,
  },
  emits: ['update:value'],
  
  data() {
    return {
      innerValue: this.value,
    };
  },
  
  methods: {
    onInput(event) {
      this.innerValue = event.target.value;
      this.$emit('update:value', this.innerValue);
    },
  },
};
</script>

        2. 在父组件中使用自定义组件绑定 v-model

        在父组件中使用自定义组件的方式与原生的表单控件相同,只需要将 v-model 绑定到自定义组件的 value 属性即可

<template>
  <my-input v-model="message"></my-input>
</template>

<script>
import MyInput from './MyInput.vue';

export default {
  components: {
    MyInput,
  },
  
  data() {
    return {
      message: '',
    };
  },
};
</script>

     在这里, v-model="message" 等价于 :

  value="message" @update:value="value => message = value"

      也就是在一个自定义组件上使用 v-model 实际上是语法糖,将 value 属性和 update:value 事件绑定起来了。

 


在 Vue.js 中 v-model 主要是通过自定义组件的方式实现的。可以通过将原生表单控件封装成一个带有 props 和emit 的组件,并且在父组件中以 v-model 方式使用该组件,来完成数据的双向绑定。 

 

         

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小可乐吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值