【Vue】 插槽

news/2024/11/8 0:29:57/

目录

  • 1 插槽
    • 1.1 默认插槽
    • 1.2 插槽设置默认内容
    • 1.3 具名插槽
    • 1.4 具名与默认插槽同时使用
    • 1.5 动态插槽名
    • 1.6 作用域插槽
      • 1.6.1 默认作用域插槽
      • 1.6.2 具名作用域插槽
      • 1.6.3 具名与默认 作用域插槽同时使用

1 插槽

  • 子组件写插槽位置

  • 父组件写内容放入插槽

  • 插槽内容无法访问子组件的数据

  • 非作用域插槽

    • 默认插槽:<MyComponent> 123 </MyComponent>
    • 具名插槽:
      • 不简写:<MyComponent> <template v-slot:header> 123 </template> </MyComponent>
    • 简写: <MyComponent> <template #header> 123 </template> </MyComponent>
    • 具名与默认 插槽同时使用:
      • 自定义:#header#xxx
    • 默认:#default,或者不写 <template></template>
  • 作用域插槽:使父组件写的插槽的内容访问到子组件的数据

    • 默认作用域插槽
      • 不解构: <MyComponent v-slot="slotProps"> {{ slotProps.text }} </MyComponent>
      • 解构: <MyComponent v-slot="{ text, count }"> {{ text }} {{ count }} </MyComponent>
    • 具名作用域插槽: <MyComponent> <template #header="headerProps"> {{ headerProps }} </template> </MyComponent>
    • 具名与默认 作用域插槽同时使用:
    • 不能使用:<MyComponent v-slot="message"> <template #xxx> {{ message }} </template> </MyComponent>
    • 能使用:<template #xxx="{ message }"> {{ message }} </template>

1.1 默认插槽

<!-- 子组件 hello -->
<template><view><solt></solt></view>
</template>
<!-- 父组件 -->
<hello><view>111</view>
</hello>

1.2 插槽设置默认内容

<!-- 子组件 hello -->
<template><view><solt>我是默认内容</solt></view>
</template>
<!-- 父组件 -->
<hello><view>我能替代默认内容</view>
</hello>

1.3 具名插槽

  • name 的插槽被称为具名插槽 (named slots)。
  • 没有提供 name 的 <slot> 出口会隐式地命名为“default”。
  • 要为具名插槽传入内容,需要使用一个含 v-slot 指令的 <template> 元素,并将目标插槽的名字传给该指令
  • v-slot 指令 简写为 #
<!-- 子组件 hello -->
<template><view><slot name="header"></slot></view>
</template>
<!-- 父组件 -->
<hello><template v-slot:header><!-- header 插槽的内容放这里 --></template><!-- 简写 --><template #header><!-- header 插槽的内容放这里 --></template>
</hello>

1.4 具名与默认插槽同时使用

当一个组件同时接收默认插槽和具名插槽时,所有位于顶级的非 <template> 节点都被隐式地视为默认插槽的内容

<!-- 子组件 hello -->
<template><view><slot name="header"></slot>---<slot></slot></view>
</template>
<!-- 父组件 -->
<hello><template #header><!-- header 插槽的内容放这里 --></template><template #default><!-- 默认插槽的内容放这里 --></template>
</hello>

<!-- 父组件 -->
<hello><template #header><!-- header 插槽的内容放这里 --></template><!-- 默认插槽的内容放这里 -->
</hello>

1.5 动态插槽名

动态指令参数在 v-slot 上也是有效的,即可以定义下面这样的动态插槽名:

<base-layout><template v-slot:[dynamicSlotName]> ... </template><!-- 缩写为 --><template #[dynamicSlotName]> ... </template>
</base-layout>

1.6 作用域插槽

  • 父组件写的插槽的内容无法访问到子组件的数据
  • 如果同时使用父组件域内和子组件域内的数据

可以像对组件传递 props 那样,向一个插槽的出口上传递 attributes

1.6.1 默认作用域插槽

默认插槽通过子组件标签上的 v-slot 指令,直接接收到了一个插槽 props 对象:

<!-- 子组件 -->
<div><slot :text="greetingMessage" :count="1"></slot>
</div>
<!-- 父组件 -->
<MyComponent v-slot="slotProps">{{ slotProps.text }} {{ slotProps.count }}
</MyComponent>
<!-- 也可以在 v-slot 中使用解构: -->
<MyComponent v-slot="{ text, count }"> {{ text }} {{ count }} </MyComponent>

