一、插槽slot()

1.1简单插槽slot

【功能】用于从父组件中,通过子组件写成双标签,向子组件中放入自定的内容

parent.vue

【1】首先把child写成双标签样式,把要插入的内容放双标签中间

【注】如果要控制样式在父组件中,在子组件中写样式都可以

<template>
<div class="parent">
<span>父组件</span>
<Child><!--【1】首先把child写成双标签样式,把要插入的内容放双标签中间-->
<p>插入子组件的内容</p>
</Child>
</div>
</template> <script>
import Child from './child'; export default{
name:'parent',
components:{
Child,
},
data(){
return{}
},
}
</script> <style>
</style>

child.vue

【2】在子组件放个slot双标签接收父组件在双标签中插入的内容

<template>
<div class="child">
<span>子组件</span>
<slot>如果没有传递内容则显示默认信息</slot> <!--【2】在子组件放个slot双标签接收父组件在双标签中插入的内容;如果没有传递,则显示默认的内容,如果传递了,则不显示默认内容-->
</div>
</template> <script> export default{
name:'child',
data(){
return{}
}, }
</script> <style>
</style>

App.vue

不重要

<template>
<div id="app">
<img src="./assets/logo.png">
<Parent /> <!-- 【2】第2步,调用子组件 -->
</div>
</template> <script>
import Parent from './components/parent' //【1】第1步,引入子组件 export default {
name: 'App',
components: {
Parent //【3】第3步,把组件写到此处,目的是把它暴露出去
}, data () {//data必须是一个函数,此为标准es6写法,也可写成data:function()
return {
msg: 'hello',
}
},
}
</script> <style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>

效果:如下图,原写在父组件的内容,已经插入到子组件中了

1.2具名插槽(多个插槽-控制输入到子组件的不同位置)

parent.vue

【1】在child双标签下写入对应的内容,在标签上加个属性(<p slot=xxx,>)(xxx为子组件中的 name值<slot name=xxx>)在标签中加上想插入的内容

<template>
<div class="parent">
<span>父组件</span>
<Child>
<p slot='top'>插入子组件的内容——上</p>
<p slot='bottom'>插入的内容——下</p>
</Child>
</div>
</template> <script>
import Child from './child'; export default{
name:'parent',
components:{
Child,
},
data(){
return{}
}, }
</script> <style>
</style>

child.vue

【1】对slot加个属性name=xxx,

<template>
<div class="child">
<span>子组件</span>
<slot name="top">后备内容</slot>
<hr />
<slot name="bottom">后备内容2</slot>
</div>
</template> <script> export default{
name:'child',
data(){
return{}
}, }
</script> <style>
</style>

1.2.2插入一堆东西到子组件的插槽写法

只要把所子标签外面包一个父标签,把slot='name-value'放在父标签上即可

parent.vue

其它部分不变;

child.vue不变;

<Child>
<div slot='top'>
<p>插入内容——上</p>
<p>插入内容——上2</p>
<p>插入内容——上3</p>
</div>
<div slot='bottom'>
<p>插入的内容——下</p>
<p>插入的内容——下2</p>
<p>插入的内容——下3</p>
</div>
</Child>

效果:

1.3作用域插槽

用于子组件中的插槽向父组件对应插头传递数据;

官方文档:https://cn.vuejs.org/v2/guide/components-slots.html#作用域插槽

parent.vue

【1】首先必须要在对应插槽名字的位置加个属性slot-scope='props';props可随意写,【2】处对应即可

【2】用{{props.text}}显示子组件插槽 传过来的数据

<template>
<div class="parent">
<span>父组件</span> <Child>
<div slot='top' slot-scope='props'> <!-- 【1】首先必须要在对应插槽名字的位置加个属性slot-scope='props'; props可随意写 -->
<p>{{props.text}}</p> <!-- 【2】用{{props.text}}显示子组件插槽 传过来的数据 -->
</div> <div slot='bottom' >
<p>插入的数据——下1</p>
<p>插入的内容——下2</p>
<p>插入的内容——下3</p>
</div>
</Child> </div>
</template> <script>
import Child from './child'; export default{
name:'parent',
components:{
Child,
},
data(){
return{}
}, }
</script> <style>
</style>

child.vue

【1】通过在插槽里放一个自定义属性text='待传递的数据'向父组件传数据

<template>
<div class="child">
<span>子组件</span>
<slot name="top" text='子插槽向父组件传的数据'>后备内容</slot><!-- 【1】通过在插槽里放一个自定义属性text='待传递的数据'向父组件传数据 -->
<hr/>
<slot name="bottom">后备内容2</slot>
</div>
</template> <script> export default{
name:'child',
data(){
return{}
}, }
</script> <style>
</style>

