props 与 emit 构成 Vue 父子组件通信的主干道:父组件以属性形式传入 props,子组件用 defineProps 声明接收并严格限定类型;子组件用 defineEmits 声明可以触发的事件,父组件再以事件名监听。数据因此保持单向流动,子组件永远不直接改父组件的数据,需要变化时 emit 一个事件交由父组件处理。
声明式写法让组件接口一目了然,也方便对接 TypeScript 类型推导。子组件修改 props 会被警告,数组与对象类型的 props 按引用传递时也不例外,仍不应在子组件内部直接改动。约定上事件名用 kebab-case,props 名用 camelCase,模板绑定与监听时两边都自然衔接。
// 子组件 const props = defineProps({ title: String, count: { type: Number, default: 0 } }); const emit = defineEmits(['update']); function handleClick() { emit('update', props.count + 1); } // 父组件模板: // <ChildComp title="标题" :count="n" @update="n = $event" />