Vue.js特性Scoped Slots的浅析


Posted in Javascript onFebruary 20, 2019

什么是scoped slots

A scoped slot is a special type of slot that functions as a reusable template (that can be passed data to) instead of already-rendered-elements.

上面是官方的定义。

作用域插槽(Scoped Slots)是vue.js中一个非常有用的特性,它可以使组件更加通用和复用。唯一的问题是理解起来比较困难。试图去让你理解父与子作用域的交织关系,像解决一道数学难题。

简单点说slot就是插槽,它是可以被替换掉的,替换它的内容是可以拿到当前组件的上下文的
(为了简单起见,以下例子以模板为主)

举个简单的例子

//button.vue
<template>
 <button class="btn">
  <slot></slot> //相当于是占位
 </button>
</template>

<script>
export default {

}
</script>
//app.vue
<template>
 <div id="app">
 <Button>Buton with text</Button>
 <Button>
 <i class="fa fa-copy"></i>//这里取代了slot的位置
 </Button>

 <Button>
 <i class="fa fa-user"></i>Profile
 </Button>

 </div>
</template>

<script>
 import Button from './components/Button.vue'
 export default {
 name: 'app',
 components: {
 Button
 }
 }
</script>

slot其实就是一个占位,button.vue的slot位置会被app.vue里面的替换了。

复杂例子1:slot内的东西可以获取父组件的上下文信息

//list.vue
<template>
 <div>
 <slot v-for="item in items"
   :item="item">//这里是slot的占位
 </slot> 
 </div>
</template>
//app.vue
<template>
 <div id="app">
 <List :items="listItems">
  <div slot-scope="row"
  class="list-item1">//这里可以获取到item,item原本是属于List组件内部的。也就是说slot获取了父组件的上下文。
  {{row.item.text}}
 </div>
 </List>
 </div>
</template>

解释见上面代码注释。注意一点的是slot-scope=”row” 这里的名字(row)是可以任意取的。

named slots

可以直接放到普通标签上面,可以放template标签上

slot里面的作用域是普通标签或者template是一致的。不能访问父组件的作用域。

复杂例子2:slot里面是可以放东西的,是默认的模板,可被替换。

//table.vue
<template>
 <table class="table">
 <thead>
  <slot name="columns">//这里定义了一个slot,名字叫columns,也就是说这里的内容是可以被替换掉的
  <th v-for="column in columns">
   {{column}}
  </th>
  </slot>
 </thead>
 <tbody>
 <tr v-for="item in data">
  <slot :row="item">//这里slot有一个prop是row
  <td v-for="column in columns"
   v-if="hasValue(item, column)">
   {{itemValue(item, column)}}
  </td>
  </slot>
 </tr>
 </tbody>
 </table>
</template>
//app.vue
<template>
 <div id="app">
 <CustomTable :data="tableData" 
   :columns="tableColumns">
 </CustomTable>

  <div class="table-separator"></div>

 <CustomTable :data="tableData">
  <template slot="columns">//这里有一个slot="columns",意思是替换table.vue里面名字叫columns的slot
  <th>Title</th>
  <th>
  <i class="fa fa-images"></i> Image
  </th>
  <th class="actions-row">
  <i class="fab fa-vuejs vue-icon"></i> Actions
  </th>
 </template>

 <template slot-scope="{row}">//这里替换table.vue里面slot为row的内部内容
 <td class="bold-row">
  {{row.title}}
 </td>
 <td class="img-row">
  <img :src="row.img">
 </td>
 <td class="actions-row">
  <Button @click.native="handleAction('Edit')">
  <i class="fa fa-edit"></i>
  </Button>
  <Button @click.native="handleAction('Delete')" type="danger">
  <i class="fa fa-trash"></i>
  </Button>
 </td>
 </template> 
 </CustomTable>
 </div>
</template>

