Vue响应式系统的“单向同步”指数据变更单向驱动视图更新(data → template → DOM),不自动反向;v-model是:value与@input的语法糖封装,子组件通过emit通知父组件更新,严格遵循单向数据流。

响应式系统只负责“数据变 → 视图更新”
Vue 的 reactive/ref/Proxy 机制本质是监听数据读写,在 setter 触发时通知依赖更新,整个流程不涉及 DOM 变化监听:
- 当你改
msg = 'hello',响应式系统捕获赋值,触发依赖它的模板重新求值 - 但用户在
<input>里打字,不会自动触发 msg 赋值;那是浏览器原生事件,Vue 不干预 - 真正让数据变的,是你或
v-model在@input回调里写的那句赋值
v-model 是语法糖,不是双向魔法
v-model 看似“双向”,实则是 :value + @input 的组合封装,完全符合单向流:
-
<input v-model="msg">等价于<input :value="msg" @input="msg = $event.target.value"> - 数据流向仍是清晰的两段:msg → input value(响应式驱动),input event → msg 赋值(开发者逻辑)
- 自定义组件中使用
v-model,必须显式接收props并$emit('update:xxx'),父组件决定是否更新自身数据
父子组件间保持单向同步的实践
子组件不能直接改 props,但可通过事件让父组件更新,再由响应式系统向下同步:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 父组件传
:count="num",子组件用props.count展示(只读) - 子组件点击按钮时,执行
this.$emit('update:count', this.props.count + 1) - 父组件用
:count.sync="num"或@update:count="val => num = val"接收并更新自身num - 更新后,响应式系统自动将新
num同步到子组件的props.count,完成一次单向流动
避免常见误解:同步 ≠ 自动双向
所谓“数据同步”,本质是状态统一 + 更新可追溯,不是 DOM 和 data 之间无感镜像:
立即学习“前端免费学习笔记(深入)”;
- 直接修改
props.xxx会报错或静默失败(Vue 3 Proxy 严格保护) - 用
nextTick确保操作发生在 DOM 更新后,是因为 Vue 批量异步更新,不是因为“等待双向反馈” - Vuex、Pinia 等状态库也遵循同一原则:state 只能通过 commit/dispatch 显式变更,再广播给所有订阅者

















