0


【VUE前进之路】插槽的使用

作者简介:一名前端萌新,前来进行VUE的前进之路
个人主页:大熊李子的主页🐻

1.什么是插槽

插槽(slot)是 vue 为组件的封装者提供的能力。允许开发者在封装组件时,把不确定的、希望由用户 指定的部分定义为插槽。

2.插槽的使用

在封装组件时,可以通过 元素定义插槽,从而为用户预留内容占位符。

  1. // 子组件
  2. <template>
  3. <div class="left-container">
  4. <h3>Left 组件</h3>
  5. <hr />
  6. <p>子组件的第一个 p 标签</p>
  7. <!-- 通过 slot 标签,为用户预留内容占位符(插槽) -->
  8. <slot></slot>
  9. <p>子组件最后一个 p 标签</p>
  10. </div>
  11. </template>
  12. // 父组件
  13. <template>
  14. <div class="app-container">
  15. <h1>App 根组件</h1>
  16. <hr />
  17. <div class="box">
  18. <!-- 渲染 Left 组件和 Right 组件 -->
  19. <!-- 在使用组件时,为插槽指定具体的内容 -->
  20. <Left>
  21. <p>用户自定义内容</p>
  22. </Left>
  23. </div>
  24. </div>
  25. </template>

3.v-slot 指令

vue 官方规定:每一个 slot 插槽,都要有一个 name 名称,如果省略了 slot 的 name 属性,则有一个 默认名称叫做 default。 默认情况下,在使用组件的时候,提供的内容都会被填充到名字为default 的插槽之中如果要把内容填充到指定名称的插槽中,需要使用 v-slot: 这个指令, v-slot: 指令后面要跟插槽的名字。

  1. // 父组件
  2. <Left>
  3. <template v-slot:default>
  4. <p>用户自定义内容</p>
  5. </template>
  6. </Left>
  7. // 子组件
  8. <template>
  9. <div class="left-container">
  10. <h3>Left 组件</h3>
  11. <hr />
  12. <p>子组件的第一个 p 标签</p>
  13. <!-- 通过 slot 标签,为用户预留内容占位符(插槽) -->
  14. <slot name="default"></slot>
  15. <p>子组件最后一个 p 标签</p>
  16. </div>
  17. </template>

v-slot:指令不能直接用在元素身上,必须用在template 标签上 template这个标签,它是一个虚拟的标签,只起到包裹性质的作用,但是,不会被渲染为任何实 质性的html元素

注:没有预留插槽的内容会被丢弃,如果在封装组件时没有预留任何 插槽,则用户提供的任何自定义内容都会被丢弃。

  1. // 子组件
  2. <template>
  3. <div class="left-container">
  4. <h3>Left 组件</h3>
  5. <hr />
  6. <p>子组件的第一个 p 标签</p>
  7. <!-- 封装组件时,没有预留任何插槽 -->
  8. <p>子组件最后一个 p 标签</p>
  9. </div>
  10. </template>
  11. // 父组件
  12. <template>
  13. <div class="app-container">
  14. <h1>App 根组件</h1>
  15. <hr />
  16. <div class="box">
  17. <!-- 自定义的内容会被丢弃 -->
  18. <Left>
  19. <p>用户自定义内容</p>
  20. </Left>
  21. </div>
  22. </div>
  23. </template>

4.具名插槽

如果在封装组件时需要预留多个插槽节点,则需要为每个 插槽指定具体的 name 名称。这种带 有具体名称的插槽叫做“具名插槽”。

  1. <template>
  2. <div class="article-container">
  3. <!-- 文章标题 -->
  4. <div class="header-box">
  5. <slot name="title"></slot>
  6. </div>
  7. <!-- 文章内容 -->
  8. <div class="content-box">
  9. <slot name="content"></slot>
  10. </div>
  11. <!-- 文章作者 -->
  12. <div class="footer-box">
  13. <slot name="author"></slot>
  14. </div>
  15. </div>
  16. </template>

在向具名插槽提供内容的时候,我们可以在一个 元素上使用 v-slot 指令,并以 v-slot 的参 数的形式提供其名称

  1. // 父组件中
  2. <Article>
  3. <template #title>
  4. <h3>静夜思</h3>
  5. </template>
  6. <template #content>
  7. <div>
  8. <p>我见青山多妩媚,</p>
  9. <p>料青山见我应如是。</p>
  10. </div>
  11. </template>
  12. <template #author>
  13. <div>作者:大熊</div>
  14. </template>
  15. </Article>

5.具名插槽的简写形式

  1. <tbody>
  2. <!-- 下面的slot 是一个作用域插槽-->
  3. <slot v-for="item in 1 ist" :user="item"></slot>
  4. </tbody>

6.作用域插槽

可以使用 v-slot: 的形式,接收作用域插槽对外提供的数据

  1. <my-com-3>
  2. <!-- 1.接收作用域插槽对外提供的数据-->
  3. <template v-slot:default=" scope">
  4. <tr>
  5. <!-- 2.使用作用域插槽的数据-->
  6. <td> {{ scope }}</td>
  7. </tr>
  8. </ template>
  9. </my-com-3>

7.解构插槽 Prop

作用域插槽对外提供的数据对象,可以使用解构赋值简化数据的接收过程

  1. <myone>
  2. <!-- v-slot: 可以简写成# -->
  3. <!-- 作用域插槽对外提供的数据对象,可以通过”解构赋值"简化接收的过程-->
  4. <template #default="{user}">
  5. <tr>
  6. <td> {{user.id}}</td>
  7. <td> {{user.name}}</td>
  8. <td> {{user.state}}</td>
  9. </tr>
  10. </ template>
  11. </myone>

本文转载自: https://blog.csdn.net/2301_76710810/article/details/129695323
版权归原作者 大熊李子 所有, 如有侵权,请联系我们删除。

“【VUE前进之路】插槽的使用”的评论:

还没有评论