Vue.js特性Scoped Slots的浅析

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
弹出层之1:JQuery.Boxy (一) 使用介绍
Oct 06 Javascript
jquery插件制作教程 txtHover
Aug 17 Javascript
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
Jan 22 Javascript
js判断上传文件后缀名是否合法
Jan 28 Javascript
Javascript实现的StopWatch功能示例
Jun 13 Javascript
JS实现图片手风琴效果
Apr 17 Javascript
基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式
Jan 17 Javascript
Angular6 发送手机验证码按钮倒计时效果实现方法
Jan 08 Javascript
JS脚本实现定时到网站上签到/签退功能
Apr 22 Javascript
如何实现echarts markline标签名显示自己想要的
Jul 20 Javascript
Vue通过provide inject实现组件通信
Sep 03 Javascript
vuex的使用和简易实现
Jan 07 Vue.js
微信小程序五子棋游戏的棋盘,重置,对弈实现方法【附demo源码下载】
Feb 20 #Javascript
详解关于element级联选择器数据回显问题
Feb 20 #Javascript
JavaScript ES2019中的8个新特性详解
Feb 20 #Javascript
echarts实现词云自定义形状的示例代码
Feb 20 #Javascript
JS拖拽排序插件Sortable.js用法实例分析
Feb 20 #Javascript
详解webpack 最简打包结果分析
Feb 20 #Javascript
jQuery表单元素过滤选择器用法实例分析
Feb 20 #jQuery
You might like
日本十大惊悚动漫
2020/03/04 日漫
基于mysql的bbs设计(三)
2006/10/09 PHP
CI(Codeigniter)的Setting增强配置类实例
2016/01/06 PHP
PHP5.5新特性之yield理解与用法实例分析
2019/01/11 PHP
jquery全选/全不选/反选另一种实现方法(配合原生js)
2013/04/07 Javascript
jquery跟js初始化加载的多种方法及区别介绍
2014/04/02 Javascript
JQuery中绑定事件(bind())和移除事件(unbind())
2015/02/27 Javascript
基于jQuery实现多层次的手风琴效果附源码
2015/09/21 Javascript
js控制按钮,防止频繁点击响应的实例
2017/02/15 Javascript
jQuery实现div跟随鼠标移动
2020/08/20 jQuery
微信小程序开发之toast等弹框提示使用教程
2017/06/08 Javascript
JavaScript实现无刷新上传预览图片功能
2017/08/02 Javascript
微信小程序之电影影评小程序制作代码
2017/08/03 Javascript
5分钟快速掌握JS中var、let和const的异同
2018/09/19 Javascript
详解三种方式解决vue中v-html元素中标签样式
2018/11/22 Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
2019/09/24 Javascript
vue不操作dom实现图片轮播的示例代码
2019/12/18 Javascript
vue-cli3项目配置eslint代码规范的完整步骤
2020/09/10 Javascript
[01:38]DOTA2辉夜杯 欢乐的观众现场采访
2015/12/26 DOTA
[01:33:07]VGJ.T vs Newbee Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
Python实现在matplotlib中两个坐标轴之间画一条直线光标的方法
2015/05/20 Python
Pyhton中单行和多行注释的使用方法及规范
2016/10/11 Python
Python网络编程详解
2017/10/31 Python
使用python 写一个静态服务(实战)
2019/06/28 Python
linux环境下安装python虚拟环境及注意事项
2020/01/07 Python
python 实现两个线程交替执行
2020/05/02 Python
在阿联酋购买翻新手机和平板电脑:Teckzu
2021/02/12 全球购物
采购主管工作职责
2013/12/12 职场文书
项目采购员岗位职责
2014/04/15 职场文书
詹天佑教学反思
2014/04/30 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
毕业生班级鉴定评语
2015/01/04 职场文书
阿甘正传观后感
2015/06/01 职场文书
会计做账心得体会
2016/01/22 职场文书
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle
Vue+Flask实现图片传输功能
2022/04/01 Vue.js