首页 > 其他分享 >Vue插槽详解

Vue插槽详解

时间:2023-05-10 15:33:13浏览次数:62  
标签:Vue name StudyM vue 插槽 title 详解 组件

vue插槽的作用

Vue插槽是Vue中常见的一种组件间的相互通信方式,作用是让父组件可以向子组件指定位置插入html结构,适用于父组件===>子组件,在要接收数据的组件页面通过<slot></slot>标签来表示,简单来说,就是通过此标签来起到占位的作用,而要插入的内容也会对应到标签所在的位置。

1.默认插槽

默认插槽是插槽最基本的方式:

首先在父组件App.vue中引入子组件,并在引入的子组件标签内插入需要的html元素,在子组件中把需要用插槽的地方用<slot></slot>标签替代:

在App.vue中引入子组件,使用子组件,并且声明需要的数据:

1.1.引入组件

import StudyM from './components/StudyM.vue'

1.2.使用组件

<template>
  <div id="app">
    <!-- 默认插值 -->
    <StudyM title="游戏列表">
      <ul>
        <li v-for="game , index in games" :key="index">{{game}}</li>
      </ul>
    </StudyM>
    <StudyM title="推荐音乐">
      <ul>
        <li v-for="music , index in musics" :key="index">{{music}}</li>
      </ul>
    </StudyM>
    <StudyM title="电影推荐">
      <ul>
        <li v-for="movie , index in movies" :key="index">{{movie}}</li>
      </ul>
    </StudyM>
  </div>
</template>

1.3.添加数据

data(){
    return{
      games:['英雄联盟', '炉石传说', '穿越火线', 'QQ飞车', '吃鸡'],
      musics:['迷途羔羊', '红玫瑰', '富士山下', '麻雀', '妈妈的话', '故乡'],
      movies:['蜘蛛侠', '复仇者联盟', '金刚狼', '触不可及', '唐人街探案','当幸福来敲门']
    }
  }

1.4.完整的代码

父组件App.vue代码:

<template>
  <div id="app">
    <!-- 默认插值 -->
    <StudyM title="游戏列表">
      <ul>
        <li v-for="game , index in games" :key="index">{{game}}</li>
      </ul>
    </StudyM>
    <StudyM title="推荐音乐">
      <ul>
        <li v-for="music , index in musics" :key="index">{{music}}</li>
      </ul>
    </StudyM>
    <StudyM title="电影推荐">
      <ul>
        <li v-for="movie , index in movies" :key="index">{{movie}}</li>
      </ul>
    </StudyM>
  </div>
</template>

<script>
  //引入组件
  import StudyM from './components/StudyM.vue'
export default {
  name: 'App',
  components: {
    StudyM
  },
  data(){
    return{
      games:['英雄联盟', '炉石传说', '穿越火线', 'QQ飞车', '吃鸡'],
      musics:['迷途羔羊', '红玫瑰', '富士山下', '麻雀', '妈妈的话', '故乡'],
      movies:['蜘蛛侠', '复仇者联盟', '金刚狼', '触不可及', '唐人街探案','当幸福来敲门']
    }
  }
}
</script>

<style scoped>
#app{
  display: inline-flex;
  justify-content: center;
}
</style>

子组件StudyM.vue代码:

<template>
  <div class="box">
    <h4>{{title}}</h4>
    <slot></slot>
  </div>
</template>

<script>
export default {
    name:'StudyM',
    props:['title'],
}
</script>

<style scoped>
.box{
  margin: 20px;
  width: 200px;
  height: 200px;
  background-color: aqua;
}
h4{
  text-align: center;
  background-color: rgb(127, 236, 113);
}
</style>

效果图

 2.具名插槽

简单来说,所谓的具名插槽就是有名字的插槽。

那它和默认插槽有什么不同呢?

有时候我们会遇到这种场景,在一个组件中,我们虽然可以复用组件的结构,但是往往,有时候我们会遇到一个组件多用,但是结构稍微有所差别的情况,这时,就会用得到具名插槽。

2.1.首先在要插入html的部分需要一个<template>标签包裹住各个部分:

<!-- 具名插槽的写法一 -->
      <template slot="one">
        <ul>
          <li v-for="game , index in games" :key="index">{{game}}</li>
        </ul>
      </template>

2.2.其次,当给<template>标签绑定slot="name"属性时,需要在子组件中对应每个<template>给出一个<slot>并且添加上name属性:

<div class="box">
    <h4>{{title}}</h4>
    <slot name="one"></slot>
    <slot name="tow"></slot>
  </div>

2.3.完整代码

父组件App.vue代码:

