一开始接触vue时并不知道插槽是什么,后来看了很多文章也是一知半解。然后自己手动敲了一下,在项目中实际应用一下,实在太好用了。后来做小程序后发现也能使用slot,不单单在vue中使用。我就是这么目光短浅(QAQ)。尤其在做组件开发的时候更不能少了slot的使用。

一、对插槽的理解

对于一开始听到别人提起,这段代码中用个插槽特别方便。然而并不知什么是插槽,为什么要用插槽。后来看了很多文章,以下为个人的理解:

插槽用在子组件中,使用<slot></slot>标签。然后父组件在使用子组件的时候在子组件标签中添加的内容就能传到子组件中,<slot></slot>就是用来存放父组件在子组件标签中放置的内容的。

光说不行,读完上边的话再来看看这段代码

<div id="app">
<child>你好</child>
</div> <script type="text/javascript">
//定义组件
Vue.component('child',{
template:`<div>Hello,World!</div>`
})
//创建vue实例
var vm = new Vue({
el: "#app",
data:{ }
})
</script>

结果并没有“你好”输出。然后我们在子组件中加入一个<slot></slot>标签

       <script type="text/javascript">
//定义组件
Vue.component('child',{
template:`<div>
Hello,World!
<slot></slot>
</div>`
})
//创建vue实例
var vm = new Vue({
el: "#app",
data:{ }
})
</script>

这样父组件中在使用<child></child>标签中加入的内容就传到了子组件中。那么,我们可以将插槽理解成:

插槽就是Vue实现的一套内容分发的API,将<slot></slot>元素作为承载分发内容的出口。插槽就相当于在子组件中留出个位置给父组件,如果父组件中有内容传进来,那么就放到slot中。

没有插槽的情况下在组件标签内些一些内容是不起任何作用的,当我在组件中声明了slot元素后,在组件元素内写的内容就会跑到它这里了!

二、具名插槽

具名插槽,就是给这个插槽起个名字

在组件中,我给插槽起个名字,一个名字叫"girl",一个名字叫"boy",还有一个不起名字

<div id="app">
<child>
<template slot="girl">
漂亮、美丽、购物、逛街
</template>
<template slot="boy">
帅气、才实
</template>
<div>
无名无姓,普通的插槽
</div>
</child>
</div> <script type="text/javascript">
//定义组件
Vue.component('child',{
template:`<div>
<slot name="girl"></slot>
<div style="height:1px;background-color:red;"></div>
<slot name="boy"></slot>
<div style="height:1px;background-color:red;"></div>
<slot></slot>
</div>`
})
//创建vue实例
var vm = new Vue({
el: "#app",
data:{ }
})
</script>

三、默认插槽

上面已经介绍过了,这里不做描述

四、作用域插槽

之前一直没搞懂作用域插槽到底是什么,该怎么用。研究发现以后,个人理解为:

在组件中绑定在slot标签上的属性,在父组件使用组件标签时可以拿到属性/值。请看如下代码:

<div id="app">
<child>
<div slot-scope="a">
{{a}}
</div>
</child>
</div> <script type="text/javascript">
//定义组件
Vue.component('child',{
template:`<div>
<slot say="你好"></slot>
</div>`
})
//创建vue实例
var vm = new Vue({
el: "#app",
data:{ }
})
</script>

通过在浏览器上查看,以json对象形式展示出来,只不过它是个字符串。

<div id="app">
<child :lists="listPhone">
<div slot-scope="a">
{{a}}
</div>
</child>
</div>
<template id="temp">
<div>
<ul>
<li v-for="list in lists">
<slot :phone="list"></slot>
</li>
</ul>
</div>
</template>
<script type="text/javascript">
//定义组件
Vue.component('child',{
props:['lists'],
template:"#temp"
})
//创建vue实例
var vm = new Vue({
el: "#app",
data:{
listPhone:[
{id:1,brand:"苹果"},
{id:2,brand:"华为"},
{id:3,brand:"荣耀"},
{id:4,brand:"小米"}
]
}
})
</script>

假如我在加一些判断,对这些数据进行操作

<div id="app">
<child :lists="listPhone">
<div slot-scope="a">
<div v-if="a.phone.id===1">这是{{a.phone.brand}}</div>
<div v-else>{{a.phone.brand}}</div>
</div>
</child>
</div>
<template id="temp">
<div>
<ul>
<li v-for="list in lists">
<slot :phone="list"></slot>
</li>
</ul>
</div>
</template>
<script type="text/javascript">
//定义组件
Vue.component('child',{
props:['lists'],
template:"#temp"
})
//创建vue实例
var vm = new Vue({
el: "#app",
data:{
listPhone:[
{id:1,brand:"苹果"},
{id:2,brand:"华为"},
{id:3,brand:"荣耀"},
{id:4,brand:"小米"}
]
}
})
</script>

用过element-ui的朋友们到这一步是不是很熟悉,饿了么组件表格就是这样实现的,表格的本质就是这个。

