目录
具名插槽
作用域插槽 | 带数据的插槽
首页 web前端 js教程 vue中slot与slot-scope的具体使用方法

vue中slot与slot-scope的具体使用方法

May 14, 2018 pm 05:22 PM
slot 使用方法

本文主要介绍vue中slot与slot-scope的具体使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。

写在前面

vue中关于插槽的文档说明很短,语言又写的很凝练,再加上其和methods,data,computed等常用选项使用频率、使用先后上的差别,这就有可能造成初次接触插槽的开发者容易产生“算了吧,回头再学,反正已经可以写基础组件了”,于是就关闭了vue说明文档。

实际上,插槽的概念很简单,下面通过分三部分来讲。这个部分也是按照vue说明文档的顺序来写的。

进入三部分之前,先让还没接触过插槽的同学对什么是插槽有一个简单的概念:插槽,也就是slot,是组件的一块HTML模板,这块模板显示不显示、以及怎样显示由父组件来决定。 实际上,一个slot最核心的两个问题这里就点出来了,是显示不显示和怎样显示。

由于插槽是一块模板,所以,对于任何一个组件,从模板种类的角度来分,其实都可以分为非插槽模板和插槽模板两大类。

非插槽模板指的是html模板,指的是‘p、span、ul、table'这些,非插槽模板的显示与隐藏以及怎样显示由插件自身控制;插槽模板是slot,它是一个空壳子,因为它显示与隐藏以及最后用什么样的html模板显示由父组件控制。但是插槽显示的位置确由子组件自身决定,slot写在组件template的哪块,父组件传过来的模板将来就显示在哪块。

单个插槽 | 默认插槽 | 匿名插槽

首先是单个插槽,单个插槽是vue的官方叫法,但是其实也可以叫它默认插槽,或者与具名插槽相对,我们可以叫它匿名插槽。因为它不用设置name属性。

单个插槽可以放置在组件的任意位置,但是就像它的名字一样,一个组件中只能有一个该类插槽。相对应的,具名插槽就可以有很多个,只要名字(name属性)不同就可以了。

下面通过一个例子来展示。

父组件:

<template>
 <p class="father">
  <h3>这里是父组件</h3>
  <child>
   <p class="tmpl">
    <span>菜单1</span>
    <span>菜单2</span>
    <span>菜单3</span>
    <span>菜单4</span>
    <span>菜单5</span>
    <span>菜单6</span>
   </p>
  </child>
 </p>
</template>
登录后复制

子组件:

<template>
 <p class="child">
  <h3>这里是子组件</h3>
  <slot></slot>
 </p>
</template>
登录后复制

在这个例子里,因为父组件在<child></child>里面写了html模板,那么子组件的匿名插槽这块模板就是下面这样。也就是说,子组件的匿名插槽被使用了,是被下面这块模板使用了。

&lt;p class=&quot;tmpl&quot;&gt;
 &lt;span&gt;菜单1&lt;/span&gt;
 &lt;span&gt;菜单2&lt;/span&gt;
 &lt;span&gt;菜单3&lt;/span&gt;
 &lt;span&gt;菜单4&lt;/span&gt;
 &lt;span&gt;菜单5&lt;/span&gt;
 &lt;span&gt;菜单6&lt;/span&gt;
&lt;/p&gt;
登录后复制

最终的渲染结果如图所示:

注:所有demo都加了样式,以方便观察。其中,父组件以灰色背景填充,子组件都以浅蓝色填充。

具名插槽

匿名插槽没有name属性,所以是匿名插槽,那么,插槽加了name属性,就变成了具名插槽。具名插槽可以在一个组件中出现N次。出现在不同的位置。下面的例子,就是一个有两个具名插槽和单个插槽的组件,这三个插槽被父组件用同一套css样式显示了出来,不同的是内容上略有区别。

父组件:

