vue.js中v-model双向绑定本质是父组件用语法糖简化属性绑定与事件监听,子组件通过emit通知父组件更新;vue 3统一为modelvalue/update:modelvalue,支持多v-model;vue 2则固定为value/input;props单向不可变,必须通过emit触发父级更新。

Vue.js 中通过 emit 配合 v-model 实现组件双向绑定,本质是父组件用 v-model 语法糖简化了 :value + @input(Vue 2)或 :modelValue + @update:modelValue(Vue 3)的写法,而子组件内部靠 emit 主动通知父组件更新数据。
Vue 3 中 v-model 的默认行为(推荐)
Vue 3 将 v-model 统一为基于 modelValue 的约定,更清晰、可扩展性更强:
- 父组件写法简洁:
<myinput v-model="searchText"></myinput> - 子组件接收
modelValue作为 prop,并在值变化时emit('update:modelValue', newValue) - 子组件中通常用
computed双向同步:
<script setup><br> const props = defineProps({ modelValue: String });<br> const emit = defineEmits(['update:modelValue']);<br> </script>
自定义 v-model 名称(支持多字段绑定)
一个组件可同时支持多个 v-model,只需指定不同参数名:
- 父组件:
<userform v-model:username="name" v-model:email="mail"></userform> - 子组件声明:
defineProps({ username: String, email: String }) - 触发更新:
emit('update:username', 'Alice')或emit('update:email', 'a@b.com') - 这样就能在一个组件内管理多个受控状态,互不干扰
Vue 2 兼容写法(如仍需维护旧项目)
Vue 2 默认使用 value 和 input,逻辑一致但命名固定:
- 子组件接收
valueprop,监听输入并emit('input', newValue) - 父组件
<myinput v-model="msg"></myinput>等价于:<myinput :value="msg"> msg = val" /></myinput> - 注意:Vue 2 不支持多个
v-model,需手动用@xxx+:yyy模拟
为什么不能只靠 props 下传?
props 是单向的,子组件无法直接修改它。若强行 this.value = 'new',Vue 会警告“Avoid mutating a prop directly”。正确路径是:
→ 父组件提供数据(prop)
→ 子组件展示并响应交互
→ 通过 emit 告知父组件“该更新了”
→ 父组件响应式更新自身数据 → 触发子组件重新渲染
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