Vue插槽的深入理解和应用的更多相关文章

  1. vue插槽slot的理解与使用

    一.个人理解及插槽的使用场景 刚开始看教程我的疑惑是为什么要用插槽,它的使用场景是什么,很多解释都是“父组件向子组件传递dom时会用到插槽”,这并不能很好的解决我的疑惑.既然你用了子组件,你为什么要给 ...

  2. vue 插槽 ------ slot 简单理解

    solt 插槽 内容分发 什么是插槽 Vue 实现了一套内容分发的 API,将 `` 元素作为承载分发内容的出口. 插槽显示的位置却由子组件自身决定,槽写在组件模板的什么位置,父组件传过来的模板将来就 ...

  3. Vue插槽详解

    简介 插槽:简单理解就是组件内部留一个或多个的插槽位置,可供组件传对应的模板代码进去.插槽的出现,让组件变的更加灵活. 一.匿名插槽 // 组件(父) <my-component> < ...

  4. Vue插槽:(2.6.0以后版本弃用slot和slot-scope,改用v-slot)

    关于Vue插槽的概念,大家可以从vue官网的api查看,我是看到网站的对于初接触 这个要概念的人来说不是很清楚,我来贴下原码,就比较直观了 贴下原码: 具名插槽:v-slot:header Html: ...

  5. Vue 插槽详解

    Vue插槽,是学习vue中必不可少的一节,当初刚接触vue的时候,对这些掌握的一知半解,特别是作用域插槽一直没明白. 后面越来越发现插槽的好用. 分享一下插槽的一些知识吧. 分一下几点: 1.插槽内可 ...

  6. Vue插槽的另外一些特性

    之前有个项目,想判断一下,某一个模板内的插槽是否被使用. 不知道是不是问题过于简单,网上没有这方面的说明.我就抽时间验证一下vue插槽相关的一些功能. 然后写下这篇随笔,希望对后来人能有一些帮助. 简 ...

  7. 学习笔记:Vue——插槽

    关于Vue插槽,只用过最简单的语法,现在完整地走一遍官方文档说明,并且探索更多用法. 01.如果组件中没有包含一个<slot>元素,则该组件起始标签和结束标签之间的任何内容都会被抛弃. 0 ...

  8. vue插槽用法(极客时间Vue视频笔记)

    vue插槽 插槽是用来传递复杂的内容,类似方法 <!DOCTYPE html> <html lang="en"> <head> <meta ...

  9. vue中keepalive怎么理解?​---vue中文社区

    vue中keepalive怎么理解? 说在前面: keep-alive是vue源码中实现的一个组件, 感兴趣的可以研究源码 https://github.com/vuejs/vue/blob/dev/ ...

随机推荐

  1. 使用docker快速搭建nginx+php环境

    在朋友的强烈推荐下,走上了docker之路.经过了繁琐的docker环境安装,看了下镜像/容器的简单使用,开始进行nginx+php环境的搭建,本文记录一下在安装过程中的笔记. 原文地址:代码汇个人博 ...

  2. Pyinstaller 打包exe

    安装 ​ pip insatll Pyinstaller 参数 pyinstaller -Fw main.py 参数 概述 -F,-onefile 打包一个单个文件,如果你的代码都写在一个.py文件的 ...

  3. Neutron vxlan network

    OpenStack 还支持 vxlan 和 gre 这两种 overlay network.   overlay network 是指建立在其他网络上的网络. 该网络中的节点可以看作通过虚拟(或逻辑) ...

  4. [Alpha阶段]第八次Scrum Meeting

    Scrum Meeting博客目录 [Alpha阶段]第八次Scrum Meeting 基本信息 名称 时间 地点 时长 第八次Scrum Meeting 19/04/12 新主楼F座2楼 35min ...

  5. Make a Person 闭包

    用下面给定的方法构造一个对象. 方法有 getFirstName(), getLastName(), getFullName(), setFirstName(first), setLastName(l ...

  6. 完全自主创建Wrapper Tomcat容器

    Wrapper Tomcat 使用说明1. Wrapper Tomcat 简介1) Wrapper Tomcat 是使用Apache Tomcat 整合 Java Service Wrapper 的一 ...

  7. Python3 视频教程,全网最全的视频教程,爬虫,从入门到实战

    需要联系我:QQ:1844912514 最新Python基础班+就业班视频教程 链接: python分布式爬虫打造搜索引擎链接: https://pan.baidu.com/s/1N7HL7U0gQX ...

  8. MySQL——修改用户密码 | 移除权限

    修改用户密码 '; 移除权限 REVOKE Delete, Drop ON *.* FROM `root`@`localhost`; 权限列表

  9. 树莓派3B+(三)

    上一篇中,我们配置好了基本的raspbain系统,接下来我们可以用xrdp或者vnc在Windows上远程连接树莓派. 一.安装xrdp xrdp和vnc是两种常见的远程桌面协议,可以进行可视化界面远 ...

  10. BZOJ 2733 永无乡

    splay启发式合并 启发式合并其实就是把集合数量小的合并到集合数量大的里去. 怎么合并呢,直接一个一个插入就行了.. 用并查集维护连通性,find(i)可以找到所在splay的编号 这题好像还可以合 ...