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 相关文章推荐
javascript 写类方式之八
Jul 05 Javascript
根据经纬度计算地球上两点之间的距离js实现代码
Mar 05 Javascript
escape函数解决js中ajax传递中文出现乱码问题
Oct 30 Javascript
JavaScript动态创建form表单并提交的实现方法
Dec 10 Javascript
基于jQuery实现左右图片轮播(原理通用)
Dec 24 Javascript
详解Vue生命周期的示例
Mar 10 Javascript
Vue AST源码解析第一篇
Jul 19 Javascript
vue使用axios上传文件(FormData)的方法
Apr 14 Javascript
JavaScript变量作用域及内存问题实例分析
Jun 10 Javascript
微信小程序用户拒绝授权的处理方法详解
Sep 20 Javascript
Auto.JS实现抖音刷宝等刷视频app,自动点赞,自动滑屏,自动切换视频功能
May 08 Javascript
uni-app 自定义底部导航栏的实现
Dec 11 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
德生PL990,目前市面上唯一一款便携式插卡蓝牙全波段高性能收音机
2021/03/02 无线电
php中将html中的br换行符转换为文本输入中的换行符
2013/03/26 PHP
Symfony2安装第三方Bundles实例详解
2016/02/04 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
2016/12/23 PHP
Yii框架实现记录日志到自定义文件的方法
2017/05/23 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
Jquery EasyUI中弹出确认对话框以及加载效果示例代码
2014/02/13 Javascript
使用AngularJS和PHP的Laravel实现单页评论的方法
2015/06/19 Javascript
AngularJS入门教程之链接与图片模板详解
2016/08/19 Javascript
js 数据存储和DOM编程
2017/02/09 Javascript
Javascript别踩白块儿(钢琴块儿)小游戏实现代码
2017/07/20 Javascript
详谈commonjs模块与es6模块的区别
2017/10/18 Javascript
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
javascript面向对象三大特征之封装实例详解
2019/07/24 Javascript
微信小程序 如何获取网络状态
2019/07/26 Javascript
基于JS实现视频上传显示进度条
2020/05/12 Javascript
详解微信小程序动画Animation执行过程
2020/09/23 Javascript
nodejs处理tcp连接的核心流程
2021/02/26 NodeJs
[52:12]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python 将数据保存为excel的xls格式(实例讲解)
2018/05/03 Python
numpy ndarray 按条件筛选数组,关联筛选的例子
2019/11/26 Python
用python对excel查重
2020/12/07 Python
巧克力领导品牌瑞士莲美国官网:Lindt Chocolate美国
2016/08/25 全球购物
成人高等教育毕业生自我鉴定
2013/10/22 职场文书
医院实习介绍信
2014/01/12 职场文书
小学班主任寄语大全
2014/04/04 职场文书
客户经理竞聘演讲稿
2014/05/15 职场文书
小学运动会口号
2014/06/07 职场文书
小学科学教学计划
2015/01/21 职场文书
文化苦旅读书笔记
2015/06/29 职场文书
幼儿园师德师风心得体会
2016/01/12 职场文书
基于python定位棋子位置及识别棋子颜色
2021/07/26 Python
浅谈MySQL函数
2021/10/05 MySQL
Python PIL按比例裁剪图片
2022/05/11 Python
MySQL数据库查询之多表查询总结
2022/08/05 MySQL
Vue深入理解插槽slot的使用
2022/08/05 Vue.js