<template>
  <div id="app">
    <!-- 默认插值 -->
    <StudyM title="游戏列表">
      <!-- 具名插槽的写法一 -->
      <template slot="one">
        <ul>
          <li v-for="game , index in games" :key="index">{{game}}</li>
        </ul>
      </template>
      <!-- 具名插槽的写法二 -->
      <template v-slot:tow>
        <a href="https://lol.qq.com/main.shtml">英雄联盟官网由此进入</a><br/><br>
        <a href="https://www.wegame.com.cn/">了解更多游戏</a>
      </template>
    </StudyM>
    <StudyM title="推荐音乐">
      <template slot="one">
        <ul>
          <li v-for="music , index in musics" :key="index">{{music}}</li>
        </ul>
      </template>
      <template slot="tow">
        <button>点击进入QQ音乐</button>&nbsp;&nbsp;&nbsp;
        <button>点击进入网易云音乐</button>
      </template>
    </StudyM>
    <StudyM title="电影推荐">
      <template slot="one">
        <ul>
          <li v-for="movie , index in movies" :key="index">{{movie}}</li>
        </ul>
      </template>
      <template slot="tow">
        <video controls src="https://www.oppo.com/content/dam/oppo/product-asset-library/find/find-n/v1/assets/tvc-preview-3d0357.mp4"></video>
      </template>
    </StudyM>
  </div>
</template>

<script>
  //引入组件
  import StudyM from './components/StudyM.vue'
export default {
  name: 'App',
  components: {
    StudyM
  },
  data(){
    return{
      games:['英雄联盟', '炉石传说', '穿越火线', 'QQ飞车', '吃鸡'],
      musics:['迷途羔羊', '红玫瑰', '富士山下', '麻雀', '妈妈的话', '故乡'],
      movies:['蜘蛛侠', '复仇者联盟', '金刚狼', '触不可及', '唐人街探案','当幸福来敲门']
    }
  }
}
</script>

<style scoped>
#app{
  display: inline-flex;
  justify-content: center;
}
video{
  width: 100%;
}
</style>

子组件StudyM.vue代码:

<template>
  <div class="box">
    <h4>{{title}}</h4>
    <slot name="one"></slot>
    <slot name="tow"></slot>
  </div>
</template>

<script>
export default {
    name:'StudyM',
    props:['title'],
}
</script>

<style scoped>
.box{
  margin: 20px;
  width: 300px;
  padding: 20px;
  background-color: aqua;
}
h4{
  text-align: center;
  background-color: rgb(127, 236, 113);
}
</style>

效果图

 tips: 值得注意的是,在具名插槽当中,我们不仅要使用到<template>标签,而且还要在其中声明slot="name"属性,在子组件中的<slot>标签中接收过来的name的属性值。

3.作用域插槽

作用域插槽的特点,数据在子组件中,但是根据子组件传过来的数据生成的结构需要组件的使用者(父组件)来决定,也就是说,作用域插槽的不同之处就在于,数据不在父组件身上,而是在子组件身上,且组件的结构和内容由父组件决定(父组件可以自行添加自定义内容)。作用域组件限定了组件内结构和数据的展示范围,以便在开发中我们可以根据一个组件而不断变换其中的内容和结构。

3.1.使用作用域插槽,数据在子组件中,需要通过数据绑定传给使用者插入html的部分:

<div class="box">
    <h4>{{title}}</h4>
    <!-- 把数据传给插入的html部分 -->
    <slot :movies="movies"></slot>
  </div>

3.2.此时,在使用者组件(父组件)中,使用<template>中的scope=“Data”属性将数据传递过来:

<StudyM title="游戏列表">
      <template scope="one">
        <!-- 第一种结构 -->
        <ul>
          <li v-for="m,index in one.movies" :key="index">{{m}}</li>
        </ul>
      </template>
    </StudyM>

3.3.完整代码

父组件App.vue代码:

<template>
  <div id="app">
    <!-- 默认插值 -->
    <StudyM title="游戏列表">
      <template scope="one">
        <!-- 第一种结构 -->
        <ul>
          <li v-for="m,index in one.movies" :key="index">{{m}}</li>
        </ul>
      </template>
    </StudyM>

    <StudyM title="游戏列表">
      <template scope="one">
        <!-- 第二种结构 -->
        <ol>
          <li v-for="m,index in one.movies" :key="index">{{m}}</li>
        </ol>
      </template>
    </StudyM>

    <StudyM title="游戏列表">
      <template scope="one">
        <!-- 第三种结构 -->
          <h4 v-for="m,index in one.movies" :key="index">{{m}}</h4>
      </template>
    </StudyM>
  </div>
</template>

<script>
  //引入组件
  import StudyM from './components/StudyM.vue'
