作用域插槽是子组件将响应式数据委托父组件渲染的机制,子用:prop绑定明确字段,父用v-slot="{ prop }"解构接收,双方职责分离、低耦合;非响应式对象不触发更新,不可直接修改,双向需配合v-model或emit。

作用域插槽不是“把子组件数据塞给父组件用”,而是让子组件主动把数据“托付”给父组件去渲染——数据由子提供,模板由父写,双方各司其职,不越界、不耦合。
子组件怎么安全地暴露数据
关键在<slot></slot>标签上用:xxx绑定响应式字段,不能传this或整个实例,只传明确需要的值:
- 单个对象:
<slot :user="currentUser"></slot> - 多个字段:
<slot :id="id" :name="name" :isactive="isActive"></slot> - 配合
v-for逐项暴露:<slot v-for="item in list" :key="item.id" :row="item"></slot>
只要currentUser是ref或reactive定义的,后续修改就会自动触发父组件插槽内容更新。
父组件怎么准确接收并使用
必须用v-slot(Vue 3 唯一支持语法),参数名可自定义,但解构字段要和子组件绑定的属性名一致:
- 默认插槽写法:
<template user>{{ user.name }}</template> - 具名插槽更清晰:
<template id name>#{{ id }} - {{ name }}</template> - 不强制解构,也可用
slotProps.user方式访问
注意:v-slot="{ user }这种写法在 Vue 3 中无效,必须带插槽名(如#default)或省略为v-slot。
常见踩坑点与应对
作用域插槽容易被误当成通信手段,但它本质是渲染委托,不是状态同步工具:
- 父组件中没读取某个字段(比如写了
{ user }但模板里只用{{ user.name }}),那user.age就不会建立响应式依赖 - 子组件传的是普通对象(非
ref/reactive),父组件无法响应变化 - 想修改子组件数据?别在插槽里直接赋值——这是单向透出,双向需求请用
v-model或emit
配合 Composition API 更简洁
Vue 3 的setup()中,子组件可直接返回响应式数据,模板里绑定更直观:
- 子组件:
const items = ref([{ id: 1, label: 'Home' }]); return { items };,再写<slot name="item" :items="items"></slot> - 父组件:
<template items><li v-for="i in items" :key="i.id">{{ i.label }}</li></template>
底层仍是函数式委托,但写法更贴近逻辑直觉,不用手动处理渲染函数。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











