一、插槽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. Linu计划任务/crontab命令

    周期性任务计划 相关程序包: cronie:主程序包,提供了crond守护进程及相关辅助工具 cronie-anacron:cronie的补充程序:用于监控cronie任务执行状况:如cronie中的 ...

  2. Android学习笔记17:单项选择RadioButton和多项选择CheckBox的使用

    请参见 http://www.android100.org/html/201406/05/19495.html

  3. linux中cp指令前面加反斜杠

    在cp指令前面加反斜杠可以不弹出是否覆盖的询问而直接覆盖! 如:cp /app/WEB-INF/com/cfg.properties /app_bak/WEB-INF/com/cfg.properti ...

  4. CentOS7中下载安装Multitail(让你的日志文件变得多彩)

    MultiTail是干啥的? Linux系统下查看日志的一个工具,允许您监视终端中多个窗口中的日志文件和命令输出,着色,过滤和合并. 具体介绍请看官网:https://www.vanheusden.c ...

  5. IDEA工具java开发之 常用插件 git插件 追加提交 Code Review==代码评审插件 撤销提交 撤销提交 关联远程仓库 设置git 本地操作

    ◆git 插件 请先安装git for windows ,git客户端工具 平时开发中,git的使用都是用可视化界面,git命令需要不时复习,以备不时之需 1.环境准备 (1)设置git (2)本地操 ...

  6. 2018 蓝桥杯省赛 B 组模拟赛

    C. 结果填空:U型数字 最近蒜头君喜欢上了U型数字,所谓U型数字,就是这个数字的每一位先严格单调递减,后严格单调递增.比如 212 就是一个U型数字,但是 333, 98, 567, 3131,就是 ...

  7. Lesson 10 Silicon valley

    What does the computer industry thrive on apart from anarchy? Technology trends may push Silicon Val ...

  8. Linux之系统优化配置

    Linux系统优化配置 更新国内镜像源 国内速度快的常用更新源如下: ​ http://mirrors.sohu.com ​ http://mirrors.163.com [root@greymous ...

  9. #写一个登陆的程序 ( 1.最多登录失败3次 2.登陆成功,提示欢迎XX登录,今天的日期是XXX,程序结束 3.要检验输入是否为空,账户和密码不能为空 4.账户不区分大小写)

    import datetime import MySQLdb today=datetime.datetime.today() username=str(input('请输入账户:')) passwd1 ...

  10. 安装redis集群

    1.搭建集群需要使用到官方提供的ruby脚本. 需要安装ruby的环境. 安装ruby yum install ruby yum install rubygems 2.将ruby包redis-3.0. ...