Vue 新版插槽的使用

插槽就是子组件中的提供给父组件使用的一个占位符,用 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的标签。

最简单的插槽使用方法:

//a模块
<template>
  <div>
      <b-module>
      <div>好热啊!!!</div>
      </b-module>
  </div>
</template>

<script>
  import bModule from './b';
  export default {
    name: "A",
    components: {
      bModule
    }
  }
</script>
//b模块
<template>
  <div>
 	 <h1>今天热吗:</h1>
      <slot></slot> //如果放置多个slot也只会渲染出一样的内容
  </div>

</template>

在这里插入图片描述
如果b模板里没有放置<slot></slot>
a模板里的<div>好热啊!!!</div>不会被渲染出来哦
在这里插入图片描述

具名插槽

即使打乱template模板的顺序也不会影响渲染的顺序
只要slot里的name值对上了就不会渲染错。

//a模板
<template>
  <div>
      <b-module>
      <template v-slot:footer>尾部</template> <br>
      //v-slot:可以缩写成#
      <template #header>头部</template> <br>
      <template>我是默认插槽的值</template>
      </b-module>
  </div>
</template>
<script>
  import bModule from './b';
  export default {
    name: "A",
    components: {
      bModule
    }
  }
</script>
//b模板
<template>
  <div>
    <slot name="header"></slot>
    <slot></slot> //默认插槽
    <slot name="footer"></slot>
  </div>
</template>

在这里插入图片描述

作用域插槽

绑定在 元素上的 attribute 被称为插槽 prop。现在在父级作用域中,我们可以使用带值的 v-slot 来定义我们提供的插槽 prop 的名字:

<template>
  <div>
      <b-module>	//v-slot="props"
          <template v-slot:default="props">
            {{user.user.firstName + user.user.lastName}}
          </template>
      </b-module>
  </div>
</template>
<script>
  import bModule from './b';
  export default {
    name: "A",
    components: {
      bModule
    }
  }
</script>
<template>
  <div>
    <slot :user="user"></slot>
  </div>
</template>
<script>
  export default {
    name: "B",
    data() {
      return {
        user: {
          firstName: '龍',
          lastName:'鸣'
        }
      }
    },
  }

</script>

在这里插入图片描述

带name的写法

<template>
  <div>
      <b-module>
          <template v-slot:usr="prop">
            {{prop.user.name}}
          </template>
          		//此写法为缩写
          <template #gs="props">
            {{props.goods.total}}
            {{props.goods.shirt}}
            {{props.goods.dress}}
          </template>

      </b-module>
  </div>
</template>

<script>
  import bModule from './b';
  export default {
    name: "A",
    components: {
      bModule
    }
  }
</script>
<template>
  <div>
    <slot :user="user" name="usr"></slot>
    <slot :goods="goods" name="gs"></slot>
  </div>
</template>
<script>
  export default {
    name: "B",
    data() {
      return {
        user: {
          name: '龍鸣',
        },
        goods: {
          total:100,
          shirt:10,
          dress:90
        },
      }
    },
  }

</script>

在这里插入图片描述

独占默认插槽的缩写语法

v-slot只能写在template模板上,这种特殊情况除外
当被提供的内容只有默认插槽时,组件的标签才可以被当作插槽的模板来使用。

	<template>
	 <div>
	 				// v-slot="prop"
	 				// #default="prop"
	     <b-module v-slot:default="prop">
	        {{prop.user.name}}
	     </b-module>
	 </div>
	</template>
<template>
  <div>
    <slot :user="user"></slot>
  </div>
</template>
<script>
  export default {
    name: "B",
    data() {
      return {
        user: {
          name: '龍鸣',
        },
      }
    },
  }  

解构插槽

如果是v-slot="prop"就会比较麻烦
{{prop.user.name}}
下面这种解构方法更简单

<template>
  <div>
      <b-module v-slot="{user}">
        {{user.name}}
      </b-module>
  </div>
</template>

还可以重命名

<template>
  <div>				//将user重命名为rename
      <b-module v-slot="{user: rename}">
        {{rename.name}}
      </b-module>
  </div>
</template>

可以定义后备内容,防止传过来的值是undefined的情况

<template>
  <div>
      <b-module v-slot="{user = {name:'hello world'}}">
        {{user.name}}
      </b-module>
  </div>
</template>
<template>
  <div>    //假设
    <slot :user="undefined"></slot>
  </div>
</template>

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值