详解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 相关文章推荐
漂亮的提示信息(带箭头)
Mar 21 Javascript
Bootstrap学习笔记之css样式设计(1)
Jun 07 Javascript
JS实现简单表格排序操作示例
Oct 07 Javascript
Angular实现的日程表功能【可添加及隐藏显示内容】
Dec 27 Javascript
微信小程序开发之tabbar图标和颜色的实现
Oct 17 Javascript
ES6基础之解构赋值(destructuring assignment)
Feb 21 Javascript
微信小程序实现的图片保存功能示例
Apr 24 Javascript
js getBoundingClientRect使用方法详解
Jul 17 Javascript
JS实现简易计算器
Feb 14 Javascript
Vue使用vue-draggable 插件在不同列表之间拖拽功能
Mar 12 Javascript
javascript实现前端input密码输入强度验证
Jun 24 Javascript
浅谈vue在html中出现{{}}的原因及解决方式
Nov 16 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 特殊字符处理函数
2008/09/05 PHP
基于PHP微信红包的算法探讨
2016/07/21 PHP
详解PHP归并排序的实现
2016/10/18 PHP
js调用flash的效果代码
2008/04/26 Javascript
JavaScript RegExp方法获取地址栏参数(面向对象)
2009/03/10 Javascript
JS解析XML的实现代码
2009/11/12 Javascript
js的touch事件的实际引用
2014/10/13 Javascript
通过vue-router懒加载解决首次加载时资源过多导致的速度缓慢问题
2018/04/08 Javascript
微信小程序全局变量GLOBALDATA的定义和调用过程解析
2019/09/23 Javascript
Vue最新防抖方案(必看篇)
2019/10/30 Javascript
[50:02]完美世界DOTA2联赛PWL S2 Magma vs FTD 第三场 11.29
2020/12/03 DOTA
使用python删除nginx缓存文件示例(python文件操作)
2014/03/26 Python
python使用wxpython开发简单记事本的方法
2015/05/20 Python
一些常用的Python爬虫技巧汇总
2016/09/28 Python
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
2017/07/11 Python
Pycharm导入Python包,模块的图文教程
2018/06/13 Python
Python+Pandas 获取数据库并加入DataFrame的实例
2018/07/25 Python
pygame游戏之旅 添加碰撞效果的方法
2018/11/20 Python
画pytorch模型图,以及参数计算的方法
2019/08/17 Python
python+selenium select下拉选择框定位处理方法
2019/08/24 Python
python绘制BA无标度网络示例代码
2019/11/21 Python
django框架F&amp;Q 聚合与分组操作示例
2019/12/12 Python
python使用turtle库绘制奥运五环
2020/02/24 Python
CSS3圆角边框和边界图片效果实例
2016/07/01 HTML / CSS
canvas学习和滤镜实现代码
2018/08/22 HTML / CSS
Html5页面获取微信公众号的openid的方法
2020/05/12 HTML / CSS
AmazeUI 点击元素显示全屏的实现
2020/08/25 HTML / CSS
西铁城美国官方网站:Citizen Watch美国
2019/11/08 全球购物
科颜氏印度官网:Kiehl’s印度
2021/02/20 全球购物
企业元宵节主持词
2014/03/25 职场文书
车辆转让协议书
2014/04/15 职场文书
3分钟演讲稿
2014/04/30 职场文书
祖国在我心中演讲稿500字
2014/05/04 职场文书
领导走群众路线整改措施思想汇报
2014/10/12 职场文书
CSS实现五种常用的2D转换
2021/12/06 HTML / CSS
安装Windows Server 2012 R2企业版操作系统并设置好相关参数
2022/04/29 Servers