首页 > 其他分享 >Vue2 插槽

Vue2 插槽

时间:2022-10-03 13:35:27浏览次数:48  
标签:vue Skills 插槽 skills Vue2 标签 组件

Vue 插槽

概述

插槽就是组件内的一个预留区域,它允许使用者向组件内的预留区域来添加自己想要的内容。

比如我们已经写好了一个组件,然后以后可能会在指定区域插入广告,这时就可以先用插槽进行占位。如果使用者向插槽中传递广告时,这时广告才会显示出来。

插槽大概分为三种:默认插槽、具名插槽、作用域插槽。

插槽通过 <slot></slot>标签,在组件中占位。当标签内没有默认值时,如果使用者使用组件时,不插入自定义内容,那么插槽不会被渲染;如果使用者使用组件插入自定义内容时,插槽才进行渲染。如果插槽中有默认值时,如果插槽不被使用,则会输出默认值。

默认插槽

Skills.vue

<template>
  <div id="skills">
    <h2 id="title">skills</h2>
    <hr />
    <ul>
      <li v-for="(skill, index) in skills" :key="index">{{ skill }}</li>
    </ul>
  	<!-- 默认插槽 -->
    <slot></slot>
  </div>
</template>

<script>
  export default {
    name: "Skills",
    props: ["skills"]
  }
</script>

App.vue

<template>
  <div id="app">
    <div class="header">
      <Skills :skills="skills">
          // 组件标签内的所有内容将会被写到该组件中默认插槽的预留位置
        <h2>默认插槽</h2>
      </Skills>
    </div>
  </div>
</template>

<script>
  import Skills from "./components/Skills.vue"
  export default {
    name: "App",
    components: { Skills },
    data() {
      return {
        skills: ["唱", "跳", "rap", "篮球"]
      }
    }
  }
</script>
  • 注意在书写样式时,结构在哪个文件,样式就书写到哪个文件中。
  • 即使组件标签中的内容是要替换到组件插槽位置的,样式也要在组件标签所在的当前文件中书写。
  • 因为组件标签中的内容是现在本文件渲染,然后才去替换组件插槽处的位置的。

具名插槽

当我们指定多个插槽时,就需要为插槽取名字了。因为默认插槽只能存在一个。

我们在使用插槽传入内容时,必须要使用 template 标签包裹内容,并指定要服务的具名插槽的名字。

Skills.vue

<template>
  <div id="skills">
    <h2 id="title">skills</h2>
    <hr />
    <ul>
      <li v-for="(skill, index) in skills" :key="index">{{ skill }}</li>
    </ul>
    <!-- 默认插槽 -->
    <slot></slot>
    <!-- 具名插槽 -->
    <slot name="slot01"></slot>
  </div>
</template>

<script>
  export default {
    name: "Skills",
    props: ["skills"]
  }
</script>

App.vue

<template>
  <div id="app">
    <div class="header">
      <!-- 默认插槽 -->
      <Skills :skills="skills">
        <h2>默认插槽</h2>
      </Skills>
      <!-- 具名插槽 -->
      <Skills :skills="skills">
        <template v-slot:slot01>
          <div>
            <h2>具名插槽</h2>
          </div>
        </template>
      </Skills>
    </div>
  </div>
</template>

<script>
  import Skills from "./components/Skills.vue"
  export default {
    name: "App",
    components: { Skills },
    data() {
      return {
        skills: ["唱", "跳", "rap", "篮球"]
      }
    }
  }
</script>
  • 具名插槽在插槽标签中使用 name 来给插槽起名字,以达到区分的作用。
  • 具名插槽在组件标签使用时其中的结构必须使用 template 标签包裹,并且在该标签中使用 v-slot:xxxx指定所使用的具名插槽的名字。可以简写成#slot:xxx。注意是冒号:不是等号=

作用域插槽

作用域插槽并不是一种单独的插槽,而是实现插槽向使用者传递数据的一种插槽的称呼。

所以默认插槽可以是作用域插槽,具名插槽也可以是作用域插槽。

Skills.vue

<template>
  <div id="skills">
    <h2 id="title">skills</h2>
    <hr />
    <ul>
      <li v-for="(skill, index) in skills" :key="index">{{ skill }}</li>
    </ul>
    <!-- 默认插槽的作用域插槽 -->
    <slot :data="slotData"></slot>
    <!-- 具名插槽的作用域插槽 -->
    <slot name="slot01" :slotData="slotData"></slot>
  </div>
</template>

