vue中slot插槽的使用

本文详细介绍了Vue.js中的插槽使用,包括默认插槽、具名插槽、作用域插槽的概念和用法,以及v-slot的新语法。通过示例展示了如何定义和使用插槽,包括解构插槽Prop、动态插槽名以及具名插槽的缩写形式,帮助开发者更好地理解和掌握Vue组件的内容分发机制。
摘要由CSDN通过智能技术生成

1.看看官网怎么说?

在 2.6.0 中,我们为具名插槽和作用域插槽引入了一个新的统一的语法 (即 v-slot 指令)。它取代了 slot 和
slot-scope 这两个目前已被废弃但未被移除且仍在文档中的 attribute。
Vue 实现了一套内容分发的 API,这套 API 的设计灵感源自 Web Components 规范草案,将 元素作为承载分发内容的出口。

2.分为哪几种?

2.1默认插槽

木有name的就是默认插槽,捕获所有未被匹配的内容。

   <slot>这是默认的slot</slot>

定义一个子组件

Vue.component("test1", {
  template: `<div>
    Hello,苏苏!
    <slot>这是默认的slot</slot>
   </div>`,
});

父组件中

<test1></test1>

此时的结果是:

Hello,苏苏!这是默认的slot

<test1>这是苏苏来了</test1>

此时的结果是:

Hello,苏苏!这是苏苏来了

当插槽有默认值的时候,重新定义的内容将会覆盖默认内容,反之显示默认内容。

2.2具名插槽

有时我们需要多个插槽, 元素有一个特殊的 attribute:name。这个 attribute 可以用来定义额外的插槽,一个不带 name 的 出口会带有隐含的名字“default”。
在向具名插槽提供内容的时候,我们可以在一个 元素上使用 v-slot 指令,并以 v-slot 的参数的形式提供其名称,(原语法为slot=“定义的名称”)

定义一个子组件

Vue.component("test1", {
  template: `<div>
    Hello,苏苏!
    <slot name="name" ></slot>
    <slot name="age"></slot>
    <slot >这是默认的slot</slot>
   </div>`,
});

父组件

<test1 style="margin: 20px"
      >eg:具名插槽的使用 <template slot="name">苏苏小苏苏111</template
      ><template slot="age">18</template></test1>

输入内容:

Hello,苏苏!苏苏小苏苏11118岁eg:具名插槽的使用

2.3作用域插槽

有时让插槽内容能够访问子组件中才有的数据是很有用的,绑定在 元素上的 attribute 被称为插槽 prop。现在在父级作用域中,我们可以使用带值的 v-slot 来定义我们提供的插槽 prop 的名字。

定义一个子组件

Vue.component("test1", {
  template: `<div>
    Hello,苏苏!
    <slot name="name" play="玩游戏"></slot>
    <slot name="age"></slot>
    <slot play="玩耍">这是默认的slot</slot>
    <slot say="说哈">这是默认的slot</slot>
   </div>`,
});

父组件:

    <test1 style="margin: 20px"
      >eg:作用域插槽使用
      <template slot="name" slot-scope="play">Suunto{{ play }}</template></test1
    >

输出:

Hello,苏苏! Suunto{ “play”: “玩游戏” } eg:作用域插槽使用 eg:作用域插槽使用
父组件:

  <test1 style="margin: 20px"
      >eg:作用域插槽使用
      <template slot="name" slot-scope="{play}">Suunto{{ play }}</template></test1
    >

输出:

Hello,苏苏! Suunto玩游戏 eg:作用域插槽使用 eg:作用域插槽使用

3.v-slot的使用

在 2.6.0 中,我们为具名插槽和作用域插槽引入了一个新的统一的语法 (即 v-slot 指令)。它取代了 slot 和 slot-scope

注意 v-slot 只能添加在 template 上 (或者独占默认插槽的缩写语法),这一点和已经废弃的 slot attribute 不同。

 <test1 style="margin: 20px">
    <template v-slot:name>这是v-slot使用的具名插槽</template></test1
  >
