详解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 相关文章推荐
js综合应用实例简单的表格统计
Sep 03 Javascript
JS 有趣的eval优化输入验证实例代码
Sep 22 Javascript
javascript特殊用法示例介绍
Nov 29 Javascript
JavaScript的Ext JS框架中的GridPanel组件使用指南
May 21 Javascript
JS控制层作圆周运动的方法
Jun 20 Javascript
基于JS实现的随机数字抽签实例
Dec 08 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
Feb 16 Javascript
vue移动端路由切换实例分析
May 14 Javascript
Django+Vue跨域环境配置详解
Jul 06 Javascript
vue-router懒加载速度缓慢问题及解决方法
Nov 25 Javascript
JavaScript实现简单轮播图效果
Dec 01 Javascript
vue响应式更新机制及不使用框架实现简单的数据双向绑定问题
Jun 27 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企业级应用之常见缓存技术篇
2011/01/27 PHP
PHP中使用json数据格式定义字面量对象的方法
2014/08/20 PHP
php实现的mysqldb读写分离操作类示例
2017/02/07 PHP
PHP levenshtein()函数用法讲解
2019/03/08 PHP
JavaScript 弹出窗体点击按钮返回选择数据的实现
2010/04/01 Javascript
jquery向.ashx文件post中文乱码问题的解决方法
2011/03/28 Javascript
jQuery回车实现登录简单实现
2013/08/20 Javascript
jQuery ajax serialize() 方法使用示例
2014/11/02 Javascript
Node.js实现批量去除BOM文件头
2014/12/20 Javascript
如何使用HTML5地理位置定位功能
2015/04/27 Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
2016/03/30 Javascript
Vue.js系列之项目结构说明(2)
2017/01/03 Javascript
浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法
2017/02/06 Javascript
jQuery实现的简单图片轮播效果完整示例
2018/02/08 jQuery
Vue中computed、methods与watch的区别总结
2019/04/10 Javascript
Vue项目从webpack3.x升级webpack4不完全指南
2019/04/28 Javascript
Bootstrap table 服务器端分页功能实现方法示例
2020/06/01 Javascript
python抓取京东价格分析京东商品价格走势
2014/01/09 Python
Python基础教程之正则表达式基本语法以及re模块
2016/03/25 Python
解决Django加载静态资源失败的问题
2019/07/28 Python
基于PyQT实现区分左键双击和单击
2020/05/19 Python
Pytorch使用PIL和Numpy将单张图片转为Pytorch张量方式
2020/05/25 Python
TensorFlow中如何确定张量的形状实例
2020/06/23 Python
Python学习之time模块的基本使用
2021/01/17 Python
Python实现给PDF添加水印的方法
2021/01/25 Python
纯CSS3打造动感漂亮时尚的扇形菜单
2014/03/18 HTML / CSS
远程Wi-Fi宠物监控相机:Petcube
2017/04/26 全球购物
劳力士官方珠宝商:J.R. Dunn Jewelers
2018/09/29 全球购物
大学生实习自我鉴定
2013/12/11 职场文书
员工安全生产承诺书
2014/05/22 职场文书
小学数学课题方案
2014/06/15 职场文书
意外伤害赔偿协议书
2014/09/16 职场文书
碧霞祠导游词
2015/02/09 职场文书
2015年环保局工作总结
2015/05/22 职场文书
小学班主任工作随笔
2015/08/15 职场文书
关于JavaScript轮播图的实现
2021/11/20 Javascript