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 相关文章推荐
checkbox 多选框 联动实现代码
Oct 22 Javascript
javascript使用eval或者new Function进行语法检查
Oct 16 Javascript
js冒泡法和数组转换成字符串示例代码
Aug 14 Javascript
javascript实现很浪漫的气泡冒出特效
Sep 05 Javascript
JavaScript设计模式经典之工厂模式
Feb 24 Javascript
js判断checkbox是否选中个数的方法(超简单)
Aug 19 Javascript
Javascript 数组去重的方法(四种)详解及实例代码
Nov 24 Javascript
JS调用Android、Ios原生控件
Jan 06 Javascript
javascript流程控制语句集合
Sep 18 Javascript
8 个有用的JS技巧(推荐)
Jul 03 Javascript
使用Vue-Awesome-Swiper实现旋转叠加轮播效果&amp;平移轮播效果
Aug 16 Javascript
vue ssr服务端渲染(小白解惑)
Nov 10 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
深入PHP5中的魔术方法详解
2013/06/17 PHP
高性能PHP框架Symfony2经典入门教程
2014/07/08 PHP
详细解读php的命名空间(一)
2018/02/21 PHP
php微信开发之关注事件
2018/06/14 PHP
JS完整获取IE浏览器信息包括类型、版本、语言等等
2014/05/22 Javascript
详细分析JavaScript变量类型
2015/07/08 Javascript
轻松学习jQuery插件EasyUI EasyUI创建CRUD应用
2015/11/30 Javascript
JavaScript数组的定义及数字操作技巧
2016/06/06 Javascript
针对后台列表table拖拽比较实用的jquery拖动排序
2016/10/10 Javascript
angular.JS实现网页禁用调试、复制和剪切
2017/03/31 Javascript
JavaScript实现打印星型金字塔功能实例分析
2017/09/27 Javascript
vue v-model实现自定义样式多选与单选功能
2018/07/05 Javascript
VuePress 静态网站生成方法步骤
2019/02/14 Javascript
Vue 组件修改根实例的数据的方法
2019/04/02 Javascript
你了解vue3.0响应式数据怎么实现吗
2019/06/07 Javascript
微信小程序设置滚动条过程详解
2019/07/25 Javascript
Threejs实现滴滴官网首页地球动画功能
2020/07/13 Javascript
[46:32]Fnatic vs OG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[40:12]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
python对数组进行反转的方法
2015/05/20 Python
Python的Tornado框架实现异步非阻塞访问数据库的示例
2016/06/30 Python
Python操作mongodb的9个步骤
2018/06/04 Python
python str字符串转uuid实例
2020/03/03 Python
python异常处理之try finally不报错的原因
2020/05/18 Python
澳大利亚在线床零售商:Bedworks
2020/09/01 全球购物
高分子材料与工程专业推荐信
2013/12/01 职场文书
公司保密承诺书
2014/03/27 职场文书
乡镇个人对照检查材料
2014/08/22 职场文书
新教师培训心得体会
2014/09/02 职场文书
2014年小学工作总结
2014/11/26 职场文书
2015年元旦主持词开场白
2014/12/14 职场文书
物业工程部岗位职责
2015/02/11 职场文书
写给同事的离职感言
2015/08/04 职场文书
Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)
2022/01/18 Java/Android
Python数据可视化之Seaborn的安装及使用
2022/04/19 Python