Vue作用域插槽slot-scope实例代码


Posted in Javascript onSeptember 05, 2018

vue中的插槽有三种:单个插槽、具名插槽、作用域插槽,这个在官网上能看到

(https://cn.vuejs.org/v2/guide/components.html#单个插槽)

作用域插槽简单来说就是父组件只管显示样式,数据由子组件来提供。比如上面的代码,el-table-column内的template是传递给其内部solt的显示内容,但是scope的值是由el-table-column内部solt绑定的数据返回的。这个数据具体是什么由el-table-column中指定,类似:

<slot name="**" :data="data"></slot>
export default {
data: function(){
return {
data: ['1','2','3','4','5','6']
}
},
}

而scope就是上面代码中的data。

昨天看vue的官网文档,在slot-scope这块不是特别的明白,今天自己做了一个小例子,便于理解。

先说一下我们假设的应用常用场景,我们已经开发了一个代办事项列表的组件,很多模块在用,现在要求在 不影响已测试通过的模块功能和展示 的情况下,给 已完成的代办项增加一个对勾效果

也就是说,代办事项列表组件要满足一下几点

  1. 之前数据格式和引用接口不变,正常展示
  2. 新的功能模块增加对勾

解决办法很多,不过为了解释组件作用域插槽,我们就用slot-scope了,写列一下之前组件的代码。

todo-list.vue 组件

<template>
 <ul>
 <li v-for="item in todoList" v-bind:key="item.id">
  <slot v-bind:itemValue = "item" >
   {{ item.test }} 
  </slot>
 </li>
 </ul>
</template>

<script>
export default {
 name: 'todoList',
 props: {
 todos: Array
 },
 data(){
 return {
  todoList:this.todos
 }
 }
}
</script>

组件代码

<template>
 <ul>
 <li v-for="item in todoList" v-bind:key="item.id">
  <slot>
  {{ item.test }} 
  </slot>
 </li>
 </ul>
</template>

<script>
export default {
 name: 'todoList',
 props: {
 todos: Array
 },
 data(){
 return {
  todoList:this.todos
 }
 }
}
</script>

父组件代码

<template>
 <div id="app">
 <h2>之前组件调用</h2>
 <todo-list v-bind:todos="todosBefore" ></todo-list>
 </div>
</template>

<script>
import todoList from './components/todo-list.vue'

export default {
 name: 'app',
 data:function(){
 return {
  todosBefore:[
  {
   test:'询问时间',
   id:12312313123
  },
  {
   test:'代办1',
   id:123123123423423
  },
  {
   test:'爱你地方年底见?',
   id:12312313123234234
  },
  {
   test:'时间2',
   id:1231231312323333
  },
  {
   test:'师生情是行情',
   id:12313333333
  }
  ]
 }
 },
 components: {
 todoList
 }
}
</script>

展示效果

Vue作用域插槽slot-scope实例代码

步骤

为了实现代办事项增加对勾效果,我们要在data中调整数据结构,新增 todosAfter 数组,并给每一项增加 isComplete 标识。

todosAfter:[
  {
   test:'询问时间',
   isComplete:true,
   id:12312313123
  },
  {
   test:'代办1',
   isComplete:false,
   id:123123123423423
  },
  {
   test:'爱你地方年底见?',
   isComplete:false,
   id:12312313123234234
  },
  {
   test:'时间2',
   isComplete:true,
   id:1231231312323333
  },
  {
   test:'师生情是行情',
   isComplete:true,
   id:12313333333
  }
  ],

理解插槽和数据传递

自己在看别人的帖子比较吃力的地方就是弄不清楚这个插槽作用域到底是什么,有什么功能,我用大白话来屡屡思路。 弄清楚两个问题

  1. 插槽solt代码在哪里编写? 当然在父组件内, solt是子组件暴露给父组件的接口,需要父组件传给子组件 。
  2. 插槽作用域,作用域插槽字面理解,仅仅只对插槽生效。

Vue作用域插槽slot-scope实例代码

那传递步骤是

  1. 父组件把数据给子组件,父=>子
  2. 子组件把数据给插槽,并暴露给父组件接口
  3. 父组件调用子组件的插槽slot接口和数据

我们之前给数据数据增加了 isComplete 属性,现在要将子组件 item 传递给插槽,并给父组件暴露数据接口 itemValue ,重点在 v-bind:itemValue = "item" 这一句 。

<template>
 <ul>
 <li v-for="item in todoList" v-bind:key="item.id">
  <slot v-bind:itemValue = "item" >
   {{ item.test }} 
  </slot>
 </li>
 </ul>
</template>

接下来是父组件调用子组件的slot和 itemValue 数据。

<h2>之前组件调用</h2>
<todo-list v-bind:todos="todosAfter">
 <template slot-scope="slotProps">
  <!-- 打印itemvalue数据-->
  <div style="background:red; border-bottom:2px solid blue;">
   {{slotProps.itemvalue}}
  </div>
  <!-- 根据判断条件展示对号元素 -->
  <span v-if="slotProps.itemValue.isComplete">✓</span>
  <!-- 显示代办事项名称 -->
  {{ slotProps.itemValue.test }}
 </template>

</todo-list>

效果如下

Vue作用域插槽slot-scope实例代码

附实例代码:github link

总结

其实作用域插槽很类似于入参函数,组件相当于cb,而cb的入参就相当与slotProps接收的参数,只不过名称和形式变了个样子。

<!-- 函数 -->
function foo(str,cb){
 var msg = str + '你好';
 cb(msg);
}
<!-- 调用 -->
foo('愚坤',function(msg){
 alert(msg)
})

foo('愚坤',function(msg){
 console.log(msg)
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
childNodes.length与children.length的区别
May 14 Javascript
使用dynatrace-ajax跟踪JavaScript的性能
Apr 12 Javascript
javascript实现des解密加密全过程
Apr 03 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
Jun 17 Javascript
jquery 操作css样式、位置、尺寸方法汇总
Nov 28 Javascript
jQuery表格(Table)基本操作实例分析
Mar 10 Javascript
Vue slot用法(小结)
Oct 22 Javascript
vscode 开发Vue项目的方法步骤
Nov 25 Javascript
jQuery内容选择器与表单选择器实例分析
Jun 28 jQuery
解决layer.msg 不居中 ifram中的问题
Sep 05 Javascript
Map与WeakMap类型在JavaScript中的使用详解
Nov 18 Javascript
微信小程序实现锚点跳转
Nov 23 Javascript
element ui 表格动态列显示空白bug 修复方法
Sep 04 #Javascript
利用chrome浏览器进行js调试并找出元素绑定的点击事件详解
Jan 30 #Javascript
Vue中android4.4不兼容问题的解决方法
Sep 04 #Javascript
element-ui 上传图片后清空图片显示的实例
Sep 04 #Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
Sep 04 #Javascript
Angular使用cli生成自定义文件、组件的方法
Sep 04 #Javascript
vue2.0 使用element-ui里的upload组件实现图片预览效果方法
Sep 04 #Javascript
You might like
模仿OSO的论坛(五)
2006/10/09 PHP
php curl常见错误:SSL错误、bool(false)
2011/12/28 PHP
php基于socket实现SMTP发送邮件的方法
2015/03/05 PHP
php生成二维码
2015/08/10 PHP
PHP基于单例模式实现的数据库操作基类
2016/01/15 PHP
php 在字符串指定位置插入新字符的简单实现
2016/06/28 PHP
PHP实现浏览器格式化显示XML的方法示例
2019/01/22 PHP
JavaScript fontsize方法入门实例(按照指定的尺寸来显示字符串)
2014/10/17 Javascript
使用递归遍历对象获得value值的实现方法
2016/06/14 Javascript
简易的JS计算器实现代码
2016/10/18 Javascript
js倒计时显示实例
2016/12/11 Javascript
深入理解Angular4订阅(Subscribe)与取消
2017/11/22 Javascript
js Element Traversal规范中的元素遍历方法
2018/04/19 Javascript
解决jquery有正确返回值但不执行success函数的问题
2018/08/20 jQuery
微信小程序实现底部导航
2018/11/05 Javascript
详解如何使用node.js的开发框架express创建一个web应用
2018/12/20 Javascript
基于Vue CSR的微前端实现方案实践
2020/05/27 Javascript
JavaScript实现雪花飘落效果
2020/12/27 Javascript
Python中条件选择和循环语句使用方法介绍
2013/03/13 Python
Python编程中字符串和列表的基本知识讲解
2015/10/14 Python
Python编程django实现同一个ip十分钟内只能注册一次
2017/11/03 Python
Linux CentOS7下安装python3 的方法
2018/01/21 Python
Python3删除排序数组中重复项的方法分析
2019/01/31 Python
详解重置Django migration的常见方式
2019/02/15 Python
Python是什么 Python的用处
2020/05/26 Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
2020/10/21 Python
Ann Taylor官方网站:美国最大的女性产品制造商之一
2016/09/14 全球购物
Falconeri美国官网:由羊绒和羊毛制成的针织服装
2018/04/08 全球购物
C#软件工程师英语面试题
2015/06/07 面试题
生物科学系大学生的自我评价
2013/12/20 职场文书
初二物理教学反思
2014/01/29 职场文书
情人节活动策划方案
2014/02/27 职场文书
党员教师四风问题对照检查材料
2014/09/26 职场文书
Python数据可视化之用Matplotlib绘制常用图形
2021/06/03 Python
Nginx性能优化之Gzip压缩设置详解(最大程度提高页面打开速度)
2022/02/12 Servers
HDFS免重启挂载新磁盘
2022/04/06 Servers