&lt;template&gt;
 &lt;p class=&quot;father&quot;&gt;
 &lt;h3&gt;这里是父组件&lt;/h3&gt;
 &lt;child&gt;
  &lt;p class=&quot;tmpl&quot; slot=&quot;up&quot;&gt;
  &lt;span&gt;菜单1&lt;/span&gt;
  &lt;span&gt;菜单2&lt;/span&gt;
  &lt;span&gt;菜单3&lt;/span&gt;
  &lt;span&gt;菜单4&lt;/span&gt;
  &lt;span&gt;菜单5&lt;/span&gt;
  &lt;span&gt;菜单6&lt;/span&gt;
  &lt;/p&gt;
  &lt;p class=&quot;tmpl&quot; slot=&quot;down&quot;&gt;
  &lt;span&gt;菜单-1&lt;/span&gt;
  &lt;span&gt;菜单-2&lt;/span&gt;
  &lt;span&gt;菜单-3&lt;/span&gt;
  &lt;span&gt;菜单-4&lt;/span&gt;
  &lt;span&gt;菜单-5&lt;/span&gt;
  &lt;span&gt;菜单-6&lt;/span&gt;
  &lt;/p&gt;
  &lt;p class=&quot;tmpl&quot;&gt;
  &lt;span&gt;菜单-&gt;1&lt;/span&gt;
  &lt;span&gt;菜单-&gt;2&lt;/span&gt;
  &lt;span&gt;菜单-&gt;3&lt;/span&gt;
  &lt;span&gt;菜单-&gt;4&lt;/span&gt;
  &lt;span&gt;菜单-&gt;5&lt;/span&gt;
  &lt;span&gt;菜单-&gt;6&lt;/span&gt;
  &lt;/p&gt;
 &lt;/child&gt;
 &lt;/p&gt;
&lt;/template&gt;
登录后复制

子组件:

&lt;template&gt;
 &lt;p class=&quot;child&quot;&gt;
 // 具名插槽
 &lt;slot name=&quot;up&quot;&gt;&lt;/slot&gt;
 &lt;h3&gt;这里是子组件&lt;/h3&gt;
 // 具名插槽
 &lt;slot name=&quot;down&quot;&gt;&lt;/slot&gt;
 // 匿名插槽
 &lt;slot&gt;&lt;/slot&gt;
 &lt;/p&gt;
&lt;/template&gt;
登录后复制

显示结果如图:

可以看到,父组件通过html模板上的slot属性关联具名插槽。没有slot属性的html模板默认关联匿名插槽。

作用域插槽 | 带数据的插槽

最后,就是我们的作用域插槽。这个稍微难理解一点。官方叫它作用域插槽,实际上,对比前面两种插槽,我们可以叫它带数据的插槽。什么意思呢,就是前面两种,都是在组件的template里面写

匿名插槽

&lt;slot&gt;&lt;/slot&gt;
登录后复制

具名插槽

&lt;slot name=&quot;up&quot;&gt;&lt;/slot&gt;
登录后复制

但是作用域插槽要求,在slot上面绑定数据。也就是你得写成大概下面这个样子。

