父给子传数据用 props(单向、只读);子要改父的数据用 emit 发事件让父自己改。
v-model 只是「:modelValue + @update:modelValue」的语法糖。
开发版会校验 props 类型/必填/emit 载荷并把警告打进迷你控制台,生产构建全部静默——别拿它当测试。
| 写法(父 → 子 / 子 → 父) | 本质 | 说明 |
|---|---|---|
<child :size="n"> | props 向下 | 子组件 props: { size: Number } 里只读接收 |
ctx.emit('like', 7) + 父 @like="…" | emit 向上 | 子发事件带载荷,父监听并改自己的数据 |
<child v-model="x"> | = :modelValue="x" + @update:modelValue="v => x = v" | 单个双向绑定 |
<child v-model:price="p"> | = :price="p" + @update:price | 一个组件上多个 v-model |
defineModel() | Vue 3.4+ 简写 | SFC 里一行搞定 props+emit,免手写 |
单向数据流三原则:① props 只读,子组件永远不改 props;② 要改父数据 → emit 让父改;③ 想在本地基于 props 加工 → computed 派生,别拷一份到 ref 里(会失去同步)。