效果:此即子组件的插槽向,父组件的对应插头传递的数据;

二、动态组件

2.1简单的动态组件切换写法

parent.vue

【0】写1个数据用来指向随便一个子组件名

【1】动态组件写法,在内部加上属性用来绑定数据部分

【2】切换子组件,利用在methods里的changeView函数实现

【3】改变数据里的指向为另一个子组件2,即可在component里实现组件视图的切换

<template>
<div class="parent">
<span>父组件</span> <component v-bind:is="currentView"></component><!-- 【1】动态组件写法,在内部加上属性用来绑定数据部分 -->
<button v-on:click='changeView'>切换到子组件2视图</button><!-- 【2】切换子组件,利用在methods里的changeView函数实现 -->
</div>
</template> <script>
import Child from './child';
import Child2 from './child2'; export default{
name:'parent',
components:{
Child,
Child2,
},
data(){
return{
currentView:"Child" //【0】写1个数据用来指向随便一个子组件名
}
},
methods:{
changeView(){
return this.currentView='Child2'//【3】改变数据里的指向为另一个子组件2,即可在component里实现组件视图的切换
}
} }
</script> <style>
</style>

child.vue

<template>
<div class="child">
<span>子组件1</span> </div>
</template> <script> export default{
name:'child',
data(){
return{}
}, }
</script> <style>
</style>

child2.vue

<template>
<div class="child2">
<span>子组件2</span>
</div>
</template> <script> export default{
name:'child2',
data(){
return{}
}, }
</script> <style>
</style>

结果:由子组件1切换到 子组件2.

2.2keep-alive标签把要来回切换的组件放到缓存中提高性能

keep-alive标签把要来回切换的组件放到缓存中提高性能,同时保持状态;

parent.vue

<template>
<div class="parent">
<span>父组件</span> <keep-alive><!-- 【2.1】把要切换的组件放在此标签内,可保持它一直被缓存在内存;切换回来时不会新建立一个组件实例;还有一个好处可以保持之前那个组件状态,选中哪个不会被清除; -->
<component v-bind:is="currentView"></component><!-- 【1】动态组件写法,在内部加上属性用来绑定数据部分 -->
</keep-alive> <button v-on:click='changeView'>切换到子组件2视图</button><!-- 【2】切换子组件,利用在methods里的changeView函数实现 【2.2】切换也是这里-->
</div>
</template> <script>
import Child from './child';
import Child2 from './child2'; export default{
name:'parent',
components:{
Child,
Child2,
},
data(){
return{
currentView:"Child",//【0】写1个数据用来指向随便一个子组件名
flag:true,//【2.0】设置一个标志
}
},
methods:{
changeView(){
if(this.flag){//【2.3】也是调用这个函数
this.currentView='Child';//【3】改变数据里的指向为另一个子组件2,即可在component里实现组件视图的切换
this.flag=false;
}else{
this.currentView='Child2';
this.flag=true;
} }
} }
</script> <style>
</style>

child.vue

<template>
<div class="child">
<span>子组件1</span> </div>
</template> <script> export default{
name:'child',
data(){
return{}
}, }
</script> <style>
</style>

child2.vue

<template>
<div class="child2">
<span>子组件2</span> </div>
</template> <script> export default{
name:'child2',
data(){
return{}
}, }
</script> <style>
</style>

2.2.1keep-alive保持状态效果

其它代码同上例,只有child.vue改变

child.vue

1、在数据里定义一个msg

2、用按钮改变它,因为parent.vue里用了keep-alive标签,所以改变后的msg信息不会变回之前

<template>
<div class="child">
<span>子组件1</span>
<p>{{msg}}</p>
<button @click="chMsg">改变信息</button> </div>
</template> <script> export default{
name:'child',
data(){
return{
msg:'信息变之前',
}
},
methods:{
chMsg(){
this.msg='改变信息之后'
}
} }
</script> <style>
</style>

结果:

1、先点1号按钮改变子组件里的msg信息

2、再点2号按钮切换视图,再点回来,Msg改变后的信息没变(还是“改变信息之后”)

