插槽vue/react - 详解

news/2025/11/8 18:56:30/文章来源:https://www.cnblogs.com/slgkaifa/p/19202886

插槽vue/react - 详解

​作用域插槽(Scoped Slots)​​ 是 Vue 提供的一种​​让插槽内容可以访问子组件内部数据​​的机制,它极大地增强了组件的​​灵活性与复用性​​,是 Vue 组件设计中非常强大的功能之一。


一、vue插槽

先回顾:普通插槽(默认插槽、具名插槽)

在 Vue 中,插槽(slot)是​​父组件向子组件传递一段模板内容(HTML / 组件)的机制​​,用于实现​​内容分发​​。比如:


这是插入到子组件中的内容

✅ 这是​​普通插槽​​,父组件传什么,子组件就在 <slot>的位置显示什么。


那什么是​​作用域插槽​​呢?

​作用域插槽(Scoped Slot)​​ 是一种特殊的插槽,它允许​​父组件在插入内容时,可以访问子组件内部的数据​​。

作用域插槽的核心作用,就是让子组件可以把内部的数据“暴露”给父组件,让父组件可以基于这些数据,自由地决定如何渲染插槽内容。​

换句话说:

  • 通常插槽是​​父 → 子 传内容​​;

  • 但作用域插槽是​​子 → 父 传数据,让父组件决定如何渲染这些数据​​。


 作用域插槽的语法(Vue 2 & Vue 3)


✅ Vue 2 中的作用域插槽语法

在子组件中,给 <slot>绑定数据:



<script>
export default {data() {return {user: { name: 'Alice', age: 25 },items: ['Apple', 'Banana', 'Cherry']};}
};
</script>

在父组件中,通过 ​​v-slot(或 slot-scope)​​ 接收子组件传递的数据:


或者 Vue 2 也支持新版语法(推荐,和 Vue 3 类似):



✅ Vue 3 中的作用域插槽语法(更统一、更简洁)

在子组件中,同样通过 <slot :data="xxx">传递数据:



<script setup>
import { ref } from 'vue'
const user = ref({ name: 'Alice', age: 25 });
const items = ref(['Apple', 'Banana', 'Cherry']);
</script>

在父组件中,使用 ​​v-slot​​ 或 ​​#​​ 语法接收:

✅ 推荐使用 ​#default="{ ... }"​ 这种简洁写法(Vue 3)



作用域插槽的典型应用场景(附例子)


✅ 场景 1:​​列表组件(父组件自定义每一项的展示)​

子组件:ItemList.vue

<script setup>
defineProps(['items'])
</script>
父组件:

<script setup>
import ItemList from './ItemList.vue'
const data = [{ name: 'Apple' },{ name: 'Banana' },{ name: 'Cherry' }
]
</script>

​效果:​​ 子组件负责循环渲染列表,但每一项显示什么内容,由父组件通过插槽自定义!


✅ 场景 2:​​卡片组件(父组件自定义卡片内容)​

子组件:Card.vue

<script setup>
defineProps(['title', 'content'])
</script>
父组件:

你问的是:​​“React 怎么实现类似 Vue 的插槽(slot)的功能?”​

这是一个非常重要且实用的跨框架对比问题!

在 Vue 中,​​插槽(slot)​​ 是一种非常核心的组件内容分发机制,它让​​父组件可以向子组件传递一段模板内容(UI 片段)​​,从而实现​​高复用、灵活定制的组件设计​​。

而 React ​​本身没有直接叫“插槽”的概念​​,但完全可以通过 ​​React 的组件设计模式 + props(特别是 children 和 render props)​​ 轻松实现 ​​类似 Vue 插槽的功能​​,甚至更灵活!


二、 2. React 中如何实现类似 Vue “插槽” 的功能?

​React 没有 Vue 那样的 <slot>标签,但可以通过 props.children实现默认插槽,通过命名 props(如 header、main)实现具名插槽,通过函数 props(如 renderXXX)实现作用域插槽,从而达到与 Vue 插槽几乎相同的组件内容分发与定制能力,而且同样灵活强大!​


