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 相关文章推荐
用js计算页面执行时间的函数
Dec 07 Javascript
JavaScript高级程序设计阅读笔记(五) ECMAScript中的运算符(一)
Feb 27 Javascript
关于textarea提交的内容无法换行的解决办法
Apr 09 Javascript
JS+DIV实现鼠标划过切换层效果的实例代码
Nov 26 Javascript
JS可以控制样式的名称写法一览
Jan 16 Javascript
JavaScript截取字符串的Slice、Substring、Substr函数详解和比较
Mar 20 Javascript
jQuery打印图片pdf、txt示例代码
Jul 22 Javascript
通过location.replace禁止浏览器后退防止重复提交
Sep 04 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
May 15 Javascript
JS常用倒计时代码实例总结
Feb 07 Javascript
AngularJS实现进度条功能示例
Jul 05 Javascript
详解小程序rich-text对富文本支持方案
Nov 28 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
Win2000+Apache+MySql+PHP4+PERL安装使用小结
2006/10/09 PHP
php 字符串函数收集
2010/03/29 PHP
使用淘宝IP库获取用户ip地理位置
2013/10/27 PHP
PHP利用MySQL保存session的实现思路及示例代码
2014/09/09 PHP
jQuery ajax BUG:object doesn't support this property or method
2010/07/06 Javascript
jquery 实现上下滚动效果示例代码
2013/08/09 Javascript
Node.js入门教程:在windows和Linux上安装配置Node.js图文教程
2014/08/14 Javascript
zepto.js中tap事件阻止冒泡的实现方法
2015/02/12 Javascript
jQuery实现动态添加和删除一个div
2015/08/12 Javascript
js 能实现监听F5页面刷新子iframe 而父页面不刷新的方法
2016/11/09 Javascript
详解node.js搭建代理服务器请求数据
2017/04/08 Javascript
vue中子组件的methods中获取到props中的值方法
2018/08/27 Javascript
详解jQuery设置内容和属性
2019/04/11 jQuery
[32:26]EG vs IG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python3序列化与反序列化用法实例
2015/05/26 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
2018/07/19 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
2018/08/01 Python
Python Django 封装分页成通用的模块详解
2019/08/21 Python
关于Numpy中的行向量和列向量详解
2019/11/30 Python
python标准库sys和OS的函数使用方法与实例详解
2020/02/12 Python
keras 实现轻量级网络ShuffleNet教程
2020/06/19 Python
Python应用实现处理excel数据过程解析
2020/06/19 Python
浅谈Python中的生成器和迭代器
2020/06/19 Python
Python通过类的组合模拟街道红绿灯
2020/09/16 Python
Python自定义sorted排序实现方法详解
2020/09/18 Python
详解如何使用rem或viewport进行移动端适配
2020/08/14 HTML / CSS
全球知名提供各类营养保健品的零售商:Vitamin Shoppe
2016/10/09 全球购物
师范生自荐信
2013/10/27 职场文书
技术总监个人的自我评价范文
2013/12/18 职场文书
计算机专业毕业生求职信分享
2013/12/24 职场文书
《玩具柜台前的孩子》教学反思
2014/02/13 职场文书
信用卡工作证明范本
2015/06/19 职场文书
python如何读取.mtx文件
2021/04/22 Python
使用JS实现简易计算器
2021/06/14 Javascript
HTML+CSS实现导航条下拉菜单的示例代码
2021/08/02 HTML / CSS
mysql的Buffer Pool存储及原理
2022/04/02 MySQL