<test1 style="margin: 20px">
     <template v-slot:default="{ play }"
       >这是v-slot使用的作用域插槽 {{ play }}</template
     ></test1
   >
 <test1 style="margin: 20px" v-slot:default="{ play }">
	独占默认插槽的缩写语法:当被提供的内容只有默认插槽时,组件的标签才可以被当作插槽的模板来使用---{{ play}}
 </test1>

注意默认插槽的缩写语法不能和具名插槽混用,因为它会导致作用域不明确,只要出现多个插槽,请始终为所有的插槽使用完整的基于template 的语法

4. 解构插槽 Prop

定义一个子组件

Vue.component("test2", {
  props: ["lists"],
  template: `
            <div>
                <ul>
                    <li v-for="item in lists">
                        <slot :item="item"></slot>
                    </li>
                </ul>
            </div>
        `,
});

父组件

<test2 :lists="list" style="margin: 20px">
    <template v-slot="{ item }"> 解构: {{ item }} </template>
  </test2>

输出:

解构: { “name”: “苏苏1” }
解构: { “name”: “苏苏2” }
解构: { “name”: “苏苏3” }
解构: { “name”: “苏苏4” }

父组件:重命名

 <test2 :lists="list" style="margin: 20px">
    <template v-slot="{ item: user }"> 重命名: {{ user.name }} </template>
  </test2>

输出:

重命名: 苏苏1
重命名: 苏苏2
重命名: 苏苏3
重命名: 苏苏4

父组件:定义后备内容,用于插槽 prop 是 undefined 的情形

<test2 :lists="list" style="margin: 20px">
 <template v-slot="{ item = { name: '2332' } }">
     定义后备内容,用于插槽 prop 是 undefined 的情形: {{ item.name }}
   </template>
 </test2>

5.动态插槽名

动态指令参数也可以用在 v-slot 上,来定义动态的插槽名

 <test1 style="margin: 20px">
 	 <template v-slot:[dynamicSlotName]> 动态插槽名--sss </template>
 </test1>
 ...
 dynamicSlotName: "name",

输出:

Hello,苏苏! 动态插槽名--sss 这是默认的slot 这是默认的slot

6.具名插槽的缩写

具名插槽的缩写,跟 v-on 和 v-bind 一样,v-slot 也有缩写,即把参数之前的所有内容 (v-slot:) 替换为字符 #。例如 v-slot:header 可以被重写为 #header,然而,和其它指令一样,该缩写只在其有参数的时候才可用,你希望使用缩写的话,你必须始终以明确插槽名取而代之,以#default=开始

7.完整代码

