一,先来看看普通的组件

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title><link rel="stylesheet" type="text/css" href="css/base.css"/><style type="text/css">#app{width: 20%;margin: 200px auto;border: 1px solid #ccc;line-height: 30px;padding: 20px;}</style></head><body><div id="app"><fruit-list :sonlist="list"><!-- 这里的fruit-list是父组件app的一个html标签,父组件向子组件fruit-list属性绑定的方式传值list,于是fruit-list子组件里面必然有props:['sonlist'],来接收这个父组件传过来的list --></fruit-list></div><script type="text/javascript" src="js/vue.min.js"></script><script type="text/javascript">//子组件Vue.component('fruit-list',{props:['sonlist'],template:`<div><li :key='item.id' v-for='item in sonlist'><span>{{item.name}}</span></li></div>`})//父组件var vm= new Vue({el:'#app',data:{list:[{id:1,name:'apple'},{id:2,name:'orange'},{id:3,name:'banana'}]}})</script></body>
</html>

实现的效果:

但如果想要对其中的一个数据做出一些变化,比如第三个数据让它显示为红色?那该怎么办?
匿名插槽??他不行,他只是在本组件的html结构基础上的其中一个位置中加入新的html结构:

具名插槽??他也不行,他只是在本组件的html结构基础上的特定几个位置中加入新的html结构:

另外,还有一件事需要明确一下:

这里模板字符串里面的标签虽然是写在子组件中的,但是实际在浏览器中渲染出来:
,,
却是在父组件app下的,也就是说想要让第三个数据变成红色(不考虑之前学过的css样式的知识哈!),就需要让父组件知道,哪个是第三个组件,于是引入了作用域插槽,它可以把子组件的数据通过slot-scope再传递给父组件,然后在父组件中直接书写html结构:

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title><link rel="stylesheet" type="text/css" href="css/base.css"/><style type="text/css">#app{width: 20%;margin: 200px auto;border: 1px solid #ccc;line-height: 30px;padding: 20px;}</style></head><body><div id="app"><fruit-list :sonlist="list"><template slot-scope='slotprops'><!-- 通过template的slot-scope获取子组件传过来的数据,存在slotprops对象中 --><!-- 也就是说子组件属性绑定的每一个info都将作为这个对象的属性值 --><strong v-if='slotprops.info.id==3' style="color: red;">{{slotprops.info.name}}</strong><span v-else>{{slotprops.info.name}}</span></template></fruit-list></div><script type="text/javascript" src="js/vue.min.js"></script><script type="text/javascript">Vue.component('fruit-list',{props:['sonlist'],template:`<div><li :key='item.id' v-for='item in sonlist'><slot :info='item'></slot></li></div>`//利用属性绑定,将每一个item转化为info,传递给父组件})var vm= new Vue({el:'#app',data:{list:[{id:1,name:'apple'},{id:2,name:'orange'},{id:3,name:'banana'}]}})</script></body>
</html>

二,作用域插槽的使用方法

第一步:父组件通过子组件标签属性绑定传递了list数组给子组件
第二步:子组件通过propos接收了父组件传递过来的数据
第三步:子组件拿到数组后,使用v-for渲染列表,并通过slot :info='item’的方式,把数据同样通过属性绑定的方式(渲染出来后就到父组件那边去了),把数组中的每一个对象都传递给父组件。
第四步:父组件通过template slot-scope=‘slotprops’></template的方式接收对象,并把所有接收到的对象保存到slotprops对象当中。

这样一来,list数组就经历了以下几个步骤:
1,父组件传递list数组给子组件
2,子组件接收list数组,用v-for取出里面的每一个对象后,又传递给父组件。
3,父组件接收每一个对象,并存储在slotprops对象中。

三,一个疑惑

既然数据在父组件中,为啥要传给子组件,又要子组件传回来。不麻烦吗?不是有病吗???
这是因为,列表的渲染是需要子组件利用v-for进行的!所以子组件需要获取数据。
而父组件中插槽位置处添加的html结构,又需要使用到对应的信息,所以数据又得从子组件处传递回来。
那为什么不直接使用父组件中的数据呢?
当然是可以的,但这样一来,组件化开发不复存在,只是很机械地使用父组件的数据写html结构罢了。

四,一个简单的案例

网上也有人说,作用域插槽是带数据的插槽。也可以这么理解,而且这个数据来源于子组件的模板字符串通过属性绑定携带过来的,也就是说,作用域插槽,子组件的模板字符串属性绑定来控制传递过来的数据,而父组件的插槽内容则是控制显示的html内容。
子组件的模板字符串属性绑定来控制传递过来的数据:

Vue.component('fruit-list',{props:['sonlist'],template:`<div><li :key='item.id' v-for='item in sonlist'><slot :info='item'></slot></li></div>`//利用属性绑定,将每一个item转化为info,传递给父组件})

父组件的插槽内容则是控制显示的html内容:

<fruit-list :sonlist="list"><template slot-scope='slotprops'><!-- 通过template的slot-scope获取子组件传过来的数据,存在slotprops对象中 --><!-- 也就是说子组件属性绑定的每一个info都将作为这个对象的属性值 --><strong v-if='slotprops.info.id==3' style="color: red;">{{slotprops.info.name}}</strong><span v-else>{{slotprops.info.name}}</span></template></fruit-list>

举个简单的示例:

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title><link rel="stylesheet" type="text/css" href="css/base.css"/><style type="text/css">#app{width: 20%;margin: 200px auto;border: 1px solid #ccc;line-height: 30px;padding: 20px;}</style></head><body><div id="app"><testone :sonlist="list"><template slot-scope="fatherObject"><span>{{fatherObject.info.name}}</span></template></testone><hr><testone :sonlist="list"><template slot-scope="fatherObject"><span>{{fatherObject.info.id}}</span></template></testone></div><script type="text/javascript" src="js/vue.min.js"></script><script type="text/javascript">Vue.component('testone',{props:['sonlist'],template:`<div><li :key='item.id' v-for='item in sonlist'><slot :info='item'></slot></li></div>`//利用属性绑定,将每一个item转化为info,传递给父组件})var vm= new Vue({el:'#app',data:{list:[{id:1,name:'apple'},{id:2,name:'orange'},{id:3,name:'banana'}]}})</script></body>
</html>

这里利用作用域插槽。使用同一个子组件,可以写出不同的东西:

对作用域插槽的理解:slot-scope相关推荐

  1. vue插槽的理解 slot slot-scop,三种插槽方式,默认插槽,具名插槽,作用域插槽

    es6写法可借鉴 父组件中的写法

  2. Vue —— 进阶插槽(slot)(默认插槽、具名插槽和作用域插槽)

    Vue全家桶 系列文章目录 内容 参考链接 Vue2.x - 基础 Vue2.x - 基础 Vue2.x - 进阶(零) 初始化脚手架 Vue2.x - 进阶(一) refs属性.props配置项 V ...

  3. [vue] slot插槽 默认插槽,具名插槽,作用域插槽

    文章目录 插槽 不使用插槽 效果 分析 默认插槽 效果 分析 具名插槽 效果 分析 作用域插槽 效果 分析 再次理解作用域插槽 代码: 默认插槽: 具名插槽 作用域插槽 插槽 作用:让父组件可以向子组 ...

  4. 作用域插槽、slot-scope、v-slot指令

    作用域插槽.slot-scope.v-slot指令 作用域插槽可以让父组件拿到子组件中的数据,并使用. 作用域插槽的使用和scope 子组件 <slot :game="game&quo ...

  5. v-slot以及slot-scop(插槽与作用域插槽)

    插槽 vue组件一般都是直接引用并写成单标签,内部不传入任何内容,组件的内容正常情况下是由组件本身去控制的,调用它的组件只能进行数据相关的操作间接的去影响组件的展示,在实际开发中会有需要直接操作被调用 ...

  6. Vue中插槽-----特殊特性slot、slot-scope与指令v-slot的使用方法

    1.slot作用/概念:预先将将来要使用的内容进行保留: 2.具名插槽:给slot起个名字 3.slot.slot-scope已经被废弃推荐使用vue2.6.0中的v-slot:但是这边还是对新旧方法 ...

  7. vue slot scope使用_20、slot插槽的用法

    重点: 单个插槽.具名插槽.作用域插槽的用法: 访问插槽的方法. 其实本小白对插槽理解的还不深,哪些场景会经常用到插槽也不了解. 但是本着"大胆猜测"的理念,我的猜测如下: 假设有 ...

  8. Vue中slot的使用(具名插槽与作用域插槽)

    文章目录 前言 一.什么是插槽 二.前期准备 三.具名插槽的使用 1.子组件配置slot 2.使用者App.vue配置数据 3.结果展示 4.具名插槽总结 四.作用域插槽的使用 1.子组件配置slot ...

  9. Vue.js插槽slot和作用域插槽slot-scope学习小结

    一般来说,在Vue项目中使用父子组建时,都是把通用的HTML结构提取出来写成一个子组件,需要动态展示的数据用过prop属性传递,不过有时候我们可能想给子组件传递一个HTML代码,这个时候用prop不太 ...

  10. Vue3 slot插槽——(默认插槽、具名插槽、作用域插槽)

    一.认识插槽Slot 在开发中,我们会经常封装一个个可复用的组件: 前面我们会通过props传递给组件一些数据,让组件来进行展示: 但是为了让这个组件具备更强的通用性,我们不能将组件中的内容限制为固定 ...

最新文章

  1. 深入Java虚拟机之虚拟机体系结构
  2. 11.10错题集(7-函数)
  3. python程序设计基础电子版_Python 程序设计基础(董付国 著)完整版PDF[6MB]
  4. 《JavaScript设计模式与开发实践》——第3章 闭包和高阶函数
  5. pytorch已经安装成功了为什么不能使用import_使用auto keras的过程
  6. 计算机网络最短路径路由选择,最短路径算法Dijkstra算法在路由选择中的应用.pdf...
  7. 支付宝web支付,mobileclientgw-
  8. day42-mysql索引
  9. 孙鑫VC学习笔记:第十二讲 (三) 用C++函数读写文件
  10. amazeui验证遇到的坑
  11. 【矩阵论】线性空间与线性变换(3)(4)
  12. python Crypto.Cipher
  13. 双十一大促淘宝主图设置优化方法
  14. 利用JavaScript设置隐藏功能
  15. multisim变压器反馈式_Multisim在负反馈放大器性能测试中的应用
  16. 爬美女图的的脚本分享, 灯灯灯噔....
  17. 2013 年国产开源软件 10 大年度热门项目
  18. 信息技术设备的安全(GB 4943-2001)
  19. flink将数据写入redis
  20. SAP会计科目中英文对照表

热门文章

  1. ubuntu mysql5.5编码_Ubuntu下MySQL5.5编码设置
  2. PhpStorm-2017.3 注册激活
  3. 基于Redis消息的订阅发布应用场景
  4. MyBatis框架及原理分析
  5. nginx php上传配置
  6. 一起写一个Android图片轮播控件
  7. 【Silverlight】Bing Maps学习系列(一):开发前的准备工作
  8. 一些控制鼠标的例子!
  9. Condition梳理和总结
  10. Mysql数据库和表的操作