1.6.2 具名作用域插槽

  • 不使用缩写 v-slot:header="slotProps"
  • 使用缩写 #header="slotProps"
  • name 是一个 Vue 特别保留的 attribute,不会作为 props 传递给插槽
<!-- 子组件 -->
<div><slot name="header" :text="greetingMessage" :count="1"></slot>
</div>
<!-- 父组件 -->
<MyComponent><template #header="headerProps"> {{ headerProps }} </template><template #default="defaultProps"> {{ defaultProps }} </template>
</MyComponent>

1.6.3 具名与默认 作用域插槽同时使用

如果你混用了具名插槽与默认插槽,则需要为默认插槽使用显式的 标签。尝试直接为组件添加 v-slot 指令将导致编译错误。这是为了避免因默认插槽的 props 的作用域而困惑。举例:

<!-- 该模板无法编译 -->
<MyComponent v-slot="{ message }"><p>{{ message }}</p><template #footer><!-- message 属于默认插槽,此处不可用 --><p>{{ message }}</p></template>
</MyComponent>

为默认插槽使用显式的 标签有助于更清晰地指出 message 属性在其它插槽中不可用:

<MyComponent><!-- 使用显式的默认插槽 --><template #default="{ message }"><p>{{ message }}</p></template><template #footer><p>Here's some contact info</p></template>
</MyComponent>

http://www.ppmy.cn/news/731959.html

相关文章

vue2---插槽

目录 2 插槽 2.1 概念的基本使用 2.1.1 概念 2.2.2 插槽的基本使用 2.2.3 具名插槽&#xff08;带有name的插槽&#xff09; 2 插槽 2.1 概念的基本使用 2.1.1 概念 插槽&#xff08;Slot)是vue为组件的封装者提供的能力。允许开发者在封装组件时&#xff0c;把不确定的…

vue2 ---- 插槽

什么是插槽 子组件提供给父组件的占位符&#xff0c;用 slot 元素来表示&#xff0c; 父组件可以在这个占位符里面填充各种模板代码。 1. 匿名插槽&#xff1a; 父组件引入子组件&#xff0c;在子组件内留 标签&#xff0c; 就可以在父组件中的子组件标签中写入内容。 例…

不懂就要问,怎么辨别抖音手机卡真假?

当我们在刷抖音时&#xff0c;总能看到一些关于手机卡/流量卡的广告&#xff0c;这些套餐看起来都是超级便宜&#xff0c;有的套餐9元180G&#xff0c;有的套餐19元230G&#xff0c;那么&#xff0c;这些卡有没有套路呢&#xff0c;怎么辨别抖音手机卡真假&#xff1f;接下来&a…

[Vue] 组件卡槽的使用

SLOT 例子 参考代码&#xff1a;code实现功能&#xff1a; 两种方法实现父组件往子组件中传入DOM节点 1. 属性传值&#xff08;不推荐&#xff09; 2. Slot插槽使用 &#xff08;推荐&#xff09;属性传值&#xff08;不推荐&#xff09; 思路&#xff08;注意&#xff1a;…

Redis的介绍和安装教程(配置文件)

1.Redis简单的介绍 redis是一种键值对的NoSql数据库&#xff0c;这里有两个关键字&#xff1a; 键值对 Nosql 其中键值型&#xff0c;是指Redis中存储的数据都是以key.value对的形式多种多样&#xff0c;可以实字符串、数值、甚至json&#xff0c;可以参考HashMap 然后NoSq…

美女小姐姐是你得菜吗~PYTHON采集西瓜小姐姐

目录标题 前言第三方模块&#xff1a;环境介绍:基本流程:代码展示尾语 前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 第三方模块&#xff1a; requests >>> pip install requests 第三方模块安装: win R 输入cmd 输入安装命令 pip install 模块名 (如果你觉…

(笔记)Mac下耳机左右声道不平衡(左边小右边大或者右边大左边小)的解决方法

1.打开System Preferences 2.点击Soud&#xff08;声音&#xff09; 3.把Balance的进度条拉到中间位置就OK啦&#xff01;&#xff08;Output volume是你当前耳机音量的大小&#xff09;

小米air2se耳机只有一边有声音怎么办_双十一高性价蓝牙耳机排名,500元内真无线蓝牙耳机推荐...

这几年随着蓝牙技术及TWS技术的不断发展和普及&#xff0c;让真无线蓝牙耳机的门槛越来越低&#xff0c;现在蓝牙耳机市场上真无线蓝牙耳机的品牌产品是越来越多&#xff0c;让我们想选择一款心仪、价格又合适的真无线耳机困难重重&#xff0c;所以就在这里整理出了一些市场反响…