✅ 方法一:使用 childrenprops(实现默认插槽)

​React 中,父组件传递给子组件的 JSX 内容,可以通过 props.children获取!​

这相当于 Vue 的 ​​默认插槽​​。


示例:React 实现默认插槽(类似 Vue 的 <slot>
子组件:Child.js
function Child(props) {return (

这是子组件

{/* React 中通过 props.children 获取父组件传入的内容 */}{props.children}
); } export default Child;
父组件:App.js
import Child from './Child';
function App() {return (

这段内容就是插槽内容,会显示在子组件里的 {props.children} 位置

); }

​效果:​

父组件在 <Child>标签内写的内容,会通过 props.children渲染到子组件中,就像 Vue 的 <slot>一样。

✅ ​​这就是 React 实现 Vue 默认插槽的方式!​


✅ 方法二:实现类似 Vue 的​​具名插槽

在 Vue 中,你可以有多个具名插槽,比如:

父组件可以这样传:

这是默认内容


✅ React 中如何实现具名插槽?

React 没有 v-slot:name,但可以通过 ​​传递对象形式的 children 或命名 props​​ 来模拟!

推荐方式:​​通过 props 传入不同区块内容(模拟具名插槽)​
子组件:Child.js
function Child({ header, main, footer }) {return (
{header &&
{header}
}
{main}
{footer &&
{footer}
}
); } export default Child;
父组件:App.js
import Child from './Child';
function App() {return (这是头部(类似具名插槽 header)}main={

这是主要内容(类似默认插槽)

}footer={
这是页脚(类似具名插槽 footer)
}/>); }

​说明:​

  • 不像 Vue 那样用 <template v-slot:name>,而是​​通过 props 传入不同区块的 JSX​

  • 比如:header={<h1>...</h1>}main={<p>...</p>}footer={...}

  • 这是 React 社区中非常常见且清晰的实现具名插槽的方式 ✅


✅ 方法三:更灵活的方式 —— ​​使用 Render Props(高级用法)​

​Render Props 是一种 React 设计模式,允许你通过一个函数 prop,把渲染逻辑交给父组件控制,从而实现更灵活的“插槽”或内容分发。​

不过,对于大多数“插槽”场景,children或 ​​命名 props​​ 已经足够,​​Render Props 更适合控制渲染逻辑,而非单纯的内容分发。​

但为了完整性,简单介绍一下:

子组件:
function SlotDemo({ renderHeader, renderContent }) {return (
{renderHeader && renderHeader()}
{renderContent && renderContent()}
); }
父组件:
 

这是通过函数传入的头部

}renderContent={() =>

这是通过函数传入的内容

} />

​适用场景更复杂,比如子组件控制何时渲染、如何传参等,但代码可读性稍差,一般推荐上面 children / props 方式。​


三、 3. 对比 Vue 插槽 和 React 实现方式

功能

Vue 插槽

React 实现方式

​默认插槽​

<slot></slot>

通过 props.children获取 <Child>...</Child>中的内容

​具名插槽​

<slot name="xxx"><template v-slot:xxx>

通过 props 传入不同 JSX 块:header={<h1>...}, main={...}

​作用域插槽​

<slot :data="xxx">,父组件接收数据

通过 props 传数据给父组件传入的函数或组件,比如 <slot data={data} />→ 父组件用 {data}

​灵活度​

高,语法清晰

同样高,但语法习惯不同(更灵活、更 JS 风格)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/959917.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI元人文的思想锻造之路:从“空白承诺”到“动力之源”

AI元人文的思想锻造之路:从“空白承诺”到“动力之源” 作者:岐金兰 日期:2025年11月8日 摘要 本文系统梳理了"AI元人文"思想体系五十天的演进历程。该理论始于对价值表征困境的深刻洞察,通过"空白…

251108 会议整理

