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这块不是特别的明白,今天自己做了一个小例子,便于理解。
先说一下我们假设的应用常用场景,我们已经开发了一个代办事项列表的组件,很多模块在用,现在要求在 不影响已测试通过的模块功能和展示 的情况下,给 已完成的代办项增加一个对勾效果 。
也就是说,代办事项列表组件要满足一下几点
解决办法很多,不过为了解释组件作用域插槽,我们就用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>
展示效果
步骤
为了实现代办事项增加对勾效果,我们要在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 } ],
理解插槽和数据传递
自己在看别人的帖子比较吃力的地方就是弄不清楚这个插槽作用域到底是什么,有什么功能,我用大白话来屡屡思路。 弄清楚两个问题
那传递步骤是
我们之前给数据数据增加了 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>
效果如下
附实例代码: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) })
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍vue 使用插槽分发内容操作示例【单个插槽、具名插槽、作用域插槽】,包括了vue 使用插槽分发内容操作示例【单个插槽、具名插槽、作用域插槽】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了vue 使用插槽分发内容操作。分享给大家供大家参考,具体如下: 单个插槽 除非子组件模板包含至少一个 <slot> 插口,否则父组件的内容将会被丢弃。当子组件模板只有一个没有属性的插槽时,父
本文向大家介绍vue学习笔记之slot插槽用法实例分析,包括了vue学习笔记之slot插槽用法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了vue slot插槽用法。分享给大家供大家参考,具体如下: 不使用插槽,在template中用v-html解析父组件传来的带有标签的content 使用插槽,如果父组件为空,就会显示slot中定义的默认内容 使用插槽添加header和foot
本文向大家介绍详解vue slot插槽的使用方法,包括了详解vue slot插槽的使用方法的使用技巧和注意事项,需要的朋友参考一下 官方文档其实已经讲得很详细,我根据文档,把官方的小案例实现了一下,这样更直观 单个slot使用最简单,也是最常用的,当我们定义了一个子组件,父组件在使用的这个组件的时候,想在内部自定义一些初始化数据,这时候就可以用slot实现。 具名slot只是给slot加了name
本文向大家介绍vue中slot(插槽)的介绍与使用,包括了vue中slot(插槽)的介绍与使用的使用技巧和注意事项,需要的朋友参考一下 什么是插槽? 插槽(Slot)是Vue提出来的一个概念,正如名字一样,插槽用于决定将所携带的内容,插入到指定的某个位置,从而使模板分块,具有模块化的特质和更大的重用性。插槽显不显示、怎样显示是由父组件来控制的,而插槽在哪里显示就由子组件来进行控制 Vue slot
本文向大家介绍vue template中slot-scope/scope的使用方法,包括了vue template中slot-scope/scope的使用方法的使用技巧和注意事项,需要的朋友参考一下 在vue 2.5.0+ 中slot-scope替代了 scope template 的使用情形为,我们已经封装好一个组建,预留了插槽,使用 的插槽 首先 我们的创建一个组建 组建很简单有一个 slot
本文向大家介绍深入理解vue中的slot与slot-scope,包括了深入理解vue中的slot与slot-scope的使用技巧和注意事项,需要的朋友参考一下 写在前面 vue中关于插槽的文档说明很短,语言又写的很凝练,再加上其和methods,data,computed等常用选项使用频率、使用先后上的差别,这就有可能造成初次接触插槽的开发者容易产生“算了吧,回头再学,反正已经可以写基础组件了”,