三、深入Vue组件——Vue插槽slot、动态组件的更多相关文章

  1. Vue进阶(Bus/作用域slot/动态组件)

    一.Vue非父子组件传值(Bus/总线/发布订阅模式/观察者模式) 我们在之前已经知道了父子传值.父组件传递过来了的值,在子组件通过props接受,然后就可以使用了. 也学过了隔代传值,均是通过pro ...

  2. Vue.js的组件(slot/动态组件等)、单文件组件、递归组件使用

    一.组件 1> 组件命名方式有两种(注意:在DOM模板中只有kebab-case命名方法才生效): html中引用组件: <!-- 在DOM模板中,只有 kebab-case命名才生效 - ...

  3. Vue中的插槽---slot

    一:什么是插槽? 插槽(Slot)是Vue提出来的一个概念,正如名字一样,插槽用于决定将所携带的内容,插入到指定的某个位置,从而使模板分块,具有模块化的特质和更大的重用性. 插槽显不显示.怎样显示是由 ...

  4. 在vue中使用插槽 slot

    插槽(slot)这个概念非常重要 插槽的使用场景1:在子组件里面显示父组件的dom <div id='root'> <child content = '<p>Dell&l ...

  5. Vue一个案例引发的动态组件与全局事件绑定总结

    最近在自学 Vue 也了解了一些基本用法,也记录了一些笔记有兴趣的朋友可以去查看我的其他文章,技术这东西真的不能光靠看,看是没有的,你必须要动手实践,只有在实战项目中才能发现问题,才能发现我们没有掌握 ...

  6. Vue组件(35)动态组件 component 的 is 到底可以是啥?

    component 动态组件 Vue官网上提供了一个动态组件 <component :is="currentTabComponent"> ,那么这里的 is 到底是什么 ...

  7. 第八十九篇:Vue 重学插槽slot

    好家伙, 1.什么是插槽? 插槽是vue为组件的封装者提供的能力.允许开发者在封装组件时, 把不确定的,希望由用户指定的部分定义为插槽   我们依然可以把它理解为一个占位符 1.1.插槽的基本用法 试 ...

  8. vue中的插槽slot

    插槽(slot):是组件的一块HTML模板,父组件决定这块模板显不显示以及怎么显示. 位置由子组件自身决定(slot现在组件template的什么位置,父组件传过来的模板将来就显示在什么位置) 匿名插 ...

  9. 组件基础(插槽slot)—Vue学习笔记

    刚开始我们淡淡提过<slot></slot>现在深入了解一下. slot可以进行父组件传值到子组件. 比如:我们将hiboy通过<slot>传递到组件中. < ...

  10. Vue.js 2使用中的难点举例--子组件,slot, 动态组件,事件监听

    一例打尽..:) <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

随机推荐

  1. Spark程序编译报错error: object apache is not a member of package org

    Spark程序编译报错: [INFO] Compiling 2 source files to E:\Develop\IDEAWorkspace\spark\target\classes at 156 ...

  2. vs Qt,运行后,中文字符显示乱码

    方法一: //在头文件前面加上下面几行代码 #pragma execution_character_set("utf-8") 方法二: //直接中文前面加u8 setWindows ...

  3. Spark 写 Hive table 非常慢【解决】

    代码如下: dataFrame.createOrReplaceTempView("view_page_utm") val sql = s""" |in ...

  4. 7.Varnish

    概述 Varnish处理HTTP请求的过程大致分为如下几个步骤:         1> Receive状态:请求处理入口状态,根据VCL规则判断该请求应该Pass或Pipe,还是进入Lookup ...

  5. 【读书圈】win7 定时发送OA邮件

    因为win7任务计划本身xls邮件调用有问题,会显示只读权限 我用vbs脚本替代了它的邮件功能!(我现在对vbs的CDO概念也没大弄清,还不知道需不需要外网,等我找台别的内网机器试试) (另外我试验了 ...

  6. 【快学springboot】8.JPA乐观锁OptimisticLocking

    介绍 当涉及到企业应用程序时,正确地管理对数据库的并发访问是至关重要的.为此,我们可以使用Java Persistence API提供的乐观锁定机制.它导致在同一时间对同一数据进行多次更新不会相互干扰 ...

  7. js面试代码中的“坑”

    1.typeof 对类型的判断 (function() { return typeof arguments; } )(); 答案:"Object" 解释:arguments是一个伪 ...

  8. 【剑指Offer面试编程题】题目1283:第一个只出现一次的字符--九度OJ

    题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符. 输入: 输入有多组数据 每一组输入一个字符串. 输出: 输出第一个只出现一次的 ...

  9. 与Python的第一次见面

    1.Python的起源 Python的作者,Guido von Rossum,确实是荷兰人.1982年,Guido从阿姆斯特丹大学(University of Amsterdam)获得了数学和计算机硕 ...

  10. 实验一 git代码版本管理

    实验目的 1. 了解分布式系统版本管理的核心机理. 2. 熟练掌握 git 的基本指令和分支管理指令. 实验内容 1. 安装 git.2. 初始化配置 git,git init ,git status ...