一、插槽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. Java基础 -4

    IF分支结构 在程序开发的过程中 一共会存在有三组程序逻辑:顺序结构.分支结构.循环结构 if分支结构主要是针对关系表达式进行判断处理的分支操作. if判断 public static void ma ...

  2. Linux CentOS7 VMware 安装PHP5 、安装PHP7

    一.安装PHP5 PHP官网www.php.net 当前主流版本为5.6/7.1 cd /usr/local/src/ wget http://cn2.php.net/distributions/ph ...

  3. 如何使用ffmpeg进行音视频裁剪命令和音视频合成命令

    音视频剪裁命令 ffmpeg -i input.mp4 -ss 00:00:00 -t 10 out.ts -i : 指定视频 -ss : 开始时间 -t : 指定裁剪的秒数 音视频合并的命令 ffm ...

  4. 【快学springboot】在springboot中写单元测试[Happyjava]

    前言 很多公司都有写单元测试的硬性要求,在提交代码的时候,如果单测通不过或者说单元测试各种覆盖率不达标,会被拒绝合并代码.写单元测试,也是保证代码质量的一种方式. junit单元测试 相信绝大多数的J ...

  5. 【快学springboot】2.Restful简介,SpringBoot构建Restful接口

    Restful简介 Restful一种软件架构风格.设计风格,而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现 ...

  6. jqGrid不支持IE8的解决办法

    参考:https://blog.csdn.net/tarataotao/article/details/10376657

  7. Android问题:ScrollView默认位置不是最顶部最全解决方案

    描述: Scrollview里面嵌套了一个listview ,这是开发中最寻常的一种布局,遇到的问题是:在这个Scrollview页面默认的起始位置不是最顶部,而是listview的底部. 原因: 在 ...

  8. Linux centosVMware yum更换国内仓库源、yum下载rpm包、源码包安装

    一.yum更换国内仓库源 cd /etc/yum.repos.d/ rm -f dvd.repo wget http://mirrors.163.com/.help/CentOS7-Base-163. ...

  9. Ubuntu flatabulous 主题

    在终端输入以下指令 sudo apt-get update sudo apt-get upgrade sudo apt-get install unity-tweak-tool//安装unity tw ...

  10. C# 篇基础知识3——面向对象编程

    面向过程的结构化编程,例如1972年美国贝尔研究所推出的C语言,这类编程方式重点放在在定函数上,将较大任务分解成若干小任务,每个小任务由函数实现,分而治之的思想,然而随着软件规模的不断扩张,软件的复杂 ...