slot插槽

  • 为什么要使用slot插槽

    • 组件的插槽是为了让我们封装的组件更加具有扩展性
    • 让使用者可以灵活地决定组件内部的内容到底展示什么
    • 网页和网页间每一个组件有很多的区别, 也有很多共性, 如果我们为每一个网页都去单独地封装一个组件是不合适的, 所以我们需要slot插槽
  • 如何封装一个灵活的组件

    • 将共性(相同的地方)抽取放到组件中, 将不同的地方暴露为插槽
    • 预留了插槽, 就可以让使用者根据自己的需求, 决定插槽内的内容
  • slot的基本使用

    • 在子组件中, 用特殊的元素标签slot就可以为子组件创建一个插槽
    • 插槽中插入的内容是什么由父组件来决定
  • slot的注意点

    • slot的默认值, 在父组件中没有写入要插入的内容的话, 就会默认显示slot的默认值
    • 如果父组件中一次性插入多个元素, 那么所有的元素都会进行替换
<body><div id="app"><!-- 在组件的标签中填入要替换slot占位的元素 --><cpn><button>按钮</button></cpn><cpn><span>我是span</span></cpn><!-- 如果一次性填入多个替换的元素, 所有的替换元素都会进行替换 --><cpn><i>我是i</i><p>我是替换的p</p><span>我是替换的span</span></cpn><!-- 如果标签内没有填入要替换的slot占位的元素, slot会使用默认的元素替换 --><cpn></cpn><cpn></cpn><cpn></cpn></div><template id="cpn"><div><h2>我是h2</h2><p>我是p</p><!-- 在组件中使用solt标签占位 --><!-- 在slot标签中填入默认的元素, 默认元素会在子组件标签没有填入替换的元素的时候显示出来 --><slot><button>我是默认的按钮</button></slot></div></template><script>const app = new Vue({el: "#app",components: {cpn: {template: "#cpn"}}})</script>
</body>

具名slot的使用

  • 当子组件的功能复杂时, 子组件的插槽可能由很多个, 那么在父组件中给插槽插入内容的时候, 如何区分插入的是哪一个插槽呢?

    • 此时需要给插槽起一个名字, 添加一个name属性
    • 然后在插入的元素中添加slot属性, 值为需要替换的插槽的name值
<body><div id="app"><!-- 使用子组件的时候, 给需要替换的添加slot属性, 值为需要替换的slot标签的name值, 即可定向替换元素 --><cpn><button slot="center">替换中间的</button></cpn></div><template id="cpn"><div><!-- 给插槽标签添加name属性 --><slot name="left"><span>左边</span></slot><slot name="center"><span>中间</span></slot><slot name="right"><span>右边</span></slot></div></template><script>const app = new Vue({el: "#app",components: {cpn: {template: "#cpn"}}})</script>
</body>

编译的作用域

  • 在组件模板中使用的所用东西, 来自该组件
  • 官方的准则: 父组件模板的所有东西都会在父级作用域内编译, 子级组件模板的所有东西都会在子级作用域内编译
<body><div id="app"><!-- 在这里使用的isShow数据是来自根组件的,因为这里是app根组件 --><cpn v-show="isShow"></cpn></div><template id="cpn"><div><!-- 在这里使用的isShow数据是来自cpn组件的, 因为这里是cpn子组件 --><h2>我是标题</h2><p>我是内容</p><span v-show="isShow">我是span</span></div></template><script>const app = new Vue({el: "#app",data: {isShow: true},components: {cpn: {template: "#cpn",data() {return {isShow: false}}}}})</script>
</body>

作用域插槽的使用

  • 总结起来就是一句话, 父组件替换插槽的标签, 但是内容由子组件来提供
  • 就是父组件来决定如何渲染子组件的内容
  • 如何使用作用域插槽
    • 子组件模板中, 通过给slot标签添加v-bind:自定义名称=“想要暴露的数据” 属性来发送子组件的数据
    • 在父组件中的子组件标签中嵌套一个一个template标签(Vue2.5.x以后可以使用其他的标签比如div等)
    • 在这个template标签中添加 slot-scope=“也是自定义的名字” 来接收slot标签发送的数据
    • 在template标签内就可以使用子组件发送来的数据了
<body><div id="app"><!-- 默认是按照子组件模板中设定的模板渲染 --><cpn></cpn><!-- 如果想在父组件中其他的形式展示子组件的内容, 就要使用作用域插槽 --><cpn><!-- 在子组件标签中嵌套一个template标签(Vue2.5.x以后可以使用其他的标签比如div等) --><!-- 在该标签中添加 slot-scope="也是自定义的名字" 来接收slot标签发送的数据 --><template slot-scope="acceptdata"><!-- 在这个标签内就可以使用子组件发送来的数据了 --><!-- <span v-for="item in acceptdata.cpndata"> {{item}} - </span> --><span>{{acceptdata.cpndata.join(" - ")}}</span></template></cpn></div><template id="cpn"><div><!-- 通过slot标签中添加 v-bind:自定义名称="想要暴露的数据" 属性来发送子组件的数据 --><slot :cpndata="pLanguages"><ul><li v-for="item in pLanguages">{{item}}</li></ul></slot></div></template><script>const app = new Vue({el: "#app",components: {cpn: {template: "#cpn",data() {return {pLanguages: ["JavaScript", "C++", "C#", "python"]}}}}})</script>
</body>

