context参数包含emit、attrs、slots、parent、root五个关键属性,其中emit用于触发自定义事件,如emit('update:modelvalue', newvalue),attrs等价于$attrs,slots等价于$slots,parent和root分别指向父组件和根实例(不推荐直接使用)。

context 参数是 Vue 2.x 中 setup 函数接收的第二个参数,它提供了一组与当前组件实例相关的上下文对象,其中就包含 emit 方法——这是在组合式 API 中触发自定义事件的唯一途径。
context 参数里有哪些关键属性?
它不是 Vue 2 的 this,而是一个精简的对象,主要包含:
-
emit:用于派发自定义事件,比如
emit('update:modelValue', newValue) -
attrs:获取透传的非 prop 属性(等价于
vm.$attrs) -
slots:访问插槽内容(等价于
vm.$slots) - parent:指向父组件实例(不推荐直接使用)
- root:指向根 Vue 实例(Vue 2.7+ 支持,一般不用)
如何用 emit 触发自定义事件?
在 setup 中不能访问 this,所以必须从 context 解构出 emit 才能通信:
export default {
setup(props, context) {
const { emit } = context
const handleClick = () => {
emit('click') // 触发 click 事件
emit('change', 'hello') // 触发 change 并传参
emit('update:count', 100) // 响应式更新 v-model 绑定的值
}
return { handleClick }
}
}
注意:update:xxx 是 v-model 的约定格式,子组件调用 emit('update:xxx', val) 后,父组件绑定的 v-model:xxx 会自动同步。
常见误区和注意事项
- Vue 3 中
context已被移除,改用defineEmits显式声明,避免隐式依赖 - Vue 2.7+ 兼容写法中,
context.emit仍可用,但建议配合emits选项做类型提示 - 不要在
setup外部或异步回调中直接使用未绑定的emit,确保作用域正确 - 如果没解构
emit,直接写context.emit(...)也可以,但解构更清晰
掌握 context.emit,就能在 setup 里干净地实现父子组件事件通信,不复杂但容易忽略。










