vue2---插槽

44 篇文章 0 订阅
本文详细介绍了Vue.js中的插槽(Slot)概念及其基本使用,包括默认插槽和具名插槽。通过实例展示了如何在组件中声明插槽,并在父组件中填充内容。还讲解了作用域插槽的用法,允许在组件内部传递数据给插槽内容。通过具名插槽,用户可以在组件的不同位置插入自定义内容。
摘要由CSDN通过智能技术生成

目录

2 插槽

2.1 概念的基本使用

2.1.1 概念

2.2.2 插槽的基本使用

2.2.3 具名插槽(带有name的插槽)

2 插槽

2.1 概念的基本使用

2.1.1 概念

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

举个栗子:

eg组件好比小霸王游戏机,插槽就是游戏机的插口,看用户插什么卡,就在屏幕(预留的位置)上显示出对应的游戏(内容)。

我们不能把一个游戏机就固定一个游戏,有了插槽,这就一个(游戏机)组件,可以玩(显示出)不同的游戏(用户自定义的内容)。

概念不太容易理解,直接上图:

2.2.2 插槽的基本使用

  1. 在Left里面加一个slot标签

<template>
  <div class="left-container">
    <h3>Left 组件</h3>
    <!-- 声明一个插槽区域 -->
    <!-- vue 官方规定:每一个 slot 插槽,都要有一个 name 名称 -->
    <!-- 如果省略了 slot 的 name 属性,则有一个默认名称叫做 default -->
    <slot name="default"></slot>
      <!-- 如果在slot里面放内容,那么用户在没有指定内容的时候就默认显示这里的内容,当用户指定内容的时候又会把这个替换了 -->
  </div>
</template>

2 .在app根组件使用组件里面直接放内容即可

<template>
  <div class="app-container">
    <h1>App 根组件</h1>
    <hr />
​
    <div class="box">
      <!-- 渲染 Left 组件和 Right 组件 -->
      <Left>
          <!-- 默认情况下,在使用组件的时候,提供的内容都会被填充到名字为 default 的插槽之中 -->
        <p>我是插槽里面用户自定义的内容</p>
      </Left>
    </div>
  </div>
</template>
​
<!-- 插到指定位置使用方法如下 -->
<div class="box" style="display: none;">
      <!-- 渲染 Left 组件和 Right 组件 -->
      <Left>
        <!-- 默认情况下,在使用组件的时候,提供的内容都会被填充到名字为 default 的插槽之中 -->
        <!-- 1. 如果要把内容填充到指定名称的插槽中,需要使用 v-slot: 这个指令 -->
        <!-- 2. v-slot: 后面要跟上插槽的名字 -->
        <!-- 3. v-slot: 指令不能直接用在元素身上,必须用在 template 标签上 -->
        <!-- 4. template 这个标签,它是一个虚拟的标签,只起到包裹性质的作用,但是,不会被渲染为任何实质性的 html 元素 -->
        <!-- 5. v-slot: 指令的简写形式是 # -->
        <template #default>
          <p>这是在 Left 组件的内容区域,声明的 p 标签</p>
        </template>
      </Left>
    </div>

3.这时候插槽的内容就会显示出来啦:

2.2.3 具名插槽(带有name的插槽)

具名插槽以及作用域插槽的基本用法

eg:这里以一个栗子来讲解:

1.Article.vue代码:

<template>
  <div class="article-container">
    <h3 v-color="'red'">Article 组件</h3>
    <!-- 文章的标题 -->
    <div class="header-box">
      <slot name="title"></slot>
    </div>
​
    <!-- 文章的内容 -->
    <div class="content-box">
      <!-- 在封装组件时,为预留的 <slot> 提供属性对应的值,这种用法,叫做 “作用域插槽” -->
      <slot name="content" msg="hello vue.js" :user="userinfo"></slot>
    </div>
​
    <!-- 文章的作者 -->
    <div class="footer-box">
      <slot name="author"></slot>
    </div>
  </div>
</template>
​
<script>
export default {
  // 首字母要大写
  name: 'Article',
  data() {
    return {
      // 用户的信息对象
      userinfo: {
        name: 'zs',
        age: 20
      }
    }
  }
}
</script>
​
<style lang="less" scoped>
.article-container {
  > div {
    min-height: 150px;
  }
  .header-box {
    background-color: pink;
  }
  .content-box {
    background-color: lightblue;
  }
  .footer-box {
    background-color: lightsalmon;
  }
}
</style>
​

2.App.vue代码:

<template>
  <div class="app-container">
    <h1 v-color="color">App 根组件</h1>
    <p v-color="'red'">测试</p>
​
    <button @click="color = 'green'">改变 color 的颜色值</button>
    <hr />
​
    <Article>
      <template #title>
        <h3>星月看大海</h3>
      </template>
​
      <template #content="{ msg, user }">
        <div>
          <p>啊,大海,全是水。</p>
          <p>啊,蜈蚣,全是腿。</p>
          <p>啊,辣椒,净辣嘴。</p>
          <p>{{ msg }}</p>
          <p>{{ user.name }}</p>
        </div>
      </template>
​
      <template #author>
        <div>作者:星月</div>
      </template>
    </Article>
  </div>
</template>
​
<script>
import Left from '@/components/Left.vue'
import Article from '@/components/Article.vue'
​
export default {
  data() {
    return {
      color: 'blue'
    }
  },
  components: {
    Left,
    Article
  },
  // 私有自定义指令的节点
  directives: {
    // 定义名为 color 的指令,指向一个配置对象
    /* color: {
      // 当指令第一次被绑定到元素上的时候,会立即触发 bind 函数
      // 形参中的 el 表示当前指令所绑定到的那个 DOM 对象
      bind(el, binding) {
        console.log('触发了 v-color 的 bind 函数')
        el.style.color = binding.value
      },
      // 在 DOM 更新的时候,会触发 update 函数
      update(el, binding) {
        console.log('触发了 v-color 的 update 函数')
        el.style.color = binding.value
      }
    } */
    color(el, binding) {
      el.style.color = binding.value
    }
  }
}
</script>
​
<style lang="less">
.app-container {
  padding: 1px 20px 20px;
  background-color: #efefef;
}
.box {
  display: flex;
}
</style>
 

这样就把用户在app自定义的内容通过具名插槽的方式来显示出来了。

栗子运行截图来了:

星月前端博客https://xingyue.vercel.app/

记录前端学习笔记,欢迎收藏或者提意见。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

星月前端

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值