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延时重复执行函数 lLoopRun.js
Jun 29 Javascript
Js 中debug方式
Feb 07 Javascript
JS简单实现登陆验证附效果图
Nov 19 Javascript
javascript的日期对象、数组对象、二维数组使用说明
Dec 22 Javascript
jQuery1.9+中删除了live以后的替代方法
Jun 17 Javascript
vue.js从安装到搭建过程详解
Mar 17 Javascript
微信小程序 标签传入数据
May 08 Javascript
详解如何使用webpack打包JS
Jun 21 Javascript
详解Vue webapp项目通过HBulider打包原生APP(vue+webpack+HBulider)
Feb 02 Javascript
微信小程序去除左上角返回键的实现方法
Mar 06 Javascript
浅谈webpack构建工具配置和常用插件总结
May 11 Javascript
JS实现无限轮播无倒退效果
Sep 21 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
一个程序下载的管理程序(三)
2006/10/09 PHP
PHP实现对xml的增删改查操作案例分析
2017/05/19 PHP
PHP常用header头定义代码示例汇总
2020/08/29 PHP
用javascript实现画板的代码
2007/09/05 Javascript
JS对URL字符串进行编码/解码分析
2008/10/25 Javascript
js隐藏与显示回到顶部按钮及window.onscroll事件应用
2013/01/25 Javascript
JavaScript建立一个语法高亮输入框实现思路
2013/02/26 Javascript
jquery等宽输出文字插件使用介绍
2013/09/18 Javascript
jQuery操作input值的各种方法总结
2013/11/21 Javascript
JavaScript中使用arguments获得函数传参个数实例
2014/08/27 Javascript
iframe里使用JavaScript控制主页转向的方法
2015/04/03 Javascript
JavaScript中eval()函数用法详解
2015/12/14 Javascript
Javascript技术栈中的四种依赖注入小结
2016/02/27 Javascript
jquery实现文本框textarea自适应高度
2016/03/09 Javascript
Javascript使用SWFUpload进行多文件上传
2016/11/16 Javascript
移动开发之自适应手机屏幕宽度
2016/11/23 Javascript
js手机号4位显示空格,银行卡每4位显示空格效果
2017/03/23 Javascript
Angular弹出模态框的两种方式
2017/10/19 Javascript
bootstrap treeview 树形菜单带复选框及级联选择功能
2018/06/08 Javascript
Vue自定义指令上报Google Analytics事件统计的方法
2019/02/25 Javascript
JS使用正则表达式判断输入框失去焦点事件
2019/10/16 Javascript
封装 axios+promise通用请求函数操作
2020/08/11 Javascript
[01:57]2018年度DOTA2最具潜力解说-完美盛典
2018/12/16 DOTA
[54:43]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第一场 2月22日
2021/03/11 DOTA
python实现根据月份和日期得到星座的方法
2015/03/27 Python
Numpy中转置transpose、T和swapaxes的实例讲解
2018/04/17 Python
Python logging设置和logger解析
2019/08/28 Python
Python调用OpenCV实现图像平滑代码实例
2020/06/19 Python
HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码
2020/04/10 HTML / CSS
高性能装备提升营地:Kammok
2019/02/27 全球购物
澳大利亚波西米亚风连衣裙在线商店:Fortunate One
2019/04/01 全球购物
写出SQL四条最基本的数据操作语句(DML)
2012/12/12 面试题
如何开发安全的AJAX应用
2014/03/26 面试题
合作经营协议书范本
2014/09/16 职场文书
工会经费申请报告
2015/05/15 职场文书
活着观后感
2015/06/03 职场文书