一开始接触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. LinkedList与Queue

    https://blog.csdn.net/u013087513/article/details/52218725

  2. python 中 try catch finally语句中含有return语句的执行情况

    无论是在try还是在except中,遇到return时,只要设定了finally语句,就会中断当前的return语句,跳转到finally中执行,如果finally中遇到return语句,就直接返回, ...

  3. In action "Setting JDBC driver jar location unix [Set a variable]" (screen "Select a Database [Configurable banner form]"), property "Script":

    java.lang.Exception: JDBC Driver Jar not found. Looking for: /u01/oracle/GG_Director/ERROR: Unresolv ...

  4. Reason的介绍和搭建Reason开发环境

    Reason介绍 Reason是在Ocaml语言的基础上修改而来,专门提供给前端开发者使用. Reason是函数式编程语言,使用Bucklescript编译器编译成javascript语言. 在我看来 ...

  5. JS 设计模式五 -- 命令模式

    概念 命令模式中的命令(command) 指的是 一个执行某些待定事情的指令. 用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此之间的耦合关系. 例子 假设html结构如下: &l ...

  6. 小程序组件中有bindinput监听报异常

    真机上有问题,ide上是没问题的,   组件有处理函数,结果异常说页面没有处理函数,加上处理函数后就不报异常了.

  7. DAY18、常用模块

    一.random:随机数1.(0,1) 小数:random.random()2.[1,10] 整数:random.randint(1,10)3.[1,10) 整数:random.randrange(1 ...

  8. NABCD--团队项目1

    N: 1.学校中有很多学生是外省的,然后不知道附近有什么地方周末可以去玩. 2.学校中学生有很多用不到的东西但是联系不到合适的买家. A: 我们可以做一个软件,通过学号注册登陆软件,这样可以防止有人去 ...

  9. MySQL数据库开发的三十六条军规

    一.核心军规 尽量不在数据库做运算,cpu计算的事务必移至业务层; 控制表.行.列数量([控制单张表的数据量 1年/500W条,超出可做分表],[单库表数据量不超过300张] .[单张表的字段个数不超 ...

  10. ubuntu apt update failed to fetch

    When I do command sudo apt update, always get belowing errors: Err:1 http://archive.ubuntu.com/ubunt ...