当前位置: 首页 > article >正文

Vue 3 的双向绑定原理

Vue 3 的双向绑定原理是基于 响应式系统数据劫持 技术来实现的。在 Vue 3 中,双向绑定通常是通过 v-model 指令来完成的,它本质上是数据的双向同步:当数据改变时,视图自动更新,反之,视图的修改也会更新到数据。

Vue 3 双向绑定的原理分析

1. 响应式系统(reactivity

Vue 3 使用了新的响应式系统来追踪对象属性的依赖关系。当一个数据发生变化时,Vue 会自动通知依赖的组件重新渲染。

  • Proxy API:Vue 3 基于 Proxy 对象来实现数据的代理,这样可以在数据访问时设置拦截器(getter 和 setter),从而实现数据的响应式。
  • 依赖收集和触发更新:当组件访问某个响应式数据时,Vue 会在该属性的 getter 中收集依赖(即当前组件的渲染函数)。当该数据发生变化时,Vue 会触发 setter,通知相关的依赖(组件)更新。
2. 双向绑定的核心原理

在 Vue 中,双向绑定的关键是 v-model 指令。我们通过 v-model 在父子组件之间同步数据。具体来说,Vue 通过以下几个步骤来实现双向绑定:

  1. 组件数据初始化
    在组件中,父组件会传递一个值给子组件,子组件通过 v-model 绑定该值。Vue 会通过 props 将父组件的数据传递给子组件,子组件在内部将这个值设置为响应式数据。

  2. v-model 的双向绑定

    • 在子组件中,v-model 会自动将 value 作为 props,并且会把 @update:modelValue 作为事件来处理数据的双向绑定。
    • v-model 本质上会在组件中生成一个 modelValue(或通过自定义修改名称的形式)作为 props,并且会监听子组件的 @update:modelValue 事件来同步数据回父组件。
  3. 数据的同步

    • 当用户在子组件中的输入框、选择框等表单元素发生改变时,事件会触发(例如 inputchange 事件),通过 @update:modelValue 事件把新的值传递给父组件。
    • 父组件收到更新的值后,通过 v-model 再更新它的值,触发子组件重新渲染,完成双向绑定。
3. 代码示例

父组件:

<template>
  <ChildComponent v-model="parentData" />
</template>

<script>
import { ref } from 'vue'
import ChildComponent from './ChildComponent.vue'

export default {
  components: { ChildComponent },
  setup() {
    const parentData = ref('Hello World')
    return { parentData }
  }
}
</script>

子组件(ChildComponent):

<template>
  <input type="text" :value="modelValue" @input="updateValue" />
</template>

<script>
export default {
  props: {
    modelValue: {
      type: String,
      required: true
    }
  },
  emits: ['update:modelValue'],
  setup(props, { emit }) {
    const updateValue = (event) => {
      emit('update:modelValue', event.target.value)
    }
    return { updateValue }
  }
}
</script>
4. v-model 的工作原理
  • v-model 会绑定到子组件的 modelValue prop 和父组件的变量(如 parentData)。当子组件的 input 改变时,触发 @input 事件,通过 update:modelValue 事件将新的值传递回父组件,从而完成双向绑定。

总结

Vue 3 的双向绑定实现是通过:

  1. 响应式系统(Proxy + Dependency Tracking)来追踪数据变化。
  2. v-model 指令来实现父子组件间的数据同步。
  3. 事件触发和数据更新(通过 @update:modelValue)实现父子数据的双向绑定。

这种方式相比于 Vue 2 中的 Object.definePropertydata 方式,Vue 3 的响应式系统更加高效且易于扩展。


http://www.kler.cn/a/416455.html

相关文章:

  • 拥抱 OpenTelemetry:阿里云 Java Agent 演进实践
  • 宠物领养平台构建:SpringBoot技术路线图
  • mac访达打开终端
  • SpringBoot整合Validation数据校验
  • Flutter 版本管理工具FVM
  • w~视觉~合集26
  • go结构体匿名“继承“方法冲突时继承优先顺序
  • doris避坑之端口冲突
  • uniapp在小程序连接webScoket实现余额支付
  • LED室内显示屏的性能优化分析和电压管理
  • 外卖商城平台的微信小程序ssm+论文源码调试讲解
  • Nvidia 推出最新 AI 音频模型,可制作前所未有的声音
  • Hive元数据表解析
  • dbeaver如何批量执行sql脚本
  • 像素流送api ue多人访问需要什么显卡服务器
  • 【Python】Selenium模拟在输入框里,一个字一个字地输入文字
  • Ubuntu中的apt update 和 apt upgrade
  • 基于@ohos/axios深入学习HarmonyOS Next的网络数据请求
  • Cookie跨域
  • uniapp H5支付宝支付
  • 编译faiss的C++ API
  • 什么是撞库、拖库和洗库?
  • 有关物流无人机与快递配送的协同研究
  • 中断响应过程
  • 川崎Kasawaki机器人维修冲突检测
  • PHP 循环 - While 循环