插槽作用域本质是父组件内容在自身上下文中编译,子组件通过v-bind向slot暴露响应式数据供父组件解构使用;默认插槽需显式绑定才传数据,具名插槽提升语义与安全性,v-for中slot置于循环内可为每项提供独立作用域,属单向数据流设计。

插槽作用域的本质是“内容在父组件编译,数据由子组件提供”——父组件写的内容始终运行在自己的数据上下文中,而子组件通过<slot>主动把内部变量以属性形式绑定出去,让父组件能解构使用。
默认插槽的数据传递必须显式绑定
空的<slot></slot>只是内容占位符,不会传任何数据。要让父组件拿到子组件数据,必须在子组件中用v-bind或简写:把响应式字段挂到<slot>上:
<slot :user="currentUser" :loading="isLoading"></slot>- 父组件用
v-slot="{ user, loading }"接收,{{ user.name }}可直接渲染 - 若只传一个对象,也可写成
v-slot="props",再用{{ props.user.name }}
具名插槽 + 作用域参数提升语义清晰度
当组件有多个区域且都需要各自的数据时,命名+作用域组合更安全可靠:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 子组件:
<slot name="header" :title="pageTitle" :level="headerLevel"></slot> - 父组件:
<MyCard v-slot:header="{ title, level }"><h2 :class="`h${level}`">{{ title }}</h2></MyCard> - 避免多个默认插槽混用导致解构冲突,也方便未来扩展新插槽
v-for 场景下每个插槽实例携带独立数据
列表类子组件常需为每一项提供定制渲染能力,关键在于<slot>放在循环内部,并绑定当前项:
立即学习“前端免费学习笔记(深入)”;
- 子组件中:
<div v-for="(item, i) in list" :key="item.id"><slot :row="item" :index="i" :is-last="i === list.length - 1"></slot></div> - 父组件中每一条
<template #default="{ row, index }">都对应一个独立作用域,row就是当前循环项 - 响应式依然生效:如果
list是ref或reactive,修改某项属性会自动更新对应插槽内容
不能替代双向通信,但能精准暴露必要字段
作用域插槽是单向数据流设计,它解决的是“父组件需要子组件局部状态来决定怎么画”,不是“父组件要改子组件状态”:
- 想编辑数据?子组件发
edit事件,父组件监听后处理;不要尝试在插槽里直接赋值row.name = 'xxx' - 避免传
this或整个setup上下文,只暴露row、index、isDisabled这类轻量状态 - 需要双向绑定时,优先用
v-model或props+$emit('update:xxx')

