&lt;slot name=&quot;up&quot; :data=&quot;data&quot;&gt;&lt;/slot&gt;
 export default {
 data: function(){
  return {
  data: [&#39;zhangsan&#39;,&#39;lisi&#39;,&#39;wanwu&#39;,&#39;zhaoliu&#39;,&#39;tianqi&#39;,&#39;xiaoba&#39;]
  }
 },
}
登录后复制

我们前面说了,插槽最后显示不显示是看父组件有没有在child下面写模板,像下面那样。

&lt;child&gt;
 html模板
&lt;/child&gt;
登录后复制

写了,插槽就总得在浏览器上显示点东西,东西就是html该有的模样,没写,插槽就是空壳子,啥都没有。
OK,我们说有html模板的情况,就是父组件会往子组件插模板的情况,那到底插一套什么样的样式呢,这由父组件的html+css共同决定,但是这套样式里面的内容呢?

正因为作用域插槽绑定了一套数据,父组件可以拿来用。于是,情况就变成了这样:样式父组件说了算,但内容可以显示子组件插槽绑定的。

我们再来对比,作用域插槽和单个插槽和具名插槽的区别,因为单个插槽和具名插槽不绑定数据,所以父组件是提供的模板要既包括样式由包括内容的,上面的例子中,你看到的文字,“菜单1”,“菜单2”都是父组件自己提供的内容;而作用域插槽,父组件只需要提供一套样式(在确实用作用域插槽绑定的数据的前提下)。

下面的例子,你就能看到,父组件提供了三种样式(分别是flex、ul、直接显示),都没有提供数据,数据使用的都是子组件插槽自己绑定的那个人名数组。

父组件:

&lt;template&gt;
 &lt;p class=&quot;father&quot;&gt;
 &lt;h3&gt;这里是父组件&lt;/h3&gt;
 &lt;!--第一次使用:用flex展示数据--&gt;
 &lt;child&gt;
  &lt;template slot-scope=&quot;user&quot;&gt;
  &lt;p class=&quot;tmpl&quot;&gt;
   &lt;span v-for=&quot;item in user.data&quot;&gt;{{item}}&lt;/span&gt;
  &lt;/p&gt;
  &lt;/template&gt;

 &lt;/child&gt;

 &lt;!--第二次使用:用列表展示数据--&gt;
 &lt;child&gt;
  &lt;template slot-scope=&quot;user&quot;&gt;
  &lt;ul&gt;
   &lt;li v-for=&quot;item in user.data&quot;&gt;{{item}}&lt;/li&gt;
  &lt;/ul&gt;
  &lt;/template&gt;

 &lt;/child&gt;

 &lt;!--第三次使用:直接显示数据--&gt;
 &lt;child&gt;
  &lt;template slot-scope=&quot;user&quot;&gt;
  {{user.data}}
  &lt;/template&gt;

 &lt;/child&gt;

 &lt;!--第四次使用:不使用其提供的数据, 作用域插槽退变成匿名插槽--&gt;
 &lt;child&gt;
  我就是模板
 &lt;/child&gt;
 &lt;/p&gt;
&lt;/template&gt;
登录后复制

子组件:

&lt;template&gt;
 &lt;p class=&quot;child&quot;&gt;

 &lt;h3&gt;这里是子组件&lt;/h3&gt;
 // 作用域插槽
 &lt;slot :data=&quot;data&quot;&gt;&lt;/slot&gt;
 &lt;/p&gt;
&lt;/template&gt;

 export default {
 data: function(){
  return {
  data: [&#39;zhangsan&#39;,&#39;lisi&#39;,&#39;wanwu&#39;,&#39;zhaoliu&#39;,&#39;tianqi&#39;,&#39;xiaoba&#39;]
  }
 }
}
登录后复制

结果如图所示:

相关推荐:

vue.js数据传递以及数据分发slot实例详解

Vue内容分发slot

js组件SlotMachine实现图片切换效果制作抽奖系统_javascript技巧

以上是vue中slot与slot-scope的具体使用方法的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章标签

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

DirectX修复工具怎么用?DirectX修复工具详细使用方法 DirectX修复工具怎么用?DirectX修复工具详细使用方法 Mar 15, 2024 am 08:31 AM

DirectX修复工具怎么用?DirectX修复工具详细使用方法

HTTP 525状态码介绍:探究其定义和应用 HTTP 525状态码介绍:探究其定义和应用 Feb 18, 2024 pm 10:12 PM

HTTP 525状态码介绍:探究其定义和应用

百度网盘怎么用-百度网盘的使用方法 百度网盘怎么用-百度网盘的使用方法 Mar 04, 2024 pm 09:28 PM

百度网盘怎么用-百度网盘的使用方法

快速学会复制和粘贴操作 快速学会复制和粘贴操作 Feb 18, 2024 pm 03:25 PM

快速学会复制和粘贴操作

KMS激活工具是什么?KMS激活工具怎么用?KMS激活工具使用方法? KMS激活工具是什么?KMS激活工具怎么用?KMS激活工具使用方法? Mar 18, 2024 am 11:07 AM

KMS激活工具是什么?KMS激活工具怎么用?KMS激活工具使用方法?

小马win7激活工具如何使用-小马win7激活工具使用的方法 小马win7激活工具如何使用-小马win7激活工具使用的方法 Mar 04, 2024 pm 06:16 PM

小马win7激活工具如何使用-小马win7激活工具使用的方法

PyCharm是什么?功能介绍和使用方法详解 PyCharm是什么?功能介绍和使用方法详解 Feb 20, 2024 am 09:21 AM

PyCharm是什么?功能介绍和使用方法详解

如何正确使用win10命令提示符进行自动修复操作 如何正确使用win10命令提示符进行自动修复操作 Dec 30, 2023 pm 03:17 PM

如何正确使用win10命令提示符进行自动修复操作

See all articles