Vue中插槽的使用详解必看!

1.介绍

 插槽就是子组件中的提供给父组件使用的一个占位符,用<slot></slot> 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的<slot></slot>标签。通俗的说是:slot 是在父组建控制了子组件显示或隐藏相关内容。

 插槽又分为三种,1.普通插槽    2.具命插槽     3.作用域插槽

1.普通插槽

<div id="app">
    <my-button> 
        <p>组件标签中的内容 {{msg}}</p>
        <h3>标题</h3>
    </my-button>  
</div>
<template id="myButton">
    <div>
        <!-- 插槽 slot  此时slot标签就代表 组件标签中的内容-->
        <slot></slot>
        <button>按钮1</button>
        <slot></slot>
        <button>按钮2</button>
        <slot></slot>
    </div> 
</template>
Vue.component('myButton',{
        template:'#myButton',
        data(){
            return {
            }
        }
    })
    let vm=new Vue({
        el:"#app",
        data:{
            msg:"899999999"
        }
    })

如果 <my-button> 的 template 中没有包含一个 <slot> 元素,则该组件起始标签和结束标签之间的任何内容都会被抛弃。

2.具名插槽 

 在一个组件中有多个插槽,调用的时候为了给不同的组件传递,

参数就需要为插槽进行命名。为不同需求的组件传递不同的参数。

<div id="app">
    <my-button> 
        <template v-slot:header><h3>This is header</h3></template>
        <template v-slot:main><h3>This is header</h3></template>
        <template #footer> <h3>This is header</h3></template> 
    </my-button>  
</div>
<template id="myButton">
    <div>
        <slot name="header"></slot>
        <slot name="footer"></slot>
        <slot name="c"></slot>
    </div> 
</template>
Vue.component('myButton',{
        template:'#myButton',
        data(){
            return {
            }
        },
    })
    let vm=new Vue({
        el:"#app",
    })

3.作用域插槽

作用域插槽的样式由父组件决定,内容却由子组件控制。前两种插槽不能绑定数据,作用域插槽是一个带绑定数据的插槽。简单的来说就是子组件提供给父组件参数,该参数仅限于插槽中使用,父组件可以根据子组件传过来的插槽数据来进行不同的方式展现和填充插槽的内容。

有时让插槽内容能够访问子组件中才有的数据是很有用的。例如,设想一个带有如下模板的

 <current-user> 组件:

<span>
    <slot>{{ user.lastName }}</slot>
</span>

我们可能想换掉备用内容,用名而非姓来显示。如下:

<current-user>
    {{ user.firstName }}
</current-user>

然而上述代码不会正常工作,因为只有 <current-user> 组件可以访问到 user 而我们提供的内容是在父级渲染的。

 为了让 user 在父级的插槽内容中可用,我们可以将 user 作为 <slot> 元素的一个 attribute 绑定上去:

<span>
      <slot v-bind:user="user">
          {{ user.lastName }}
        </slot>
    </span> 

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

<current-user>
    <template v-slot:default="slotProps">
      {{ slotProps.user.firstName }}
    </template>
</current-user>

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值