三、深入Vue组件——Vue插槽slot、动态组件
一、插槽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、动态组件的更多相关文章
- Vue进阶(Bus/作用域slot/动态组件)
		一.Vue非父子组件传值(Bus/总线/发布订阅模式/观察者模式) 我们在之前已经知道了父子传值.父组件传递过来了的值,在子组件通过props接受,然后就可以使用了. 也学过了隔代传值,均是通过pro ... 
- Vue.js的组件(slot/动态组件等)、单文件组件、递归组件使用
		一.组件 1> 组件命名方式有两种(注意:在DOM模板中只有kebab-case命名方法才生效): html中引用组件: <!-- 在DOM模板中,只有 kebab-case命名才生效 - ... 
- Vue中的插槽---slot
		一:什么是插槽? 插槽(Slot)是Vue提出来的一个概念,正如名字一样,插槽用于决定将所携带的内容,插入到指定的某个位置,从而使模板分块,具有模块化的特质和更大的重用性. 插槽显不显示.怎样显示是由 ... 
- 在vue中使用插槽 slot
		插槽(slot)这个概念非常重要 插槽的使用场景1:在子组件里面显示父组件的dom <div id='root'> <child content = '<p>Dell&l ... 
- Vue一个案例引发的动态组件与全局事件绑定总结
		最近在自学 Vue 也了解了一些基本用法,也记录了一些笔记有兴趣的朋友可以去查看我的其他文章,技术这东西真的不能光靠看,看是没有的,你必须要动手实践,只有在实战项目中才能发现问题,才能发现我们没有掌握 ... 
- Vue组件(35)动态组件 component 的 is 到底可以是啥?
		component 动态组件 Vue官网上提供了一个动态组件 <component :is="currentTabComponent"> ,那么这里的 is 到底是什么 ... 
- 第八十九篇:Vue 重学插槽slot
		好家伙, 1.什么是插槽? 插槽是vue为组件的封装者提供的能力.允许开发者在封装组件时, 把不确定的,希望由用户指定的部分定义为插槽 我们依然可以把它理解为一个占位符 1.1.插槽的基本用法 试 ... 
- vue中的插槽slot
		插槽(slot):是组件的一块HTML模板,父组件决定这块模板显不显示以及怎么显示. 位置由子组件自身决定(slot现在组件template的什么位置,父组件传过来的模板将来就显示在什么位置) 匿名插 ... 
- 组件基础(插槽slot)—Vue学习笔记
		刚开始我们淡淡提过<slot></slot>现在深入了解一下. slot可以进行父组件传值到子组件. 比如:我们将hiboy通过<slot>传递到组件中. < ... 
- Vue.js 2使用中的难点举例--子组件,slot, 动态组件,事件监听
		一例打尽..:) <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ... 
随机推荐
- css height VS min-height
			height:容器高度固定(值是百分比时除外): min-height:容器高度小于该值时取该值,大于该值时按实际的值.应用:页面中页脚置底. 
- Java--对象与类(二)
			final 实例域 可以将实例域定义为final.构建对象时必须初始化这样的域.也就是说在一个构造器执行之后,这个域被设置,并且之后无法对其修改 final 修饰符大多应用于基本(primitive) ... 
- 51nod 1449:砝码称重
			1449 砝码称重 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 取消关注 现在有好多种砝码,他们的重量是 w0,w1 ... 
- Python 基础之递归 递归函数 尾递归 斐波那契
			1.递归函数 定义:自己调用自己的函数递:去归:回有去有回是递归#(1)简单的递归函数def digui(n): print(n) if n > 0: digui(n- ... 
- 设计模式课程 设计模式精讲 22-2 备忘录模式coding
			1 代码演练 1.1 代码演练1 1 代码演练 1.1 代码演练1 需求: 网站笔记需要存储快照,能实现回退的功能. 注意: a 设计的时候,可以分为笔记类,笔记快照类和 笔记快照管理类 三个类. ... 
- 十五 Spring的AOP的注解的通知类型,切入点的注解
			Spring的注解的AOP的通知类型 @Before:前置通知 @AfterReturning:后置通知 @Around:环绕通知 @AfterThrowing:异常抛出通知 @After:最终通知 ... 
- css选择器优先级排序
			浏览器默认属性 < 继承自父元素的属性 < 通配符选择器 < 标签选择器 < 类选择器 < 结构伪类选择器 < id选择器 < 行内样式 < !impo ... 
- 用javaweb写一个注册界面,并将数据保存到后台数据库(全部完成)(课堂测试)
			一.题目:WEB界面链接数据库 1.考试要求: 1登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头:(1分) 2登录密码:要求显示“• ”或“*”表示输入位数,密码要求八位以上字母. ... 
- ZCGL大数据项目优化组件布置
			1.经JMeter并发性能测试,每个HBaseService服务的并发请求上限大概是1K,为了支持5W个并发请求量,需要增加部署节点,相应需要增加部署路由网管Zuul,为了隐藏多个路由网管Zuul的I ... 
- 多选按钮CheckBox
			main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmln ... 
