news 2026/5/10 23:24:13

Vue 双向绑定原理剖析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue 双向绑定原理剖析

Vue 双向绑定原理剖析(Vue 3 时代完整版,2026视角)

Vue 的“双向绑定”其实是两个方向的单向流动巧妙组合的结果:

  1. 数据 → 视图:响应式系统(Reactivity)自动更新 DOM(Vue 2 用 Object.defineProperty,Vue 3 用 Proxy + Reflect)
  2. 视图 → 数据:用户交互(input、change 等事件)触发事件监听 → 更新数据

Vue 3 中v-model语法糖,底层拆分成value(或modelValue) +onInput(或update:modelValue)。

下面按层级从底层到表层完整拆解。

1. Vue 3 响应式系统核心(数据 → 视图方向)

Vue 3 放弃了 Object.defineProperty,转用Proxy(性能更好,能劫持更多操作,如数组长度变化、in 操作、delete 等)。

核心 API

  • reactive(obj)→ 返回 Proxy 代理对象
  • ref(value)→ 返回 { value: xxx } 的 Ref 对象(内部也是 Proxy 或 getter/setter)
  • computed()watch()等依赖这个系统

Proxy 实现响应式的大致原理(简化版伪代码):

functionreactive(raw){returnnewProxy(raw,{get(target,key,receiver){// 依赖收集:tracktrack(target,key);// 把当前 effect 收集到这个 key 的 deps 中constresult=Reflect.get(target,key,receiver);// 如果是对象,继续代理(深度响应式)if(isObject(result))returnreactive(result);returnresult;},set(target,key,value,receiver){constoldValue=target[key];constresult=Reflect.set(target,key,value,receiver);// 值真的变了才触发if(oldValue!==value){trigger(target,key);// 通知所有依赖这个 key 的 effect 重新运行}returnresult;},// deleteProperty、has、ownKeys 等也需要处理});}

track / trigger 机制(依赖收集与派发更新):

  • 使用 WeakMap<target, Map<key, Set>> 结构存储依赖关系
  • effect(fn)执行时会开启 activeEffect,get 时收集,set 时触发所有收集到的 effect

这就是为什么ref.value++reactiveObj.count++会自动更新视图的原因。

2. v-model 在普通 input 上的拆解(最基础形式)

<inputv-model="message"/>

编译后等价于:

<input:value="message"@input="message = $event.target.value"/>
  • :value→ 数据 → 视图(响应式触发 set → trigger → 重新渲染 value)
  • @input→ 视图 → 数据(用户输入 → 赋值给 message → 触发 set → 视图更新)

这就是最原始的双向绑定实现。

3. 组件上的 v-model(Vue 3.3+ 推荐方式:defineModel)

Vue 3.4 后defineModel正式成为宏(macro),极大简化写法。

子组件写法对比

Vue 3.3 以前(手动)

// 子组件defineProps(['modelValue']);defineEmits(['update:modelValue']);// 模板<input:value="modelValue"@input="$emit('update:modelValue', $event.target.value)"/>

Vue 3.4+(defineModel 宏,推荐)

// 子组件(一行搞定)constmodel=defineModel();// 返回一个 ref,默认绑定 modelValue + update:modelValue// 或者带选项constmodel=defineModel({required:true,default:''});// 模板(和普通 ref 一样用)<input v-model="model"/>

defineModel 内部等价实现(官方简化版):

functiondefineModel(options){constprops=useProps();constemit=useEmit();constlocal=ref(props.modelValue);watch(()=>props.modelValue,val=>{local.value=val;// 父 → 子 同步},{deep:true});watch(local,val=>{emit('update:modelValue',val);// 子 → 父 通知},{deep:true});returnlocal;}

一句话:defineModel 就是一个自动创建的 ref + 双向 watch + 事件桥接

4. 自定义修饰符的 v-model(.trim / .number / .lazy)

Vue 3 支持在组件上自定义修饰符:

<MyInputv-model.trim="search"/>

组件内可以通过defineModel({ modifier: true })或手动处理。

5. 多 v-model(多个字段绑定,Vue 3 特性)

<UserFormv-model:name="user.name"v-model:age="user.age"/>

子组件:

constname=defineModel('name');constage=defineModel('age');

6. Vue 2 vs Vue 3 双向绑定对比(面试高频)

维度Vue 2Vue 3优劣对比
响应式核心Object.definePropertyProxy + ReflectProxy 更全面、更高效(数组友好)
数组响应式需要 Vue.set / this.$set天然支持(Proxy 劫持 length 等)Vue 3 完胜
v-model 在组件上value + input(自定义 prop/event)modelValue + update:modelValue更规范,defineModel 极大简化
性能递归遍历所有属性惰性代理 + 只代理已访问路径Vue 3 更好(尤其大对象)
新增/删除属性不响应式(需 Vue.set)响应式(Proxy set/has/delete)Vue 3 完胜

7. 总结口诀(背下来面试稳)

  • Vue 3 双向绑定 =Proxy 响应式(数据→视图)+事件监听(视图→数据)+v-model 语法糖
  • 普通标签::value + @input
  • 组件:modelValue + update:modelValue(或defineModel一行实现)
  • 核心优势:Proxy 让数组、动态新增属性天然响应式,告别 Vue.set
  • 2026 最佳实践:优先用 defineModel,配合<script setup>,代码最简洁

如果你想看手写一个 mini-Vue 双向绑定(Proxy + 发布订阅 + 简单 diff),或者深挖 effect、track、trigger 的源码级细节,或者组件库中 v-model 的高级玩法(如 .sync 迁移、自定义修饰符),直接说,我继续拆解!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 3:47:54

SEW变频器MCF40A0750-503-4-0T 08274398

SEW 变频器 MCF40A0750-503-4-0T 08274398 详细介绍 1. 概述与产品定位 SEW MCF40A0750-503-4-0T (序列号 08274398) 是 SEW-EURODRIVE 公司生产的 MOVIFLEX MCF40A 系列 中的一款通用型变频器。MOVIFLEX 是 SEW 旗下的变频器品牌&#xff0c;以其高性能、可靠性和灵活性在工…

作者头像 李华
网站建设 2026/5/4 23:50:12

SXW-300微机控制钢绞线松弛试验机

SXW-300微机控制钢绞线松弛试验机一、产品简介SXW-300微机控制钢绞线松弛试验机在设计过程中&#xff0c;吸收了德国、意大利等著名松弛试验机公司的设计理念和结构特点&#xff0c;并依据钢绞线松弛试验的相关国家标准研制而成的&#xff0c;专用于钢绞线、镀锌钢丝及螺纹钢筋…

作者头像 李华
网站建设 2026/5/9 21:17:57

告别内卷!2026 程序员转行方向推荐:高薪赛道 + 技能提升手册

对于程序员转行方向的推荐&#xff0c;可以基于当前的技术趋势、市场需求以及程序员的个人技能和兴趣来综合考虑。以下是一些推荐的转行方向&#xff1a; 伴随着社会的发展&#xff0c;网络安全被列为国家安全战略的一部分&#xff0c;因此越来越多的行业开始迫切需要网安人员&…

作者头像 李华
网站建设 2026/5/4 23:50:06

最新2025年政府产业引导基金数据

最新2025年政府产业引导基金数据 数据一共七万多条 包括以下字段信息&#xff1a;所属省 所属市 被投资企业 政府机关 政府机关持股投资机构的比例 政府机关持股投资机构的路径 基金简称 基金代码 负责人类型 负责人名称 投资机构 投资机构持股投资企业的比例 完整图谱 所属省…

作者头像 李华
网站建设 2026/5/4 23:49:10

【小程序毕设全套源码+文档】基于springboot+协同过滤算法的音乐推荐系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华