Vue 插槽(slot)的理解

父组件向子组件传值我们会一般用到props,那传递一个DOM节点呢?

使用插槽slot,能高效地解决父组件向子组件插入DOM节点问题。

插槽:在vue中,可以在组件内部定义一个或多个插槽,子组件决定插槽的位置,也可以设置默认的信息,父组件在插槽里插入信息,有默认信息时,父组件不插入信息,则显示子组件的默认信息;

下面就列举下关于插槽的使用方式:

1、匿名插槽

//组件(父)
  <child>
    <p>父页面</p>  //匿名插槽即为默认插槽,也可以写成 <template v-slot:default><p>父页面</p></template>
  </child>

//组件(子)
  <div class="child-page">
    <h1>子页面</h1>
    <slot></slot>
  </div>

//页面渲染结果
  <div class="child-page">
    <p>父页面</p>
  </div>

2、具名插槽

v-slot只能添加在插槽的模板template上,如果组件里只有默认插槽时,组件的标签才可以被当作插槽的模板来使用;

<child  v-slot:default="child"></child>

//组件(父)
 //写法一:
  <child>
    <template v-slot:child><p>父页面</p></template>
  </child>
 //写法二(综合写法一的简写):
  <child>
    <template #child><p>父页面</p></template>
  </child>

//组件(子)
  <div class="child-page">
    <slot name="child">子页面</slot>
  </div>

//页面渲染结果
  <div class="child-page"><p>父页面</p></div>

 动态的具名插槽:

//组件(父)
  <child>
    <template #[slotName]><p>父页面</p></template>
  </child>

//组件(父)js:
  data(){
    return(){
      slotName:'two'
    }
  }
 

3、作用域插槽

//组件(父)
 //写法一:
  <child>
    <template #childName="data"><p>{{data.child}}</p></template>
  </child>


//组件(子)
  <div class="child-page">
    <slot :data="uesrs" name="childName"></slot>
  </div>

//组件(子)js:
  data(){
    return(){
      childData:'子组件传参',
    }
  }


//页面渲染结果
  <div class="child-page"><p>子组件传参</p></div>

子组件有多个相同名字的插槽,在父组件中同一个组件标签只插入一条插槽信息,会显示多个相同的插槽信息;

//组件(父)
  <child>
    <template #child><p>父页面</p></template>
  </child>

//组件(子)
  <div class="child-page">
    <slot name="child">子页面</slot>
    <slot name="child">子页面2</slot>
    <slot name="child">子页面3</slot>
  </div>

//页面渲染结果
  <div class="child-page">
    <p>父页面</p>
    <p>父页面</p>
    <p>父页面</p>
  </div>

 如果父组件里同一个子组件的标签有多条相同的插槽信息,但是子组件只有一个插槽,那只会显示父组件的最后一条插槽信息;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue中的slot)是一种用于在组件中入内容的机制。它允许我们在组件的模板中定义一些占位符,然后在使用该组件时,可以将具体的内容入到这些占位符中。 在Vue 2.x版本中,我们可以使用`<slot>`元素来定义,并使用`<slot>`元素的`name`属性来定义具名。例如: ```html <template> <div> <slot></slot> <!-- 默认 --> <slot name="header"></slot> <!-- 具名 --> <slot name="footer"></slot> <!-- 具名 --> </div> </template> ``` 然后,在使用该组件时,我们可以在组件标签中入内容,这些内容将会替换对应的。例如: ```html <my-component> <p>默认的内容</p> <template v-slot:header> <h1>具名header的内容</h1> </template> <template v-slot:footer> <p>具名footer的内容</p> </template> </my-component> ``` 在Vue 3.x版本中,为了统一的语法,引入了`v-slot`指令,取代了`slot`和`slot-scope`这两个在Vue 2.x中已被废弃但仍可使用的属性。使用`v-slot`指令时,可以直接在组件标签上使用,而不需要再使用`<template>`元素。例如: ```html <my-component> <template #default> <p>默认的内容</p> </template> <template #header> <h1>具名header的内容</h1> </template> <template #footer> <p>具名footer的内容</p> </template> </my-component> ``` 需要注意的是,在Vue 3.x中,只能使用`v-slot`指令来定义,而不能再使用`slot`和`slot-scope`属性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值