创意设计公司排行榜做360网站优化
创意设计公司排行榜,做360网站优化,省直部门门户网站建设,哈尔滨公司网站团队Vue 双向绑定原理剖析#xff08;Vue 3 时代完整版#xff0c;2026视角#xff09;
Vue 的“双向绑定”其实是两个方向的单向流动巧妙组合的结果#xff1a;
数据 → 视图#xff1a;响应式系统#xff08;Reactivity#xff09;自动更新 DOM#xff08;Vue 2 用 Obj…Vue 双向绑定原理剖析Vue 3 时代完整版2026视角Vue 的“双向绑定”其实是两个方向的单向流动巧妙组合的结果数据 → 视图响应式系统Reactivity自动更新 DOMVue 2 用 Object.definePropertyVue 3 用 Proxy Reflect视图 → 数据用户交互input、change 等事件触发事件监听 → 更新数据Vue 3 中v-model是语法糖底层拆分成value或modelValue onInput或update:modelValue。下面按层级从底层到表层完整拆解。1. Vue 3 响应式系统核心数据 → 视图方向Vue 3 放弃了 Object.defineProperty转用Proxy性能更好能劫持更多操作如数组长度变化、in 操作、delete 等。核心 APIreactive(obj)→ 返回 Proxy 代理对象ref(value)→ 返回 { value: xxx } 的 Ref 对象内部也是 Proxy 或 getter/settercomputed()、watch()等依赖这个系统Proxy 实现响应式的大致原理简化版伪代码functionreactive(raw){returnnewProxy(raw,{get(target,key,receiver){// 依赖收集tracktrack(target,key);// 把当前 effect 收集到这个 key 的 deps 中constresultReflect.get(target,key,receiver);// 如果是对象继续代理深度响应式if(isObject(result))returnreactive(result);returnresult;},set(target,key,value,receiver){constoldValuetarget[key];constresultReflect.set(target,key,value,receiver);// 值真的变了才触发if(oldValue!value){trigger(target,key);// 通知所有依赖这个 key 的 effect 重新运行}returnresult;},// deleteProperty、has、ownKeys 等也需要处理});}track / trigger 机制依赖收集与派发更新使用 WeakMaptarget, Mapkey, Set 结构存储依赖关系effect(fn)执行时会开启 activeEffectget 时收集set 时触发所有收集到的 effect这就是为什么ref.value、reactiveObj.count会自动更新视图的原因。2. v-model 在普通 input 上的拆解最基础形式inputv-modelmessage/编译后等价于input:valuemessageinputmessage $event.target.value/:value→ 数据 → 视图响应式触发 set → trigger → 重新渲染 valueinput→ 视图 → 数据用户输入 → 赋值给 message → 触发 set → 视图更新这就是最原始的双向绑定实现。3. 组件上的 v-modelVue 3.3 推荐方式defineModelVue 3.4 后defineModel正式成为宏macro极大简化写法。子组件写法对比Vue 3.3 以前手动// 子组件defineProps([modelValue]);defineEmits([update:modelValue]);// 模板input:valuemodelValueinput$emit(update:modelValue, $event.target.value)/Vue 3.4defineModel 宏推荐// 子组件一行搞定constmodeldefineModel();// 返回一个 ref默认绑定 modelValue update:modelValue// 或者带选项constmodeldefineModel({required:true,default:});// 模板和普通 ref 一样用input v-modelmodel/defineModel 内部等价实现官方简化版functiondefineModel(options){constpropsuseProps();constemituseEmit();constlocalref(props.modelValue);watch(()props.modelValue,val{local.valueval;// 父 → 子 同步},{deep:true});watch(local,val{emit(update:modelValue,val);// 子 → 父 通知},{deep:true});returnlocal;}一句话defineModel 就是一个自动创建的 ref 双向 watch 事件桥接。4. 自定义修饰符的 v-model.trim / .number / .lazyVue 3 支持在组件上自定义修饰符MyInputv-model.trimsearch/组件内可以通过defineModel({ modifier: true })或手动处理。5. 多 v-model多个字段绑定Vue 3 特性UserFormv-model:nameuser.namev-model:ageuser.age/子组件constnamedefineModel(name);constagedefineModel(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/eventmodelValue update:modelValue更规范defineModel 极大简化性能递归遍历所有属性惰性代理 只代理已访问路径Vue 3 更好尤其大对象新增/删除属性不响应式需 Vue.set响应式Proxy set/has/deleteVue 3 完胜7. 总结口诀背下来面试稳Vue 3 双向绑定 Proxy 响应式数据→视图事件监听视图→数据v-model 语法糖普通标签:value input组件modelValue update:modelValue或defineModel一行实现核心优势Proxy 让数组、动态新增属性天然响应式告别 Vue.set2026 最佳实践优先用 defineModel配合script setup代码最简洁如果你想看手写一个 mini-Vue 双向绑定Proxy 发布订阅 简单 diff或者深挖 effect、track、trigger 的源码级细节或者组件库中 v-model 的高级玩法如 .sync 迁移、自定义修饰符直接说我继续拆解