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 相关文章推荐
70+漂亮且极具亲和力的导航菜单设计国外网站推荐
Sep 20 Javascript
也说JavaScript中String类的replace函数
Sep 22 Javascript
深入理解JavaScript系列(14) 作用域链介绍(Scope Chain)
Apr 12 Javascript
js获取下拉列表框中的value和text的值示例代码
Jan 11 Javascript
js清空form表单中的内容示例
May 20 Javascript
node.js中实现同步操作的3种实现方法
Dec 05 Javascript
原生js的数组除重复简单实例
May 24 Javascript
RequireJS 依赖关系的实例(推荐)
Jan 21 Javascript
javascript将list转换成树状结构的实例
Sep 08 Javascript
javascript 缓冲运动框架的实现
Sep 29 Javascript
为什么说JavaScript预解释是一种毫无节操的机制详析
Nov 18 Javascript
Vue实现tab导航栏并支持左右滑动功能
Jun 28 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
PHP中创建并处理图象
2006/10/09 PHP
PHP 一个比较完善的简单文件上传
2010/03/25 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
2012/05/05 PHP
PHP登录验证码的实现与使用方法
2016/07/07 PHP
PHP如何使用JWT做Api接口身份认证的实现
2020/02/03 PHP
javascript实现的动态添加表单元素input,button等(appendChild)
2007/11/24 Javascript
js 数组实现一个类似ruby的迭代器
2009/10/27 Javascript
jQuery数据缓存功能的实现思路及简单模拟
2013/05/27 Javascript
jquery实现简单易懂的图片展示小例子
2013/11/21 Javascript
Jquery利用mouseenter和mouseleave实现鼠标经过弹出层且可以点击
2014/02/12 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
Javascript removeChild()删除节点及删除子节点的方法
2015/12/27 Javascript
js console.log打印对像与数组用法详解
2016/01/21 Javascript
js实现文本上下来回滚动
2017/02/03 Javascript
jQuery实现三级联动效果
2017/03/02 Javascript
Vue全家桶实践项目总结(推荐)
2017/11/04 Javascript
vue init失败简单解决方法(终极版)
2017/12/22 Javascript
vue-cli+webpack项目 修改项目名称的方法
2018/02/28 Javascript
VUE前端从后台请求过来的数据进行转换数据结构操作
2020/11/11 Javascript
[02:34]2016完美“圣”典风云人物:BurNIng专访
2016/12/10 DOTA
python创建临时文件夹的方法
2015/07/06 Python
详谈pandas中agg函数和apply函数的区别
2018/04/20 Python
Python中调用其他程序的方式详解
2019/08/06 Python
python for循环remove同一个list过程解析
2019/08/14 Python
python手机号前7位归属地爬虫代码实例
2020/03/31 Python
哈萨克斯坦最大的时装、鞋子和配饰在线商店:Lamoda.kz
2019/11/19 全球购物
车辆安全检查制度
2014/01/12 职场文书
机关会计岗位职责
2014/04/08 职场文书
小学模范班主任事迹材料
2014/05/13 职场文书
旅游活动总结
2014/08/27 职场文书
领导干部学习“三严三实”思想汇报
2014/09/15 职场文书
企业法人代表证明书
2014/09/27 职场文书
2015年学校财务工作总结
2015/05/19 职场文书
使用pandas模块实现数据的标准化操作
2021/05/14 Python
Golang中异常处理机制详解
2021/06/08 Golang
Android Flutter实现3D动画效果示例详解
2022/04/07 Java/Android