<script>
  export default {
    name: "Skills",
    props: ["skills"],
    data() {
      return {
        slotData: {
          content:"此数据由插槽传递给使用者"
        }
      }
    },
  }
</script>

App.vue

<template>
  <div id="app">
    <div class="header">
      <!-- 默认插槽 -->
      <Skills :skills="skills">
        <h2>默认插槽</h2>
      </Skills>
      <!-- 具名插槽 -->
      <Skills :skills="skills">
        <template v-slot:slot01>
          <div>
            <h2>具名插槽</h2>
          </div>
        </template>
      </Skills>
      <!-- 具名插槽作用域插槽:接收插槽组件传给使用者的数据 -->
      <Skills :skills="skills">
        <template #slot01="scope">
          <div>
            <h2>作用域插槽</h2>
            <p>{{ scope }}</p>
            <p>{{ scope.slotData.content }}</p>
          </div>
        </template>
      </Skills>
      <!-- 默认插槽作用域插槽解构赋值 -->
      <Skills :skills="skills">
        <template scope="{data}">
          <p>{{ data }}</p>
          <p>{{ data.content }}</p>
        </template>
      </Skills>
    </div>
  </div>
</template>

<script>
  import Skills from "./components/Skills.vue"
  export default {
    name: "App",
    components: { Skills },
    data() {
      return {
        skills: ["唱", "跳", "rap", "篮球"]
      }
    }
  }
</script>
  • 在插槽标签中,指定属性来向使用者传递值。
  • 使用者可以在 template 标签中接收插槽传递的值。如果是具名插槽使用#slot01="scope"接收,scope 可自定义名字,为接收的数据对象。如果是默认插槽使用scope="scope"接收。其中可以参照上面代码使用 es6 的解构赋值。

标签:vue,Skills,插槽,skills,Vue2,标签,组件
From: https://www.cnblogs.com/brokyz/p/16750395.html

相关文章

  • Vue2 mixins混入
    概述在Vue中我们的很多组件的配置都会有共用的数据,方法,钩子等等,我们可以把这些共用的部分提取到一个js文件中,并导入到需要使用的组件中,通过mixins配置项进行使用。......
  • Vue2 插件
    概述Vue的插件就是一个js文件,里面允许我们完成一些特定的功能。使用创建一个插件plugins.jsexportdefault{install(Vue){//全局过滤器Vue.filt......
  • Vue2 动画与过渡
    概述Vue为我们优化了CSS动画在Vue中的使用,帮助我们在使用动画的时候更加的得心应手。使用CSS动画完成Vue动画<template><divid="app"><button@cli......
  • Vue2 指令操作
    概述指令是vue为开发者提供的模板语法,用于辅助开发者渲染页面的基本结构。vue中的指令按照不同的用途可分为如下6大类:内容渲染指令。属性绑定指令。事件绑定指......
  • Vue2 计算属性
    概述计算属性指的是通过一系列运算之后,最终得到一个属性值。间的的理解,当我们拥有一些数据时,我们需要将这些数据整合到一起,这时候计算属性就会完成这个操作,整合到一起的......
  • Vue2 props
    props概述我们的组件进行展示数据时,里面并不是都是写死的。我们需要在使用组件时,向组件内部传值,并展现我们需要的值。数组形式接收propsTestProps.vue<template> ......
  • 面试官:vue2和vue3的区别有哪些?
    一、Vue3与Vue2区别详述1.生命周期对于生命周期来说,整体上变化不大,只是大部分生命周期钩子名称上+“on”,功能上是类似的。不过有一点需要注意,Vue3在组合式API(Compo......
  • 【尚硅谷】Vue2.x组件化编码学习笔记--渐进式的JS框架
    Vue组件化编码​​一、使用Vue-cli创建项目​​​​1.1说明​​​​1.2创建Vue项目​​​​1.2.1如何修改端口以及自动运行​​​​1.3Vue-cli创建的项目的目录结构​​......
  • VUE2速成-5(插件及打包)
    文章目录​​一、Vue的插件大全​​​​二、Vue插件举例​​​​1.轮播图插件(vue-awesome-swiper)​​​​2.UI组件库(ElementUI)​​​​三、vue-cli打包部署​​一、Vue的......
  • VUE2速成-3(路由进一步及Ajax请求)
    文章目录​​一、路由进一步​​​​1.命名路由​​​​2.重定向和别名​​​​3.HTML5History模式​​​​4.导航守卫​​​​4.1全局前置守卫​​​​4.2全局后置......