浅谈 Vue 插槽

背景:

<child></child> //child是一个组件

如上,我们都知道组件的引用就跟常规标签一样。但是组件标签并不能进行如下操作:

<child>
	<p>我是一个组件!</p>
</child>

如果在创建组件时没有使用<slot>插槽,‘<p>我是一个组件!</p>’这句将不会渲染。因为默认情况下,父组件在子组件内套的内容,是不显示的。

什么是 <slot>插槽?

首先我们来讲解一下模板的分类:
从模板种类的角度来分,其实都可以分为非插槽模板和插槽模板两大类:
非插槽模板指的是html模板,比如’div,span,ul,table’这些,非插槽模板的显示与隐藏以及怎样显示由组件自身控制;
插槽模板是狭槽,它是一个空壳子,因为它的显示与隐藏以及最后用什么样的HTML模板显示由父组件控制。但是插槽显示的位置却由子组件自身决定,插槽写在子组件模板的什么位置,父组件传过来的模板将来就显示在什么位置。

<slot>插槽就属于插槽模板。

<slot>插槽的特点:

1、由父组件控制显示隐藏以及显示的html模板;
2、自组件决定显示的位置,<slot>在组件模板的什么位置,父组件传过来的模板将来就显示在什么位置

<slot>插槽分类:

  1. 单个<slot>插槽/默认插槽/匿名插槽

    单个<slot>插槽又叫默认<slot>插槽、匿名<slot>插槽,可以放在组件的任意地方,但只能有一个。

父组件:

<template>
	    <div class="father">
	        <h3>这里是父组件</h3>
	        <child>
	            <div>
	              <span>插入的内容</span>
	            </div>
	        </child>
	    </div>
	</template>

	子组件:
	<template>
	    <div class="child">
	        <h3>这里是子组件</h3>
	        <slot></slot>
	    </div>
	</template>

渲染的结果:

<div class="father">
     <h3>这里是父组件</h3>
  <div class="child">
      <h3>这里是子组件</h3>
      <div>
          <span>插入的内容</span>
      </div>
  </div>
 </div>

由上面可知,<slot>被替代了。

  1. 具名<slot>插槽

具名<slot>插槽与单个<slot>插槽不同,增加了名称属性。因为有了名称属性的区别,可以出现多次,出现的位置自定。

父组件:

<template>
    <div class="father">
        <h3>这里是父组件</h3>
        <child>
          <span slot='first'>具名插槽一的插入的内容</span>
		<span slot='second'>具名插槽二插入的内容</span>
		<span>匿名<slot>插槽的插入的内容</span>
        </child>
    </div>
</template>

子组件:

<template>
    <div class="child">
        <h3>这里是子组件</h3>
            <slot name='second'></slot>
		    M
		<slot name='first'></slot>
    </div>
</template>

渲染的结果:

  <div class="father">
        <h3>这里是父组件</h3>
	    <div class="child">
	            <h3>这里是子组件</h3>
			<span>具名插槽二插入的内容</span>
			<span>匿名<slot>插槽的插入的内容</span>
			<span>具名插槽一的插入的内容</span>
	    </div>
    </div>
  1. 作用域插槽

    通俗的将就是让插槽带数据。父组件用属性 slot-scope="date"获取数据,子组件用:data="date"暴露数据。

父组件:

<template>
	    <div class="father">
	        <h3>这里是父组件</h3>
	        <child>
	          <span slot='first' slot-scope="msg">{{ msg.data }}</span>
		      </child>
	    </div>
	</template>

子组件:

<template>
    <div class="child">
        <h3>这里是子组件</h3>
         <slot name='first'  :data="msg"></slot>
    </div>
</template>

 export default {
    data: function(){
      return {
        msg: '我是作用域插槽!!'
      }
    }
}

渲染的结果:

 		<div class="father">
	        <h3>这里是父组件</h3>
		    <div class="child">
		            <h3>这里是子组件</h3>
				<span>具名插槽二插入的内容</span>
		    </div>
	    </div>
  1. 带默认值的<slot>插槽

    <slot>里可以事先放入DOM,当该<slot>没有被使用时,事先放入的DOM将显示出来。

父组件:

<template>
	    <div class="father">
	        <h3>这里是父组件</h3>
	        <child></child>
	    </div>
	</template>

子组件:

<template>
    <div class="child">
        <h3>这里是子组件</h3>
            <slot><span>我是默认的DOM!!</span></slot>
    </div>
</template>

渲染的结果:

<div class="father">
        <h3>这里是父组件</h3>
	    <div class="child">
	            <h3>这里是子组件</h3>
			<span>我是默认的DOM!!</span>
	    </div>
    </div>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值