AI整理,未全部查证,为防止出错可以下载文件自行查阅文件参考:中国计算机学会推荐国际学术会议和期刊目录(2022) 集成电路学院期刊与会议分类列表(研究生)(2023)中国计算机学会推荐国际学术会议 (硬件设计相关…

AT_tokiomarine2020_e O(rand)

首先把肯定不合法的 \(S\) 和 \(T\) 都给删掉。 最后发现就是要求 \(T - S\) 的部分要有 \(0\) 和 \(1\),其它部分都已经固定好了。 考虑容斥,容斥 \(i\) 个地方只有 \(0\) 或只有 \(1\),求个组合数即可。

阿里云智能集团首席科技官云栖大会要点总结

阿里云智能集团首席科技官云栖大会要点总结pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

自指自洽,天职天命,苦乐年华

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891箴言——“自指自洽,苦乐年华”——是一次对生命本质最凝练、最通透的诗意总结。它以一种举重若轻的从容,道尽了宇宙规律在个体层面演化的全部奥秘。 现在,…

完整教程:Windows Pad平板对 Qt 的支持

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

线段树(p1083)

P1083 [NOIP 2012 提高组] 借教室 题目描述 在大学期间,经常需要租借教室。大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。 面对…

初识PPO

for batch_prompt in prompt_dataset:batch_response = active_model.generate(batch_prompt)batch_data = concat(batch_prompt, batch_response)batch_scores = reward_model(batch_data)batch_all_probs, batch_pro…

[ vmware 连接宿主机代理 ]

# 本文只讲原理,只是技术研究 # 1. Tun 开启 -> 本质开启一张虚拟网卡; 允许局域网连接 # 2. 虚拟机默认走 Nat -> VMnet8 # 3. Tun的网卡开启网络共享,共享给 VMnet8

【Android】六大设计原则 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年合肥甲醛检测公司哪家好?专业机构排名与选择指南

摘要 随着人们对室内空气质量的重视程度不断提高,甲醛检测行业在2025年迎来了快速发展期。本文基于市场调研和用户反馈,为您精选五家优质甲醛检测机构,并提供详细对比分析。文末附有专业选择指南和参考表单,助您找…

现今除甲醛机构选哪家?深度分析

摘要 随着室内空气污染问题日益受到关注,除甲醛行业在2025年迎来了快速发展。消费者对靠谱、专业除甲醛服务的需求激增,本文基于权威数据和用户反馈,整理了目前国内除甲醛机构排名前十的榜单,并为读者提供选择指南…

Unity2D 图片支持拖拽和以鼠标中心缩放

引言: 作为一个Unity初学者,遇到了需要实现以鼠标为中心缩放的功能且需要支持拖拽,秉着复用主义的原则,在网上查找了不少博客,要么免费但不能直接拿来使用,要么需要VIP充值获取项目代码,此外,原理且讲解甚少。…

轻松可视化信息的利器——JSON Crack

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

详细介绍:C++微基础备战蓝桥杯string篇10.5

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

[ jupyter conda 环境]

在激活的环境中,可以通过以下命令安装所需的库(包括 NumPy、Pandas、JupyterLab),以及配置自动补全功能,步骤如下: 1. 安装核心库(NumPy、Pandas、JupyterLab) 在激活 myenv 环境后,直接用 conda install 安装…

深入解析:仿mudou——Connection模块(连接管理)

深入解析:仿mudou——Connection模块(连接管理)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

Linux中查看个人磁盘容量

001、 lfs quota -u s20223040682 /public/home/s20223040682

以太坊私有链搭建与智能合约部署指南 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【学弟向】图的存储与遍历,最短路,连通性 tarjan,树状数组

树状数组 单点修改,前缀查询。 int lbd(int x) {return (x&(-x));} void gai(int x,int c) {for(int i=x;i<=n;i+=lbd(i)) a[i]+=c;} int cha(int x) {int da=0;for(int i=x;i;i-=lbd(i)) da+=a[i];return da;…