一般来说,在Vue项目中使用父子组建时,都是把通用的HTML结构提取出来写成一个子组件,需要动态展示的数据用过prop属性传递,不过有时候我们可能想给子组件传递一个HTML代码,这个时候用prop不太适用,Vue给我们提供了slot(插槽)可以实现这种应用场景.下面是自己学习后总结的几种插槽使用方式
1. 普通使用方式
子组件
<template>
<div>
<!-- 如果有多个插槽,可以通过name命名 -->
<div style="background-color: yellowgreen">
<slot name="header"></slot>
</div>
<!-- 父组件传递过来的值会展示在slot标签中 -->
<slot></slot>
<ul v-if="todo">
<li>姓名: {{todo.name}}</li>
<li>年龄: {{todo.age}}</li>
<li>爱好: {{todo.hobby}}</li>
</ul>
<div style="color: gold">
<slot name="footer"></slot>
</div>
</div>
</template> <script>
export default {
name: 'child',
props: {
todo: Object
}, data () {
return {
}
}, created () {
console.log(this.todo, 'todo')
}
} </script> // 父组件
<template>
<div>
<!-- 引入子组件 -->
<child :todo="list">
<!-- 这里的内容会渲染到子组件name为header的标签中 -->
<template slot="header">
<p>放在头部的内容</p>
</template>
<!-- 子组件双标签中的内容会被渲染到子组件的slot标签里 -->
<h3>插槽标题</h3>
<!-- 这里的内容会渲染到子组件name为footer的标签中 -->
<template slot="footer">
<p>放在底部的内容</p>
</template>
</child>
</div>
</template> <script>
import child from './child'
export default {
name: 'parent',
components: {child}, data () {
return {
list: {
name: '灵梦',
age: 18,
text: '热爱学习',
hobby: '踢足球'
}
}
} }
</script>

渲染效果:

2. 作用域插槽
如果你希望从子组件获取数据,进行其他数据展示,这个时候你可以使用作用域插槽
子组件
<template>
<div>
<ul v-if="todo.length" v-for="item in todo" :key="item.id">
<li>姓名: {{item.name}}</li>
<li>年龄: {{item.age}}</li>
<li>爱好: {{item.hobby}}</li>
</ul>
</div>
</template>
<script>
export default {
name: 'child',
props: {
todo: Array
} </script> // 父组件
<template>
<div>
<!-- 引入子组件 -->
<child :todo="list">
</child>
</div>
</template> <script>
import child from './child'
export default {
name: 'parent',
components: {child}, data () {
return {
list: [
{name: '灵梦', age: 18, text: '热爱学习', hobby: '踢足球', id: 1},
{name: '李明', age: 13, text: '画画很棒', hobby: '画画', id: 2},
{name: '韩梅梅', age: 25, text: '性格文静', hobby: '做手工', id: 3}
]
}
} }
</script>
普通调用,渲染出来的数据就是这样,但是如果我们想在第二项渲染中把hobby改成text,这时候就需要子组件把数据传过来,父组件改变渲染方式了
 
// 子组件
<template>
<div>
<ul v-if="todo.length" v-for="(item,index) in todo" :key="item.id">
<li>姓名: {{item.name}}</li>
<li>年龄: {{item.age}}</li>
<!-- 如果是第二项,就使用作用域插槽,重新展示 -->
<li v-if="index === 1">
<!-- 定义了content把item传递到父组件,定义的名字可以随意取,需要传递的数据写在后面 -->
<slot :content="item"></slot>
</li>
<li v-else>爱好: {{item.hobby}}</li>
</ul>
</div>
</template>
<script>
export default {
name: 'child',
props: {
todo: Array
} </script> // 父组件
<template>
<div>
<!-- 引入子组件 -->
<child :todo="list">
<!-- 在子组件用slot-scope结收传递过来的数据,接收的名字可以随意取 -->
<template slot-scope="scope">
<!-- scope后接的就是你在子组件定义的传递值的名称,scope.content就拿到了传递过来的值,在这里可以直接使用 -->
描述: {{scope.content.text}}
</template>
</child>
</div>
</template> <script>
import child from './child'
export default {
name: 'parent',
components: {child}, data () {
return {
list: [
{name: '灵梦', age: 18, text: '热爱学习', hobby: '踢足球', id: 1},
{name: '李明', age: 13, text: '画画很棒', hobby: '画画', id: 2},
{name: '韩梅梅', age: 25, text: '性格文静', hobby: '做手工', id: 3}
]
}
} }
</script>
渲染出来的效果是这样,第二项李明的展示内容就改变了
 
在很多Vue的插件中也有使用作用域插槽的,比如element-ui的table组件,它就可以通过添加作用域插槽改变渲染的原始数据

Vue.js插槽slot和作用域插槽slot-scope学习小结的更多相关文章

  1. Vue.js中css的作用域

    Vue.js中的css的作用域问题: 如果在vue组件下的style中定义样式,效果会作用于整个html页面,如果只想本组件的css样式只作用于本组件的话,在<style>标签里添加sco ...

  2. Vue.js 源码分析(二十六) 高级应用 作用域插槽 详解

    普通的插槽里面的数据是在父组件里定义的,而作用域插槽里的数据是在子组件定义的. 有时候作用域插槽很有用,比如使用Element-ui表格自定义模板时就用到了作用域插槽,Element-ui定义了每个单 ...

  3. Vue基础-匿名插槽与作用域插槽的合并和覆盖行为

    Vue 测试版本:Vue.js v2.5.13 Vue 文档: <slot> 元素可以用一个特殊的特性 name 来进一步配置如何分发内容.多个插槽可以有不同的名字.具名插槽将匹配内容片段 ...

  4. Vue.js 源码分析(二十五) 高级应用 插槽 详解

    我们定义一个组件的时候,可以在组件的某个节点内预留一个位置,当父组件调用该组件的时候可以指定该位置具体的内容,这就是插槽的用法,子组件模板可以通过slot标签(插槽)规定对应的内容放置在哪里,比如: ...

  5. vue2 作用域插槽slot-scope详解

    插槽分为单个插槽,具名插槽,还有作用域插槽,前两种比较简单这里就不赘述了,今天的重点是讨论作用域插槽. 简单来说,前两种插槽的内容和样式皆由父组件决定,也就是说显示什么内容和怎样显示都由父组件决定: ...

  6. vuejs作用域插槽

    作用域插槽 <div id='root'> <child> <template slot-scope='props'> <h1>{{props.item ...

  7. Vue.js中scoped引发的CSS作用域探讨

    前言 在Vue.js的组件化开发中,常常会对某个组件的style标签加上scoped属性,如<style lang='less' scoped>,这样做的目的在于使这个组件的样式不能轻易在 ...

  8. vue.js+boostrap最佳实践

    一.为什么要写这篇文章 最近忙里偷闲学了一下vue.js,同时也复习了一下boostrap,发现这两种东西如果同时运用到一起,可以发挥很强大的作用,boostrap优雅的样式和丰富的组件使得页面开发变 ...

  9. vue.js+boostrap

    vue.js+boostrap最佳实践 一.为什么要写这篇文章 最近忙里偷闲学了一下vue.js,同时也复习了一下boostrap,发现这两种东西如果同时运用到一起,可以发挥很强大的作用,boostr ...

随机推荐

  1. 编写高质量代码改善C#程序的157个建议——建议59:不要在不恰当的场合下引发异常

    建议59:不要在不恰当的场合下引发异常 常见的不易于引发异常的情况是对在可控范围内的输入和输出引发异常. private void SaveUser3(User user) { ) { throw n ...

  2. 解决chrome浏览器无法得到window.showModalDialog返回值的问题

    父页面处理: function ProductList() {   var TypeID = window.document.getElementById("Type").valu ...

  3. 软工作业WordCount

    github项目传送门:https://github.com/zzh010/My-wc 一.WC 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命 ...

  4. delphi XE7 在Android编译SharedActivity时出错

    delphi XE6 在Android编译SharedActivity时正常,但xe7下编译出错,在uses添加Androidapi.Helpers就可以.

  5. Newtonsoft.Json.Linq

    var json = "{\"name\":\"ok1\",\"sex\":\"man\"}"; / ...

  6. 301 MovedPermanently 重定向

    页面永久性移走(301重定向)是一种非常重要的“自动转向”技术. 301重定向可促进搜索引擎优化效果 从搜索引擎优化角度出发,301重定向是网址重定向最为可行的一种办法.当网站的域名发生变更后,搜索引 ...

  7. C#隐式FTPS (Implicit FTPS)

    實現的方式是通過第三方程式庫實現的,當然最主要的是開源且免費,已測試過沒有問題! 目前還沒有直接取得目錄FileInfo list的方法,不過還好可以用GetDirectoryList來取得類似的結果 ...

  8. 阿里云RDS外网无法访问解决办法

    为了安全起见,阿里云的RDS数据库设置只能内网连接,那么为了方便查询数据,我每次都去连接内网服务器远程桌面. 这次我因为网络问题,远程桌面非常不稳定,一会掉线一会掉线,只能另想办法. 同事那里有个批处 ...

  9. 类的互相包含------新标准c++程序设计

    #include<iostream> using namespace std; class A; class B{ public: void f(A* pt){}; } class A{ ...

  10. [转]解读Unity中的CG编写Shader系列二

    上一篇文章的例子中我们可以看到顶点着色器的输出参数可以说是直接作为了片段着色器的形参传递过来,那么不由得一个问题浮现出来,顶点着色器的形参是从何处传递过来的? 顶点着色器的形参是gameObject ...