0
点赞
收藏
分享

微信扫一扫

插槽(组件的优化)

杨小羊_ba17 2022-03-27 阅读 50
vue架构

1. 什么是插槽

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

可以把插槽

2. . 体验插槽的基础用法 (简写为#)

在封装组件时,可以通过 <solt>元素定义插槽,从而为用户预留内容占位符。示例代码如下

认为是组件封装期间,为用户预留的内容的占位符

<template>
	<p>这是MyCom1 组件的第一个p标签</p>
  //通过sort 标签,为用户预留内容占位符(插槽)
  <slot></slot>
  <p>这是MyCom1 组件最后一个P标签</p>
</template>
<my-com-1>
	// 在使用MyCom1组件是,为插槽指定具体的内容
  <p>用户自定义的内容</p>
</my-com-1>

2.1 没有预留插槽的内容会被丢弃

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

<template>
	<p>这是MyCom1 组件的第一个p标签</p>
  //封装组件,没有预留任何插槽
  <p>这是MyCom1 组件的最后一个p标签</p>
</template>
<template>
	<p>这是MyCom1 组件的第一个p标签</p>
  //封装组件,没有预留任何插槽
  <p>这是MyCom1 组件的最后一个p标签</p>
</template>

在封装组件是,为预留的<slot>提供对应的值,这种用法,叫做"作用域插槽"(留有数据的插槽)

<template>
  <div class="app-container">
    <h1>App 根组件</h1>
    <hr />
    <Article>
      <template #title="{msg,user}">
        <h3>我是文章的标题</h3>
        <h4>{{msg}}</h4>
        <h4>{{user.name}}</h4>
      </template>
        <template #content>
        <p>我是文章的内容</p>
        <p>我是文章的内容</p>
        <p>我是文章的内容</p>
      </template>
      <template #footer>
        <p>我是文章的页脚</p>
        <p>我是文章的页脚</p>
        <p>我是文章的页脚</p>
        <p>我是文章的页脚</p>
        <p>我是文章的页脚</p>
        <p>我是文章的页脚</p>
        <p>我是文章的页脚</p>
        <p>我是文章的页脚</p> 
      </template>
    </Article>
    <div class="box" style="display:none">
      <!-- 渲染 Left 组件和 Right 组件 -->
      <Left>
        <!-- 默认情况下,在使用组件的时候提供的内容都会被填充到名字为default的插槽之中 -->
        <!-- 1.如果要内容填充到指定名称的插槽中,需要使用v-slot:这个指令 -->
        <!-- 2.v-slot:后面要跟上插槽的名字 -->
        <!-- 3.v-slot:指令不能直接用在元素身上,必须在template标签上 -->
        <!-- 4.teplate这个标签,他是一个虚拟的标签,只起到一个包裹的作用,但是不会被渲染为任何实质性的html元素 -->
        <!-- 5.v-slot:指令的简写形式是# -->
        <template #default>
          <p>这是在left组件的内容区域,声明的p标签</p>
        </template>
      </Left>
    </div>
  </div>
</template>

<script>
import Article from './components/Article.vue'
import Left from './components/Left.vue'
export default {
  components: { Left, Article },}
</script>

<style lang="less">
.app-container {
  padding: 1px 20px 20px;
  background-color: #efefef;
}
.box {
  display: flex;
}
</style>
<template>
  <div class="article-container">
    <!-- 文章的标题 -->
    <div class="header-box">
      <slot name="title" msg="Helo vue .js" :user="userinfo"></slot>
    </div>

    <!-- 文章的内容 -->
    <div class="content-box">
      <!-- 在封装组件是,为预留的<slot>提供对应的值,这种用法,叫做"作用域插槽"(留有数据的插槽) -->
      <slot name="content"></slot>
    </div>

    <!-- 文章的作者 -->
    <div class="footer-box">
      <slot name="footer"></slot>
    </div>

  </div>
</template>

<script>
export default {
  name: 'Article',

  data() {
    return {
      userinfo:{
        name:"张三",
        age:"23"
      }
    }
  },

  mounted() {},

  methods: {},
}
</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: lightcoral;
  }
}
</style>

 在设置是,要先确认接收方与发送方,接收方要通过template里面的v-slot来接收并且指定插槽名字,发送方需要在组件内定义数据通过slot来发送数据,发送形式可以有多种。

注意:1.默认情况下,在使用组件的时候提供的内容都会被被填充到名字为default的插槽之中

        2.如果要内容填充到指定的插槽中,需要v-slot:这个指令

        3.v-slot:后面要跟上插槽的名字(在name节点中定义的)

        4.v-slot:指令不能用在元素的身上,必须在template标签上或者在已经注册节点

        5.teplate这个标签的作用,但是不会被渲染为任何实质性的html元素

        6.v-slot:指令的简写形式是#

举报

相关推荐

0 条评论