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 简单验证代码(用户名,密码,邮箱)
Sep 28 Javascript
javascript:FF/Chrome与IE动态加载元素的区别说明
Jan 26 Javascript
AngularJS初始化过程分析(引导程序)
Dec 06 Javascript
JavaScript中的console.trace()函数介绍
Dec 29 Javascript
JS中数组重排序方法
Nov 11 Javascript
JavaScript中错误正确处理方式小结你用对了吗
Oct 10 Javascript
JS实现的简单下拉框联动功能示例
May 11 Javascript
jQuery发请求传输中文参数乱码问题的解决方案
May 22 jQuery
vue获取元素宽、高、距离左边距离,右,上距离等还有XY坐标轴的方法
Sep 05 Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
Nov 15 Javascript
ant design 日期格式化的实现
Oct 27 Javascript
JavaScript实现图片合成下载的示例
Nov 19 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
phpMyAdmin自动登录和取消自动登录的配置方法
2014/05/12 PHP
PHP解码unicode编码的中文字符代码分享
2014/08/13 PHP
thinkphp autoload 命名空间自定义 namespace
2015/07/17 PHP
PHP实现生成唯一会员卡号
2015/08/24 PHP
PHP的几个常用加密函数
2016/02/03 PHP
PHP的Yii框架中过滤器相关的使用总结
2016/03/29 PHP
PHP常用日期加减计算方法实例小结
2018/07/31 PHP
PHP利用递归函数实现无限级分类的方法
2019/03/22 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
2020/02/21 PHP
php实现将数组或对象写入到文件的方法小结【三种方法】
2020/04/22 PHP
在textarea文本域中显示HTML代码的方法
2007/03/06 Javascript
jquery1.5.1中根据元素ID获取元素对象的代码
2011/04/02 Javascript
Js参数值中含有单引号或双引号问题的解决方法
2013/11/06 Javascript
Javascript操作URL函数修改版
2013/11/07 Javascript
js+html5实现canvas绘制简单矩形的方法
2015/06/05 Javascript
简述Jquery与DOM对象
2015/07/10 Javascript
javascript 动态修改css样式方法汇总(四种方法)
2015/08/27 Javascript
JavaScript中Function函数与Object对象的关系
2015/12/17 Javascript
jquery实现倒计时功能
2015/12/28 Javascript
浅谈JavaScript 数据属性和访问器属性
2016/09/01 Javascript
JS实现的相册图片左右滚动完整实例
2016/11/23 Javascript
angularJs中datatable实现代码
2017/06/03 Javascript
vue-router实现组件间的跳转(参数传递)
2017/11/07 Javascript
JavaScript基于SVG的图片切换效果实例代码
2020/12/15 Javascript
Python统计文件中去重后uuid个数的方法
2015/07/30 Python
使用anaconda的pip安装第三方python包的操作步骤
2018/06/11 Python
python识别图像并提取文字的实现方法
2019/06/28 Python
Python+opencv+pyaudio实现带声音屏幕录制
2019/12/23 Python
美国在线奢侈品寄售商店:Luxury Garage Sale
2018/08/19 全球购物
巴西购物网站:Onofre Agora
2020/06/08 全球购物
业务员岗位职责范本
2013/12/15 职场文书
本科毕业生专业自荐书范文
2014/02/05 职场文书
保护野生动物倡议书
2014/05/16 职场文书
学校2014年度工作总结
2014/12/06 职场文书
2016关于军训的心得体会
2016/01/11 职场文书
Python还能这么玩之用Python做个小游戏的外挂
2021/06/04 Python