vue2 插槽:单个插槽、具名插槽和数据插槽

本文详细介绍了Vue2中的插槽使用,包括单个插槽、具名插槽以及作用域插槽(数据插槽)。通过示例展示了如何在子组件中定义插槽,以及父组件如何填充和接收数据,强调了具名插槽可以实现多个插槽并存,而作用域插槽允许子组件向父组件传递数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先在子组件中给出插槽<slot></slot>
在这里插入图片描述
然后就可以在父组件中给插槽插入以元素了
在这里插入图片描述
看看这两个元素是不是在ADD组件的插槽里放的呢
在这里插入图片描述
果然是啊,图1可以看到我们给ADD组件一个class=“add”。插入的元素是在class为add里面。

上面说的是单个插槽,下面说下具名插槽

就是给插槽起个名字,这样子组件就可以同时留有多个插槽
操作如下:
1.在子组件中给每个slot插槽一个属性name,name等于什么就是起的什么名字
在这里插入图片描述
然后在父组件中用template标签配合v-slot属性来接收响应

03-08
### Vue 中的插槽 (Slot) 在 Vue 组件化开发过程中,为了使父组件能够向子组件递内容并控制其显示位置,Vue 提供了一种称为“插槽”的机制。通过定义具名插槽、作用域插槽等方式可以灵活地定制组件内部结构。 #### 基础用法 最简单的形式就是默认插槽,默认情况下任何放置于自定义标签之间的 HTML 内容都会被视作该组件实例的内容片段: ```html <!-- 子组件 --> <template> <div class="child"> <!-- 默认插槽 --> <slot></slot> </div> </template> <script setup lang="ts"></script> ``` 当使用这个子组件时,在 `<ChildComponent>` 标签间放入的内容将会渲染到上述模板中 `slot` 所处的位置上[^1]。 #### 具名插槽 对于更复杂的场景,则可以通过指定名称来创建多个不同的插槽区域,并允许父级精确指派特定部分的内容给这些命名好的占位符: ```html <!-- 子组件 --> <template> <header><slot name="header">Default Header Content</slot></header> <main><slot>Default Main Content</slot></main> <footer><slot name="footer">Default Footer Content</slot></footer> </template> ``` 此时可以在调用此组件的地方按需填充各个部位的数据: ```html <!-- 父组件 --> <ParentComponent> <template v-slot:header> Customized header content here. </template> <p>Main area text.</p> <template #footer> Special footer message goes here. </template> </ParentComponent> ``` 这里展示了两种语法糖:`v-slot:` 缩写的 `#` 符号用于声明具体要映射至哪个具名插槽之上。 #### 作用域插槽 如果希望让子组件内的某些数据也能暴露出来供外部访问处理的话,就可以借助带有作用域特性的插槽功能。这使得我们可以把局部状态回给使用者的同时保持良好的封装性: ```html <!-- 子组件 --> <template> <ul> <li v-for="(item, index) in items" :key="index"> <slot :item="item" :index="index"></slot> </li> </ul> </template> <script setup lang="ts"> import { ref } from 'vue'; const items = ref(['Apple', 'Banana', 'Orange']); </script> ``` 而在实际运用当中则可以根据需求调整列表项的表现样式而不必修改源码逻辑: ```html <!-- 父组件 --> <ListItems> <template v-slot="{ item, index }"> {{ index }} - {{ item }} </template> </ListItems> ``` 这样不仅实现了高度可配置化的界面构建模式,同时也促进了代码重用性维护效率的提升。 ### React 中类似的实现方式 虽然 React 并未直接提供名为“slots”的特性,但是却有着相似概念的存在——children 属性以及高阶组件(HOCs),它们共同构成了强大的组合工具集以满足多样化的布局需求。 - **Children Prop**: 类似于 Vue 的默认插槽行为,React 组件接收来自父节点递过来的一切作为 children 参数的一部分; - **Render Props / Children Function**: 当涉及到动态生成或条件渲染的情况下,往往采用 render prop 或者 child function 形式的 API 设计思路; 例如下面这段展示如何模仿 Vue 的 slot 功能的例子: ```jsx // Child Component with Render Props Pattern function List({ data, renderItem }) { return ( <ul> {data.map((item, idx) => ( <li key={idx}>{renderItem(item)}</li> ))} </ul> ); } // Parent Usage Example function App() { const listData = ['Red', 'Green', 'Blue']; return ( <List data={listData} renderItem={(color) => `${color.charAt(0).toUpperCase()}${color.slice(1)} Color`} /> ); } ``` 这种做法同样达到了参数化呈现的效果,而且保留了足够的灵活性去适应各种可能的变化情形[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级码吏

谢谢看官

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值