详解Vue 匿名、具名和作用域插槽的使用方法


Posted in Javascript onApril 22, 2019

Vue 中的插槽在开发组件的过程中其实是非常重要并且好用的。Vue 的插槽也没有说很难使用,这篇文章简明扼要的介绍了三种插槽的用法。

匿名插槽

子组件定义 slot 插槽,但并未具名,因此也可以说是默认插槽。只要在父元素中插入的内容,默认加入到这个插槽中去。 ?

<template>
 <div>
 hello <slot>陌生人</slot>
 </div>
</template>

这里定义了一个默认插槽,只要往里头丢东西,就会被加入到这个插槽里面

slot 元素里面可以加入一系列后备内容,一旦父元素没有插入任何信息,那么就会渲染后备内容。

<my-comp>
 oli
</my-comp>

如在父组件中使用这个子组件,并插入 oli 字符串,效果如下:

详解Vue 匿名、具名和作用域插槽的使用方法

具名插槽

具名插槽可以出现在不同的地方,不限制出现的次数。只要匹配了 name 那么这些内容就会被插入到这个 name 的插槽中去。

<template>
 <div>
 <slot name="nav"></slot>
 <br/>
 <slot name="content"></slot>
 <br/>
 <slot name="footer"></slot>
 </div>
</template>

比如上述代码定义了三个具名插槽。在父组件中即可使用 slot 属性插入到对应的插槽中:

<template>
 <div>
 <my-comp>
 <template slot="nav">navigator</template>
 <template slot="footer">footer</template>
 <template slot="content">content</template>
 </my-comp>
 </div>
</template>

另外,顺序并不重要,content 在 footer 下方但依然能够按照 slot 定义的顺序渲染:

详解Vue 匿名、具名和作用域插槽的使用方法

作用域插槽

通常情况下普通的插槽是父组件使用插槽过程中传入东西决定了插槽的内容。但有时我们需要获取到子组件提供的一些数据,那么作用域插槽就排上用场了。 ?

在子组件中创建 slot 并通过 v-bind 绑定数据 prop 的形式传入数据:

<slot :data="data"></slot>

在组件 data 中创建数据:

export default {
 name: 'MyComp',
 data () {
 return {
 data: { // 内部状态
 username: 'oli'
 }
 }
 }
}

这样就可以在插槽中访问到子元素的数据了:

<template v-slot:default="user">{{user.data.username}}</template>

也可以不书写 default 关键字,默认就是假定对应默认插槽

<template v-slot="user">{{user.data.username}}</template>

使用 v-slot 绑定一个命名空间 user,这样就可以通过 user 对象引用到子组件中传入的数据了

与具名插槽配合时,需要明确书写对应的命名空间:

<template #:one="user">{{user.data.username}}</template>
<template #:another="user">{{user.data.username}}</template>
# 代表 v-slot 的缩写,缩写在有参数的情况下才会生效

动态插槽名

另外,2.6 版本的 vue 还加入了动态插槽名的功能,用来动态的定义插槽名称:

<template #:[dynamicSlotName]></template>

https://cn.vuejs.org/v2/guide...

PS:Vue作用域插槽使用实例详解

这次给大家带来Vue作用域插槽使用详解,Vue作用域插槽使用的注意事项有哪些,下面就是实战案例,一起来看一下。

举个例子,比如我写了一个可以实现条纹相间的列表组件,发布后,使用者可以自定义每一行的内容或样式(普通的slot就可以完成这个工作)。而作用域插槽的关键之处就在于,父组件能接收来自子组件的slot传递过来的参数,具体看案例和注释。

<!DOCTYPE html>
 <htmllang="en">
 <head>
  <metacharset="UTF-8">
  <title>Vue作用域插槽</title>
  <scriptsrc="https://cdn.bootcss.com/vue/2.3.4/vue.js"></script>
 </head>
 <body>
  <pid="app2">
   <my-stripe-list:items="users"odd-bgcolor="#D3DCE6"even-bgcolor="#E5E9F2">
    <!-- props对象接收来自子组件slot的$index参数 -->
    <templateslot="cont"scope="props">
     <span>{{users[props.$index].id}}</span>
     <span>{{users[props.$index].name}}</span>
     <span>{{users[props.$index].age}}</span>
     <!-- 这里可以自定[编辑][删除]按钮的链接和样式 -->
     <a:href="'#edit/id/'+users[props.$index].id"rel="external nofollow">编辑</a>
     <a:href="'#del/id/'+users[props.$index].id"rel="external nofollow">删除</a>
    </template>
   </my-stripe-list>
  </p>
  <script>
   Vue.component('my-stripe-list', {
    /*slot的$index可以传递到父组件中*/
    template: `
     <p>
      <pv-for="(item, index) in items"style="line-height:2.2;":style="index % 2 === 0 ? 'background:'+oddBgcolor : 'background:'+evenBgcolor">
       <slotname="cont":$index="index"></slot>
      </p>
     </p>
    `,
    props: {
     items: Array,
     oddBgcolor: String,
     evenBgcolor: String
    }
   });
   new Vue({
    el: '#app2',
    data: {
     users: [
      {id: 1, name: '张三', age: 20},
      {id: 2, name: '李四', age: 22},
      {id: 3, name: '王五', age: 27},
      {id: 4, name: '张龙', age: 27},
      {id: 5, name: '赵虎', age: 27}
     ]
    }
   });
  </script>
 </body>