<template>
  <div class="contentBox">
    <List>
      <ListItem>
        <ListItemMeta
          :avatar="src"
          title="什么是插槽"
          description="插槽就是Vue实现的一套内容分发的API,将<slot></slot>元素作为承载分发内容的出口,没有插槽的情况下在组件标签内些一些内容是不起任何作用"
        />
      </ListItem>
      <ListItem>
        <ListItemMeta
          :avatar="src"
          title="什么是默认插槽"
          description=" 木有name的就是默认插槽,捕获所有未被匹配的内容"
        />
      </ListItem>
      <ListItem>
        <ListItemMeta
          :avatar="src"
          title="什么是具名插槽"
          description="具名插槽,就是给这个插槽起个名字,如起名一个为name,一个为age,一个不命名"
        />
      </ListItem>
      <ListItem>
        <ListItemMeta
          :avatar="src"
          title="什么是作用域插槽"
          description="组件上的属性,可以在组件元素内使用,如为slot定义一个play属性,使用组件时候添加属性slot-scope"
        />
      </ListItem>
      <ListItem>
        <ListItemMeta
          :avatar="src"
          title="什么是解构插槽 Prop"
          description="作用域插槽的内部工作原理是将你的插槽内容包裹在一个拥有单个参数的函数里,可以使用 ES2015 解构来传入具体的插槽 prop"
        />
      </ListItem>
    </List>
    <test1 style="margin: 20px"></test1>
    <test1 style="margin: 20px">eg:插槽的使用</test1>
    <test1 style="margin: 20px"
      >eg:具名插槽的使用 <template slot="name">苏苏小苏苏111</template
      ><template slot="age">18</template></test1
    >
    <test1 style="margin: 20px"
      >eg:作用域插槽使用
      <template slot="name" slot-scope="play">Suunto{{ play }}</template></test1
    >
    <test1 style="margin: 20px"
      >eg:作用域插槽使用
      <template slot="name" slot-scope="{ play }"
        >Suunto{{ play }}</template
      ></test1
    >
    <div style="margin: 20px; font-weight: bold; font-size: 25px">
      作用域插槽使用
    </div>
    <test2 :lists="list" style="margin: 20px">
      <template slot-scope="item">
        {{ item }}
      </template>
    </test2>
    <test2 :lists="list" style="margin: 20px">
      <template slot-scope="{ item }">
        {{ item.name }}
      </template>
    </test2>
    <test2 :lists="list" style="margin: 20px">
      <template slot-scope="{ item }">
        <div v-if="item.name == '苏苏1'">数据1</div>
        <div v-else>其他数据</div>
      </template>
    </test2>
    <div style="margin: 20px; font-weight: bold; font-size: 25px">
      v-slot的使用
    </div>
    <div style="margin: 20px; font-weight: bold; font-size: 20px">
      注意 v-slot 只能添加在 template(或者独占默认插槽的缩写语法),这一点和已经废弃的 slot attribute 不同。
    </div>
    <test1 style="margin: 20px">
      <template v-slot:name>这是v-slot使用的具名插槽</template></test1
    >
    <test1 style="margin: 20px">
      <template v-slot:default="{ play }"
        >这是v-slot使用的作用域插槽 {{ play }}</template
      ></test1
    >
    <test1 style="margin: 20px" v-slot:default="{ play }">
      独占默认插槽的缩写语法:当被提供的内容只有默认插槽时,组件的标签才可以被当作插槽的模板来使用------{{
        play
      }}
    </test1>
    <test1 style="margin: 20px" v-slot="{ play }">
      独占默认插槽的缩写语法:不带参数的 v-slot 被假定对应默认插槽 -------{{
        play
      }}
    </test1>
    <div style="margin: 20px; font-weight: bold; font-size: 20px">
      注意默认插槽的缩写语法不能和具名插槽混用,因为它会导致作用域不明确,只要出现多个插槽,请始终为所有的插槽使用完整的基于
      template 的语法
    </div>
    <div style="margin: 20px; font-weight: bold; font-size: 20px">
      解构插槽 Prop
    </div>
    <test2 :lists="list" style="margin: 20px">
      <template v-slot="{ item }"> 解构: {{ item }} </template>
    </test2>
    <test2 :lists="list" style="margin: 20px">
      <template v-slot="{ item: user }"> 重命名: {{ user.name }} </template>
    </test2>
    <test2 :lists="list" style="margin: 20px">
      <template v-slot="{ item = { name: '2332' } }">
        定义后备内容,用于插槽 prop 是 undefined 的情形: {{ item.name }}
      </template>
    </test2>
    <div style="margin: 20px; font-weight: bold; font-size: 20px">
      动态插槽名
    </div>
    <test1 style="margin: 20px">
      <template v-slot:[dynamicSlotName]> 动态插槽名--sss </template>
    </test1>
    <div style="margin: 20px; font-weight: bold; font-size: 20px">
      具名插槽的缩写,跟 v-on 和 v-bind 一样,v-slot
      也有缩写,即把参数之前的所有内容 (v-slot:) 替换为字符 #。例如
      v-slot:header 可以被重写为
      #header,然而,和其它指令一样,该缩写只在其有参数的时候才可用,你希望使用缩写的话,你必须始终以明确插槽名取而代之,以#default=开始
    </div>
  </div>
</template>

<script>
// 在 2.6.0 中,我们为具名插槽和作用域插槽引入了一个新的统一的语法 (即 v-slot 指令)。它取代了 slot 和 slot-scope 这两个目前已被废弃但未被移除且仍在文档中的 attribute
import Vue from "vue";
Vue.component("test1", {
  template: `<div>
    Hello,苏苏!
    <slot name="name" play="玩游戏"></slot>
    ---这是米----
    <slot name="age"></slot>
    <slot play="玩耍">这是默认的slot</slot>
    <slot say="说哈">这是默认的slot</slot>
   </div>`,
});

