Vue插槽的深入理解和应用
一开始接触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插槽的深入理解和应用的更多相关文章
- vue插槽slot的理解与使用
一.个人理解及插槽的使用场景 刚开始看教程我的疑惑是为什么要用插槽,它的使用场景是什么,很多解释都是“父组件向子组件传递dom时会用到插槽”,这并不能很好的解决我的疑惑.既然你用了子组件,你为什么要给 ...
- vue 插槽 ------ slot 简单理解
solt 插槽 内容分发 什么是插槽 Vue 实现了一套内容分发的 API,将 `` 元素作为承载分发内容的出口. 插槽显示的位置却由子组件自身决定,槽写在组件模板的什么位置,父组件传过来的模板将来就 ...
- Vue插槽详解
简介 插槽:简单理解就是组件内部留一个或多个的插槽位置,可供组件传对应的模板代码进去.插槽的出现,让组件变的更加灵活. 一.匿名插槽 // 组件(父) <my-component> < ...
- Vue插槽:(2.6.0以后版本弃用slot和slot-scope,改用v-slot)
关于Vue插槽的概念,大家可以从vue官网的api查看,我是看到网站的对于初接触 这个要概念的人来说不是很清楚,我来贴下原码,就比较直观了 贴下原码: 具名插槽:v-slot:header Html: ...
- Vue 插槽详解
Vue插槽,是学习vue中必不可少的一节,当初刚接触vue的时候,对这些掌握的一知半解,特别是作用域插槽一直没明白. 后面越来越发现插槽的好用. 分享一下插槽的一些知识吧. 分一下几点: 1.插槽内可 ...
- Vue插槽的另外一些特性
之前有个项目,想判断一下,某一个模板内的插槽是否被使用. 不知道是不是问题过于简单,网上没有这方面的说明.我就抽时间验证一下vue插槽相关的一些功能. 然后写下这篇随笔,希望对后来人能有一些帮助. 简 ...
- 学习笔记:Vue——插槽
关于Vue插槽,只用过最简单的语法,现在完整地走一遍官方文档说明,并且探索更多用法. 01.如果组件中没有包含一个<slot>元素,则该组件起始标签和结束标签之间的任何内容都会被抛弃. 0 ...
- vue插槽用法(极客时间Vue视频笔记)
vue插槽 插槽是用来传递复杂的内容,类似方法 <!DOCTYPE html> <html lang="en"> <head> <meta ...
- vue中keepalive怎么理解?---vue中文社区
vue中keepalive怎么理解? 说在前面: keep-alive是vue源码中实现的一个组件, 感兴趣的可以研究源码 https://github.com/vuejs/vue/blob/dev/ ...
随机推荐
- RobotFramework第二篇之web自动化
(1)安装seleniumLibrary库: pip install --upgrade --pre robotframework-seleniumlibrary 使用第三方库关键字: (1)sett ...
- OpenGL实例:几何变换
OpenGL实例:几何变换 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 更多请查看:计算机图形学 1. 平移 #include <GL/glu ...
- 转://MySQL客户端工具的选择
先说我的选择:SQLyog. 尝试的客户端:Toad for MySQL.MySQL-Front.Navicat for MySQL.SQLyog. 官方下载链接: Toad for MySQL:ht ...
- ZJOI2019一轮停课刷题记录
Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...
- HTTP 1.1状态代码及其含义说明
100 Continue 初始的请求已经接受,客户应当继续发送请求的其余部分.(HTTP 1.1新) 101 Switching Protocols 服务器将遵从客户的请求转换到另外一种协 ...
- 10-PI开发手册-ERP发布服务供外围系统调用(RFC类型)
一. 文档信息 版本号* 更新日期* 姓名* 更新内容及更新理由* 备注* V1.0 2019/02/19 fanjb 文档创建 以福利接口13589(Z00HRJ_GJJ_REV_FI ...
- linux 基本命令2
linux没有磁盘的概念,这一点不同于windows,Linux所有的文件系统采用树的结构完成(核心本质)树自然有根节点 也就是linux存在一个根目录,用/表示ls 表示查看命令 我们使用 ls / ...
- mysql 索引中的USING BTREE 的意义
索引是在存储引擎中实现的,因此每种存储引擎的索引都不一定完全相同,并且每种存储引擎也不一定支持所有索引类型. 根据存储引擎定义每个表的最大索引数和最大索引长度.所有存储引擎支持每个表至少16个索引,总 ...
- 总结idea几个实用的快捷键
Ctrl+R,替换文本Ctrl+F,查找文本 Ctrl+shit+R,全局替换文本Ctrl+shit+F,全局查找文本 Ctrl+Alt+L,格式化代码Alt+Insert,可以生成构造器/Gette ...
- PLC 数据类型
类型 长度(位) 取值范围 描述 BOOL 1 0/1 布尔型 BYTE 8 0x00~0xFF 十六进制数 WORD 16 0~65535 无符号整数 DWORD 32 0~4294967295 无 ...