</html>

总结

以上所述是小编给大家介绍的Vue 匿名、具名和作用域插槽的使用方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
JavaScript中“过于”犀利地for/in循环使用示例
Oct 22 Javascript
javascript原始值和对象引用实例分析
Apr 25 Javascript
jQuery基于BootStrap样式实现无限极地区联动
Aug 26 Javascript
JavaScript之cookie技术详解
Nov 18 Javascript
jQuery Validate让普通按钮触发表单验证的方法
Dec 15 Javascript
Bootstrap缩略图与警告框学习使用
Feb 08 Javascript
js获取当前页的URL与window.location.href简单方法
Feb 13 Javascript
解决LayUI表单获取不到data的问题
Aug 20 Javascript
jQuery判断自定义属性data-val用法示例
Jan 07 jQuery
浅析Vue中拆分视图层代码的5点建议
Aug 15 Javascript
详解React的回调渲染模式
Sep 10 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
Nov 10 Javascript
详解Node.js一行命令上传本地文件到服务器
Apr 22 #Javascript
使用 vue 实例更好的监听事件及vue实例的方法
Apr 22 #Javascript
Angular中使用ng-zorro图标库部分图标不能正常显示问题
Apr 22 #Javascript
关于vue-cli 3配置打包优化要点(推荐)
Apr 22 #Javascript
说说如何利用 Node.js 代理解决跨域问题
Apr 22 #Javascript
详解Vue中使用Axios拦截器
Apr 22 #Javascript
Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验
Apr 22 #Javascript
You might like
PHP无限分类的类
2007/01/02 PHP
实测在class的function中include的文件中非php的global全局环境
2013/07/15 PHP
php把数据表导出为Excel表的最简单、最快的方法(不用插件)
2014/05/10 PHP
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
2015/05/12 PHP
php 中的信号处理操作实例详解
2020/03/04 PHP
TNC vs BOOM BO3 第二场2.13
2021/03/10 DOTA
关于JavaScript中string 的replace
2013/04/12 Javascript
纯js分页代码(简洁实用)
2013/11/05 Javascript
JavaScript实现两个Table固定表头根据页面大小自行调整
2014/01/03 Javascript
使用原生JS实现弹出层特效
2014/12/22 Javascript
js实现的四级左侧网站分类菜单实例
2015/05/06 Javascript
JS实现光滑展开合拢的菜单效果代码
2015/09/16 Javascript
jQuery实现Email邮箱地址自动补全功能代码
2015/11/03 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
微信小程序实现多个按钮toggle功能的实例
2017/06/13 Javascript
关于页面刷新vuex数据消失问题解决方案
2017/07/03 Javascript
浅谈Node Inspector 代理实现
2017/10/19 Javascript
对vue中methods互相调用的方法详解
2018/08/30 Javascript
Vue中Quill富文本编辑器的使用教程
2018/09/21 Javascript
使用JS获取页面上的所有标签
2018/10/18 Javascript
利用Angular7开发一个Radio组件的全过程
2019/07/11 Javascript
Vue+ElementUI table实现表格分页
2019/12/14 Javascript
原生JavaScript实现的无缝滚动功能详解
2020/01/17 Javascript
Python模块搜索概念介绍及模块安装方法介绍
2015/06/03 Python
Python使用smtplib模块发送电子邮件的流程详解
2016/06/27 Python
python urllib爬取百度云连接的实例代码
2017/06/19 Python
python 筛选数据集中列中value长度大于20的数据集方法
2018/06/14 Python
Python定义二叉树及4种遍历方法实例详解
2018/07/05 Python
python 直接赋值和copy的区别详解
2019/08/07 Python
Python for循环及基础用法详解
2019/11/08 Python
记录一下scrapy中settings的一些配置小结
2020/09/28 Python
德国高品质男装及配饰商城:Cultizm(Raw Denim原色牛仔裤)
2018/04/16 全球购物
2014年师德师风自我剖析材料
2014/09/27 职场文书
2015年宣传部个人工作总结
2015/05/14 职场文书
跑吧孩子观后感
2015/06/10 职场文书
python和C/C++混合编程之使用ctypes调用 C/C++的dll
2022/04/29 Python