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 相关文章推荐
location.href语句与火狐不兼容的问题
Jul 04 Javascript
读jQuery之一(对象的组成)
Jun 11 Javascript
JavaScript中的call方法和apply方法使用对比
Aug 12 Javascript
详解JavaScript中数组和字符串的lastIndexOf()方法使用
Mar 13 Javascript
Three.js学习之几何形状
Aug 01 Javascript
knockoutjs动态加载外部的file作为component中的template数据源的实现方法
Sep 01 Javascript
Angularjs实现搜索关键字高亮显示效果
Jan 17 Javascript
BootStrap表单控件之复选框checkbox和单选择按钮radio
May 23 Javascript
基于VUE.JS的移动端框架Mint UI的使用
Oct 11 Javascript
详解ES6 Symbol 的用途
Oct 14 Javascript
vue.js实现会动的简历(包含底部导航功能,编辑功能)
Apr 08 Javascript
关于vue状态过渡transition不起作用的原因解决
Apr 09 Javascript
微信小程序五子棋游戏的棋盘,重置,对弈实现方法【附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
php读取图片内容并输出到浏览器的实现代码
2013/08/08 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
2014/12/19 PHP
php实现的RSS生成类实例
2015/04/23 PHP
PHP数组array类常见操作示例
2020/05/15 PHP
同一页面多个商品倒计时JS 基于面向对象的javascript
2012/02/16 Javascript
JavaScript词法作用域与调用对象深入理解
2012/11/29 Javascript
jquery控制左右箭头滚动图片列表的实例
2013/05/20 Javascript
jQuery中Ajax的get、post等方法详解
2015/01/20 Javascript
jQuery鼠标悬浮链接弹出跟随图片实例代码
2016/01/08 Javascript
javascript加载xml 并解析各节点的值(实现方法)
2016/10/12 Javascript
概述BootStrap中role=&quot;form&quot;及role作用角色
2016/12/08 Javascript
Vue实现本地购物车功能
2018/12/05 Javascript
微信小程序文字显示换行问题
2019/07/28 Javascript
[43:36]Liquid vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
使用python装饰器计算函数运行时间的实例
2018/04/21 Python
使用TensorFlow实现SVM
2018/09/06 Python
举例讲解Python常用模块
2019/03/08 Python
通过PYTHON来实现图像分割详解
2019/06/26 Python
Pycharm+Python+PyQt5使用详解
2019/09/25 Python
使用Python对Dicom文件进行读取与写入的实现
2020/04/20 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
2020/05/26 Python
婴儿鞋,独特的婴儿服装和配件:Zutano
2018/11/03 全球购物
销售会计工作职责
2013/12/02 职场文书
《童年的发现》教学反思
2014/02/14 职场文书
机电专业大学生职业规划书范文
2014/02/25 职场文书
《美丽的南沙群岛》教学反思
2014/04/27 职场文书
供应链金融服务方案
2014/05/25 职场文书
预备党员公开承诺书
2014/05/28 职场文书
教育见习报告范文
2014/11/03 职场文书
2015年财务部工作总结
2015/04/10 职场文书
学生会工作感言
2015/08/07 职场文书
运动会广播稿20字
2015/08/19 职场文书
2016八一建军节慰问信
2015/11/30 职场文书
七年级语文教学反思
2016/03/03 职场文书
导游词之西江千户苗寨
2019/12/24 职场文书
浅谈怎么给Python添加类型标注
2021/06/08 Python