详解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 相关文章推荐
JQUERY操作JSON实例代码
Feb 09 Javascript
javascript判断两个IP地址是否在同一个网段的实现思路
Dec 13 Javascript
JS关闭窗口与JS关闭页面的几种方法小结
Dec 17 Javascript
跟我学习javascript的执行上下文
Nov 18 Javascript
WordPress中鼠标悬停显示和隐藏评论及引用按钮的实现
Jan 12 Javascript
使用vue.js开发时一些注意事项
Apr 27 Javascript
通过扫描二维码打开app的实现代码
Nov 10 Javascript
jQuery实现复选框的全选和反选
Feb 02 Javascript
js实现类bootstrap模态框动画
Feb 07 Javascript
angular实现IM聊天图片发送实例
May 08 Javascript
BootStrap的两种模态框方式
May 10 Javascript
详解Vue内部怎样处理props选项的多种写法
Nov 06 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
将数组写入txt文件 var_export
2009/04/21 PHP
PHP查询数据库中满足条件的记录条数(两种实现方法)
2013/01/29 PHP
PHP入门教程之字符串处理技巧总结(转换,过滤,解析,查找,截取,替换等)
2016/09/11 PHP
php中替换字符串函数strtr()和str_repalce()的用法与区别
2016/11/25 PHP
Javascript前端UI框架Kit使用指南之kitjs的对话框组件
2014/11/28 Javascript
JavaScript语言对Unicode字符集的支持详解
2014/12/30 Javascript
javascript处理a标签超链接默认事件的方法
2015/06/29 Javascript
js实现接收表单的值并将值拼在表单action后面的方法
2015/11/23 Javascript
JavaScript基础知识点归纳(推荐)
2016/07/09 Javascript
Angular JS数据的双向绑定详解及实例
2016/12/31 Javascript
nodejs构建本地web测试服务器 如何解决访问静态资源问题
2017/07/14 NodeJs
js实现图片上传并预览功能
2018/08/06 Javascript
jQuery滑动效果实现方法分析
2018/09/05 jQuery
jquery.pagination.js分页使用教程
2018/10/23 jQuery
JavaScript Html实现移动端红包雨功能页面
2021/01/10 Javascript
Python计算程序运行时间的方法
2014/12/13 Python
在Python中使用模块的教程
2015/04/27 Python
Python实现变量数值交换及判断数组是否含有某个元素的方法
2017/09/18 Python
Python的地形三维可视化Matplotlib和gdal使用实例
2017/12/09 Python
解决Python2.7读写文件中的中文乱码问题
2018/04/12 Python
python实现汉诺塔算法
2021/03/01 Python
python2和python3在处理字符串上的区别详解
2019/05/29 Python
Python图片的横坐标汉字实例
2019/12/04 Python
python DataFrame转dict字典过程详解
2019/12/26 Python
解析Python 偏函数用法全方位实现
2020/06/26 Python
在Keras中CNN联合LSTM进行分类实例
2020/06/29 Python
Python获取excel内容及相关操作代码实例
2020/08/10 Python
详解前端HTML5几种存储方式的总结
2016/12/27 HTML / CSS
Russell Stover巧克力官方网站:美国领先的精美巧克力制造商
2016/11/27 全球购物
Godiva巧克力英国官网:比利时歌帝梵巧克力
2018/08/28 全球购物
英国家庭家具、照明和花园家具购物网站:Furniture123
2018/12/31 全球购物
2015年十一国庆节演讲稿
2015/03/20 职场文书
从事会计工作年限证明
2015/06/23 职场文书
2017大学生寒假社会实践心得体会
2016/01/14 职场文书
整理Python中常用的conda命令操作
2021/06/15 Python
Three.js实现雪糕地球的使用示例详解
2022/07/07 Javascript