// 绑定在 <slot> 元素上的 attribute 被称为插槽 prop
Vue.component("test2", {
  props: ["lists"],
  template: `
            <div>
                <ul>
                    <li v-for="item in lists">
                        <slot :item="item"></slot>
                    </li>
                </ul>
            </div>
        `,
});
export default {
  data() {
    return {
      dynamicSlotName: "name",
      src: require("@/assets/img/susu.jpg"),
      list: [
        {
          name: "苏苏1",
        },
        {
          name: "苏苏2",
        },
        {
          name: "苏苏3",
        },
        {
          name: "苏苏4",
        },
      ],
    };
  },
};
</script>

<style>
</style>

8.关注公众号 苏苏的bug,更多vue相关,尽在苏苏的码云如果对你有帮助,欢迎你的star+订阅!

  • 12
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 感谢您的提问,我可以回答这个问题。在 Vue 插槽是一种将内容分发到组件指定位置的方式。通过使用 <slot> 标签,我们可以在组件定义插槽,并在使用该组件时,将内容插入到插槽。如果需要在插槽插入组件,可以使用 <component> 标签来实现。 ### 回答2: Vue插槽slot)是一种用来扩展组件的机制,允许我们在组件定义一些可插入的内容。可以将插槽看作是组件的占位符,通过插槽,我们可以将自定义的内容插入到组件。 在Vue使用插槽非常简单。首先,在父组件定义一个插槽,可以使用`<slot>`标签来定义。例如: ```html <template> <div> <slot></slot> </div> </template> ``` 在子组件,我们可以使用`<父组件名></父组件名>`的形式来插入父组件的插槽。例如: ```html <template> <div> <父组件名> <p>插入到插槽的内容</p> </父组件名> </div> </template> ``` 这样,子组件的`<p>插入到插槽的内容</p>`就会被插入到父组件定义的插槽。 除了默认插槽外,Vue还支持具名插槽。具名插槽允许我们在组件定义多个插槽,并通过指定插槽的名称来插入内容。例如: ```html <template> <div> <slot name="header"></slot> <slot name="body"></slot> <slot name="footer"></slot> </div> </template> ``` 在子组件,我们可以使用`<template slot="插槽名称">插入的内容</template>`的形式来指定插入到具名插槽的内容。例如: ```html <template> <div> <父组件名> <template slot="header"> <p>插入到header插槽的内容</p> </template> <template slot="body"> <p>插入到body插槽的内容</p> </template> <template slot="footer"> <p>插入到footer插槽的内容</p> </template> </父组件名> </div> </template> ``` 这样,子组件的内容就会被插入到对应的具名插槽。 总结来说,Vue插槽机制非常灵活,可以满足不同组件的需求。通过插槽,我们可以在父组件定义一些可插入的内容,并在子组件指定要插入的内容,实现组件的扩展和定制。 ### 回答3: Vue插槽slot)是一种组件通信的方式,它允许父组件向子组件传递内容,使得子组件可以在特定位置插入具体的内容。 在Vue使用插槽步骤如下: 1. 在父组件定义插槽。可以使用`<template>`标签或者具名插槽来定义插槽的位置。例如: ``` <template> <div> <slot></slot> </div> </template> ``` 2. 在父组件引用子组件,并在子组件标签使用插槽。例如: ``` <template> <div> <child-component> 这里是插入到插槽的内容 </child-component> </div> </template> ``` 3. 在子组件使用插槽。可以使用`<slot>`标签在子组件定义插槽的位置,也可以使用具名插槽来定义多个插槽位置。例如: ``` <template> <div> <slot></slot> </div> </template> ``` 通过上述步骤,父组件的内容将会通过插槽被传递到子组件,并在特定位置进行插入。 插槽使用可以增强组件的灵活性,使得组件可以根据需要插入不同的内容,实现更加个性化的界面效果。同时,插槽也可以结合作用域插槽、具名插槽等特性,实现更加复杂的组件通信和内容控制逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值