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

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.lryc.cn/news/494512.html

相关文章:

  • 如何使用 Chrome 无痕浏览模式访问网站?
  • Idea 2024.3 突然出现点击run 运行没有反应,且没有任何提示。
  • 【小白学机器学习36】关于独立概率,联合概率,交叉概率,交叉概率和,总概率等 概念辨析的例子
  • Spring Boot 项目——分层架构
  • wordpress网站首页底部栏显示网站备案信息
  • python面向对象编程练习
  • OpenCV_Code_LOG
  • 力扣第 74 题是 搜索二维矩阵
  • [极客大挑战 2019]BabySQL--详细解析
  • 实现Linux平台自定义协议族
  • RL78/G15 Fast Prototyping Board Arduino IDE 平台开发过程
  • YOLOv11 NCNN安卓部署
  • 对载入的3dtiles进行旋转、平移和缩放变换。
  • Rust个人认为将抢占C和C++市场,逐渐成为主流的开发语言
  • 在openEuler中使用top命令
  • 探索文件系统,Python os库是你的瑞士军刀
  • 【小白学机器学习41】如何从正态分布的总体中去抽样? 获得指定正态分布的样本的2种方法
  • 将VSCode设置成中文语言环境
  • Applied Intelligence投稿
  • AI-agent矩阵营销:让品牌传播无处不在
  • 【0346】Postgres内核 Startup Process 通过 signal 与 postmaster 交互实现 (5)
  • NSSCTF-做题笔记
  • 【小白学机器学习35】数据表:整洁数据表,交叉表/列联表,以及两者转化pd.pivot_table()
  • springboot旅游管理系统的设计与实现
  • k8s 1.28 聚合层部署信息记录
  • 自由学习记录(25)
  • 关于函数式接口和编程的解析和案例实战
  • Linux 僵尸进程和孤儿进程, 进程优先级
  • 爬虫笔记24——纷玩岛自动抢票脚本笔记
  • 《白帽子讲Web安全》15-16章