export default {
  name: 'App',
  components: {
    StudyM
  },
}
</script>

<style scoped>
#app{
  display: inline-flex;
  justify-content: center;
}
video{
  width: 100%;
}
</style>

子组件StudyM.vue代码:

<template>
  <div class="box">
    <h4>{{title}}</h4>
    <!-- 把数据传给插入的html部分 -->
    <slot :movies="movies"></slot>
  </div>
</template>

<script>
export default {
    name:'StudyM',
    props:['title'],
    data(){
      return{
        movies:['蜘蛛侠', '复仇者联盟', '金刚狼', '触不可及', '唐人街探案','当幸福来敲门']
      }
    }
}
</script>

<style scoped>
.box{
  margin: 20px;
  width: 300px;
  padding: 20px;
  background-color: aqua;
}
h4{
  text-align: center;
  background-color: rgb(127, 236, 113);
}
</style>

效果图

 参考---https://blog.csdn.net/weixin_53614367/article/details/123512913

标签:Vue,name,StudyM,vue,插槽,title,详解,组件
From: https://www.cnblogs.com/pwindy/p/17388153.html

相关文章

  • 学习video相关事件及vue中监听切出页面方法
    1.vue中监听切出页面方法使用到的事件为:visibilitychangevisibilitychange是浏览器新添加的一个事件,当浏览器当前页面被最小化或切换浏览器其他标签页后者从其他页面或应用返回到当前标签页都会触发这个事件。document.visibilityState共有四个值:hidden:文档处于背景标签......
  • 正则表达式详解
    一、正则表达式概述正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。通俗的讲就是按照某种规则去匹配符合条件的字符串一个正则表达式是一种从左到右匹配主体字符串的模式。“Regularexpression”这个词比较拗口,我们常使用缩写......
  • Vue MVVM理解
    1MVVM,是Model-View-ModelView的简写在Vue中:Model:模型层,用于存储当前状态(data)View:视图层,用于向用户展示data被渲染后的UIModelView:视图模型层,监听、渲染等功能v-bind:监听Model中的data,在data变化时按照逻辑(Vue原理)进行渲染,再根据映射表找到依赖该状态的View进行更新。......
  • Vue 前端开发团队风格指南(史上最全)
    Vue官网的风格指南按照优先级(依次为必要、强烈推荐、推荐、谨慎使用)分类,本文根据项目实际情况整理了一份适用于团队开发的vue风格指南,供大家参考。一、命名规范常用的命名规范:camelCase(小驼峰式命名法——首字母小写)PascalCase(大驼峰式命名法——首字母大写)kebab-case(......
  • vue3拾遗(不定期更新)
    props传参会自动跳过key/ref/...等本身就有特殊意义的属性名路由跳转当路由到同一个路由组件时,会依次触发onBeforeUpdate、onUpdated生命周期钩子......
  • nginx部署vue项目显示空白页
    报错提示:index-fbb90c85.js:1Failedtoloadmodulescript:ExpectedaJavaScriptmodulescriptbuttheserverrespondedwithaMIMEtypeof"text/plain".原因:nginx使用容器部署,nginx.conf文件指定引用mime类型文件.解决方法:1.添加include/etc/nginx/mim.ty......
  • Vue-Router
    @目录作用教程null使用流程引入组件定义路由实例挂载路由渲染位置启动<imgsrc=""style="zoom:50%"/>作用教程单个页面路由:https://cn.vuejs.org/guide/scaling-up/routing.html#client-side-vs-server-side-routing多个页面:复杂组合视频教程:B站Allen前端使用流程引入......
  • C#-JSON详解
      最近在做微信开发时用到了一些json的问题,就是把微信返回回来的一些json数据做一些处理,但是之前json掌握的不好,浪费了好多时间在查找一些json有关的转换问题,我所知道的方法只有把json序列化和反序列化一下,但是太麻烦了我觉得,所以就在找一些更简单又方便使用的方法。也许这个会......
  • JDK1.7和JDK1.8和HashMap详解
    近期对JDK1.7和JDK1.8的HashMap源码进行了学习,今天也在这里进行个人总结一下。首先,众所周知,HashMap是以键值对的方式存储数据的,1.7的底层数据结构是数组+链表,是一个Entry数组。1.8的底层数据结构是数组+链表+红黑树·,是一个Node对象的数组。下面我就根据源码分析下HashMap是怎么......
  • vue国际化(多语言)
      方法1:用js-cookie包并且挂载在main.js上1、安装vue-i18n+js-cookie插件npminstallvue-i18n-Snpminstalljs-cookie--save2、去检查一下你安装的i18n版本是不是8.26.53、在main.js中引入4、在src上建立文件夹5、给创建的中文和英文添加语言注......