Vue学习笔记之11-slot插槽相关推荐

  1. Vue学习笔记(三)Vue2三种slot插槽的概念与运用 | ES6 对象的解构赋值 | 基于Vue2使用axios发送请求实现GitHub案例 | 浏览器跨域问题与解决

    文章目录 一.参考资料 二.运行环境 三.Vue2插槽 3.1 默认插槽 3.2 具名插槽 3.3 作用域插槽 ES6解构赋值概念 & 作用域插槽的解构赋值 3.4 动态插槽名 四.GitHu ...

  2. Vue学习笔记05 组件的自定义事件-组件通信-$nextTick-脚手架解决ajax跨域-插槽-过渡动画

    文章目录 Vue学习笔记05 父组件给子组件传值 注意点 子组件给父组件传值 父组件接受子组件的传值 通过函数 组件的自定义事件 事件绑定的第一种写法 @或v-on 事件绑定的第二种写法:使用ref ...

  3. 狂神说 vue学习笔记

    vue学习笔记 文章目录 vue学习笔记 一.第一个vue程序 1. 什么是MVVM 2. 为什么要使用MVVM 3.直接新建项目 4.导入vue.js 5.简单绑定元素 6 vue的声明周期 二.V ...

  4. Vue学习笔记---------Vue2

    Vue学习笔记---------Vue2 1. Hello,world! 插值语法: 用 {{ xxx }} 插入一个值 ,该值在data中自定义内容. <body><div id= ...

  5. Vue学习笔记进阶篇——Render函数

    本文为转载,原文:Vue学习笔记进阶篇--Render函数 基础 Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编 ...

  6. day4 vue 学习笔记 组件 生命周期 数据共享 数组常用方法

    系列文章目录 day1学习vue2笔记 vue指令 day2 学习vue2 笔记 过滤器 侦听器 计算属性 axios day3 vue2 学习笔记 vue组件 day4 vue 学习笔记 组件 生命 ...

  7. Vue学习笔记01——Vue开发基础

    一.Vue实例配置选项 选项 说明 data Vue实例数据对象 methods 定义Vue中的方法 components 定义子组件 computed 计算属性 filters 过滤器 el 唯一根 ...

  8. Vue学习笔记(二)组件化和模块化

    Vue学习笔记(二)组件化和模块化 前言 组件化 什么是组件化 1.基础使用 2.全局组件和局部组件 3.语法糖和模板抽离 4.组件的data为什么是函数 5.父子组件 5.1 父子组件 5.2 父子 ...

  9. Vue学习笔记入门篇——数据及DOM

    本文为转载,原文:Vue学习笔记入门篇--数据及DOM 数据 data 类型 Object | Function 详细 Vue 实例的数据对象.Vue 将会递归将 data 的属性转换为 getter ...

  10. vue学习简记(十)插槽

    vue学习简记(十) 插槽 作用 分类 使用方式 默认插槽 具名插槽 作用域插槽 插槽 Vue 实现了一套内容分发的 API,将元素作为承载分发内容的出口,这是vue文档上的说明.具体来说,slot就 ...

最新文章

  1. 三维点云语义分割总览
  2. python中文软件-Python编程软件下载
  3. 监测div大小变化_如何让div大小随窗口大小变化
  4. 使用Java VisualVM分析您的应用程序
  5. Maven排除项目中同名不同版本的jar
  6. html编辑器查找与替换,织梦kindeditor文本编辑器增加“查找替换”功能
  7. 开源大数据:Apache Pulsar
  8. cad2017怎么改变选择方式_诠网科技|企业网络推广方式要怎么选择?
  9. Tensorflow API(二)
  10. 主流数据库之MySQL函数和MySQL数据操作基础知识及示例
  11. libaio介绍和使用
  12. python中html图片显示不出来,jupyter notebook中图片显示不出来的解决
  13. 用Python算带有进度条的圆周率
  14. 【转】大数据【五十八】探索MapReduce过程及分组详解
  15. Python实战回归模型-消费者人群画像-信用智能评分(基于中国移动用户数据)
  16. 访问学者美国访学必须知道十大注意事项
  17. system()函数详解
  18. Qt中根据pc屏幕分辨率按比例修改窗口的大小
  19. 基于STM32F103的智能门锁系统
  20. C语言自动分配宿舍问题

热门文章

  1. 7-2 搜索树判断 (25 分)
  2. OCR文字识别技术总结(二)
  3. 数据结构十大经典排序算法--Python
  4. Combine的使用案例
  5. 大数据技术在各行业中的挑战有哪些
  6. python我想对你说_python学习22天----模块、包
  7. python fortran混编 ctypes_Python调用C/Fortran混合的动态链接库--上篇
  8. pandas apply lambda_一分钟一个Pandas小技巧(二)
  9. 2021年SWPUACM暑假集训day1二分算法
  10. 上门挂画服务_瀑布山水画挂在哪里好 弄懂这2点挂画没烦恼