初识Vue-插槽(详解插槽slot的运用)

目录

一、slot介绍

1. 概念

2. 特点

3. 功能

4. 用法

5. 应用

二、slot语法

1. 默认插槽

2. 命名插槽

3. 作用域插槽

小结

三、slot应用实例

1.动态表单组件

2.博客系统的文章组件

3.商品列表

四、总结


一、slot介绍

1. 概念

Vue.js中的插槽是一种机制,允许你在父组件中将任意内容传递给子组件,使得组件更加灵活和可复用。插槽允许你定义一个模板,并在子组件中定义插槽的位置,然后在父组件中填充内容。

2. 特点

  • 灵活性: 插槽提供了灵活的方式,允许父组件动态地向子组件传递内容,从而使得组件更容易适应不同的需求。

  • 复用性: 插槽使得组件更具可复用性,因为它们可以接受各种不同类型的内容,并在不同的上下文中使用。

  • 组件通信: 插槽提供了一种在父子组件之间进行通信的机制,父组件可以通过插槽向子组件传递数据、事件等信息。

3. 功能

  • 默认插槽: 如果子组件没有具名插槽,父组件传递的内容将被放置在子组件的默认插槽中。

  • 命名插槽: 父组件可以在子组件中定义多个具名插槽,通过在父组件中指定插槽的名称,可以将内容插入到对应的插槽中。

  • 作用域插槽: 作用域插槽允许子组件向父组件传递数据,通过在子组件中使用特定的属性名称,父组件可以访问子组件中的数据。

4. 用法

  • 默认插槽的使用: 在子组件中使用 <slot></slot> 来定义默认插槽的位置,父组件中的内容将被放置在这个位置上。

  • 命名插槽的使用: 在子组件中使用 <slot name="slotName"></slot> 来定义命名插槽,父组件中通过 <template v-slot:slotName> 来指定插入的内容。

  • 作用域插槽的使用: 在子组件中使用 <slot :data="data"></slot> 来定义作用域插槽,父组件中通过 <template v-slot="{ data }"> 来接收子组件传递的数据。

5. 应用

  • 复杂组件设计: 插槽使得设计复杂的组件变得更加容易,可以将组件拆分为更小的部件,并在父组件中动态组合它们。

  • 布局组件: 插槽可以用于设计灵活的布局组件,父组件可以根据需要填充不同的内容到不同的插槽位置。

  • 扩展性: 插槽可以使得组件更具扩展性,允许用户在不修改组件源代码的情况下,通过插槽定制组件的外观和行为。

二、slot语法

1. 默认插槽

默认插槽是最简单的形式,没有指定名称。在子组件中使用 <slot></slot>,父组件的内容会插入到这里。

<!-- 子组件 ChildComponent.vue -->
<template>
  <div>
    <h2>子组件标题</h2>
    <!-- 默认插槽 -->
    <slot></slot>
  </div>
</template>
<!-- 父组件 ParentComponent.vue -->
<template>
  <div>
    <ChildComponent>
      <!-- 这个内容将填充到子组件的默认插槽中 -->
      <p>父组件中的内容</p>
    </ChildComponent>
  </div>
</template>

在这个例子中,<p>父组件中的内容</p> 会被插入到 ChildComponent<slot></slot> 位置。

2. 命名插槽

命名插槽允许你在子组件中定义多个插槽,并在父组件中指定要插入的内容。命名插槽使用 name 属性。

<!-- 子组件 MyComponent.vue -->
<template>
  <div>
    <h2>子组件标题</h2>
    <!-- 命名插槽 -->
    <slot name="header"></slot>
    <slot name="footer"></slot>
  </div>
</template>
<!-- 父组件 ParentComponent.vue -->
<template>
  <div>
    <MyComponent>
      <!-- 使用命名插槽 -->
      <template v-slot:header>
        <p>这里是头部内容</p>
      </template>
      <template v-slot:footer>
        <p>这里是底部内容</p>
      </template>
    </MyComponent>
  </div>
</template>

在这个例子中,父组件可以使用 v-slot: 语法指定将内容插入子组件的哪个插槽。v-slot:header 将内容插入 name="header" 的插槽。

3. 作用域插槽

作用域插槽用于让子组件将数据传递给父组件,父组件可以根据这些数据动态生成内容。

<!-- 子组件 MyComponent.vue -->
<template>
  <div>
    <h2>子组件标题</h2>
    <!-- 作用域插槽 -->
    <slot :user="user"></slot>
  </div>
</template>

<script>
export default {
  data() {
    return {
      user: {
        name: 'Alice',
        age: 30
      }
    };
  }
};
</script>
<!-- 父组件 ParentComponent.vue -->
<template>
  <div>
    <MyComponent>
      <!-- 使用作用域插槽,接收子组件传递的数据 -->
      <template v-slot="{ user }">
        <p>名字:{{ user.name }}</p>
        <p>年龄:{{ user.age }}</p>
      </template>
    </MyComponent>
  </div>
</template>

在这个例子中,子组件通过 <slot :user="user"> 传递了 user 数据,父组件可以通过 { user } 来接收这个数据并进行渲染。

小结

  • 默认插槽 是最简单的形式,没有名称,父组件的内容直接插入子组件的 <slot> 位置。
  • 命名插槽 允许子组件中有多个插槽,父组件可以指定插入的内容位置。
  • 作用域插槽 允许子组件向父组件传递数据,父组件可以根据传递的数据动态生成内容。

三、slot应用实例

1.动态表单组件

一个动态表单组件,其中包含多个表单项,每个表单项包括标签、输入框以及验证信息。我们将使用命名插槽和作用域插槽来实现这个组件。

<!-- DynamicForm.vue -->
<template>
  <div>
    <form @submit.prevent="handleSubmit">
      <!-- 循环渲染表单项 -->
      <div v-for="(item, index) in formItems" :key="index">
        <label>{{ item.label }}</label>
        <!-- 使用作用域插槽传递表单数据和验证规则 -->
        <slot :name="item.name" :value="formData[item.name]" :rules="item.rules"></slot>
        <div v-if="formErrors[item.name]" class="error">{{ formErrors[item.name] }}</div>
      </div>
      <button type="submit">提交</button>
    </form>
  </div>
</template>

<script>
export default {
  data() {
    return {
      formData: {}, // 表单数据
      formErrors: {}, // 表单错误信息
      formItems: [ // 表单项配置
        { name: 'username', label: '用户名', rules: 'required' },
        { name: 'password', label: '密码', rules: 'required|min:6' },
        { name: 'email', label: '邮箱', rules: 'required|email' }
        // 可以根据需要添加更多表单项
      ]
    };
  },
  methods: {
    handleSubmit() {
      // 提交表单逻辑
      // 在这里可以进行表单数据验证等操作
      // 省略具体实现
    }
  }
};
</script>

在上面的代码中,DynamicForm 组件接收一个 formItems 数组作为配置项,每个配置项包括表单项的名称、标签和验证规则。通过循环渲染表单项,并使用作用域插槽传递表单数据和验证规则给父组件。

下面是一个使用 DynamicForm 组件的示例:

<!-- ParentComponent.vue -->
<template>
  <div>
    <DynamicForm>
      <!-- 使用命名插槽渲染表单项 -->
      <template v-for="(item, index) in formItems" v-slot:[item.name]="{ value, rules }">
        <input v-model="formData[item.name]" :placeholder="item.label" :type="item.type">
        <!-- 根据验证规则显示错误信息 -->
        <div v-if="formErrors[item.name]" class="error">{{ formErrors[item.name] }}</div>
      </template>
    </DynamicForm>
  </div>
</template>

<script>
import DynamicForm from './DynamicForm.vue';

export default {
  components: {
    DynamicForm
  },
  data() {
    return {
      formData: {}, // 父组件中的表单数据
      formErrors: {}, // 父组件中的表单错误信息
      formItems: [ // 父组件中的表单项配置
        { name: 'username', label: '用户名', type: 'text' },
        { name: 'password', label: '密码', type: 'password' },
        { name: 'email', label: '邮箱', type: 'email' }
        // 可以根据需要添加更多表单项
      ]
    };
  }
};
</script>

在父组件中,我们使用命名插槽来渲染表单项,并接收来自子组件的表单数据和验证规则。用户输入时,父组件中的 formData 会实时更新,同时也会进行表单数据验证,错误信息会显示在相应的表单项下方。

2.博客系统的文章组件

<!-- Article.vue -->
<template>
  <article class="article">
    <!-- 命名插槽:文章标题 -->
    <slot name="title"></slot>
    
    <!-- 命名插槽:文章元数据(作者、日期等) -->
    <div class="metadata">
      <slot name="author"></slot>
      <slot name="date"></slot>
    </div>
    
    <!-- 默认插槽:文章内容 -->
    <div class="content">
      <slot></slot>
    </div>
    
    <!-- 命名插槽:文章评论 -->
    <div class="comments">
      <h3>评论</h3>
      <slot name="comments"></slot>
    </div>
  </article>
</template>

使用示例:

<!-- BlogPost.vue -->
<template>
  <Article>
    <!-- 自定义文章标题 -->
    <template v-slot:title>
      <h1>Vue.js 插槽应用示例</h1>
    </template>
    
    <!-- 自定义文章元数据 -->
    <template v-slot:author>
      <p>作者:小明</p>
    </template>
    <template v-slot:date>
      <p>日期:2024年5月5日</p>
    </template>
    
    <!-- 自定义文章内容 -->
    <p>在Vue.js中,插槽是一种非常强大的机制...</p>
    
    <!-- 自定义文章评论 -->
    <template v-slot:comments>
      <Comment author="张三" date="2024年5月6日">很好的文章!</Comment>
      <Comment author="李四" date="2024年5月7日">谢谢分享!</Comment>
    </template>
  </Article>
</template>

<script>
import Article from './Article.vue';
import Comment from './Comment.vue';

export default {
  components: {
    Article,
    Comment
  }
};
</script>

3.商品列表

<!-- ProductList.vue -->
<template>
  <div class="product-list">
    <!-- 自定义搜索框 -->
    <input type="text" v-model="searchQuery" placeholder="搜索商品">
    
    <!-- 默认插槽:商品列表 -->
    <ul>
      <slot :filteredProducts="filteredProducts"></slot>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      searchQuery: '',
      products: [
        { id: 1, name: '商品1', category: '类别A' },
        { id: 2, name: '商品2', category: '类别B' },
        { id: 3, name: '商品3', category: '类别A' },
        { id: 4, name: '商品4', category: '类别C' },
        // 更多商品...
      ]
    };
  },
  computed: {
    filteredProducts() {
      return this.products.filter(product =>
        product.name.toLowerCase().includes(this.searchQuery.toLowerCase())
      );
    }
  }
};
</script>

使用示例:

<!-- App.vue -->
<template>
  <ProductList>
    <!-- 自定义商品列表 -->
    <template v-slot="{ filteredProducts }">
      <li v-for="product in filteredProducts" :key="product.id">
        {{ product.name }} - {{ product.category }}
      </li>
    </template>
  </ProductList>
</template>

<script>
import ProductList from './ProductList.vue';

export default {
  components: {
    ProductList
  }
};
</script>

在这个例子中,我们展示了一个包含搜索功能的商品列表组件。用户可以在搜索框中输入关键词,列表会实时过滤出匹配的商品。通过使用插槽,父组件可以灵活地自定义商品列表的展示方式,并且组件内部负责处理搜索逻辑。

四、总结

  1. 插槽基础: 插槽是 Vue.js 中一种强大的组件化技术,允许父组件向子组件传递内容。它允许子组件在特定位置接收父组件传递的内容,并在其内部渲染。

  2. 默认插槽: 默认插槽是没有名字的插槽,用于接收父组件传递的内容。父组件可以在子组件的默认插槽中传递任意内容,子组件可以在相应位置渲染这些内容。

  3. 命名插槽: 命名插槽允许父组件传递具有特定名称的内容到子组件中的相应插槽中。这样做可以使得父组件在传递内容时更加灵活,子组件可以根据不同的插槽名称渲染不同的内容。

  4. 作用域插槽: 作用域插槽允许子组件向父组件传递数据。父组件可以通过在插槽中使用 <template> 标签并在其中使用带有数据的标签,来获取子组件传递的数据。

  5. 插槽内容处理: 子组件可以根据需要处理插槽内容,例如通过遍历列表渲染多个插槽内容、过滤、排序等操作。

  6. 动态插槽名称: 插槽名称可以是动态的,这意味着父组件可以根据需要在运行时决定向哪个插槽传递内容。

  7. 插槽作用域: 插槽可以有自己的作用域,可以在插槽内部访问子组件的数据和方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/593964.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Fourier 测试时间自适应与多级一致性用于鲁棒分类

文章目录 Fourier Test-Time Adaptation with Multi-level Consistency for Robust Classification摘要方法实验结果 Fourier Test-Time Adaptation with Multi-level Consistency for Robust Classification 摘要 该研究提出了一种名为 Fourier 测试时间适应&#xff08;FTT…

windows驱动开发-内核调度(一)

驱动层面的调度和同步一向是内核中比较困难的部分&#xff0c;和应用层不一样&#xff0c;内核位于系统进程下&#xff0c;所以它的调度和同步一旦出现纰漏&#xff0c;那会影响所有的程序&#xff0c;而内核并不具备对于这种情况下的纠错能力&#xff0c;没有异常手段能够让挂…

workminer之dht通信部分

workminer是通过SSH爆破传播的挖矿木马&#xff0c;感染后会释放xmrig挖矿程序利用主机的CPU挖取北方门罗币。该样本能够执行特定的指令&#xff0c;指令保存在一个配置文件config中&#xff0c;config文件类似于xml文件&#xff0c;里面有要执行的指令和参数&#xff0c;样本中…

BUUCTF---misc---[BJDCTF2020]纳尼

1、下载附件是一个gif图片&#xff0c;但是图片打不开 2、用winhex分析&#xff0c;看到缺少了文件头 3、将文件头通过ASCII码方式粘贴后&#xff0c;保存&#xff0c;图片恢复了正常 4、是一张动图&#xff0c;一共四张&#xff0c;每张都有base64编码 5、用stegsolve分解图…

【竞技宝jjb.lol】LOL:TES顺利晋级却暴露问题

北京时间2024年5月5日,英雄联盟2024MSI季中赛正在如火如荼的进行之中,目前入围赛阶段的比赛已经进入尾声,入围赛实力最强的两支战队T1、TES都已经顺利晋级淘汰赛阶段,在昨天的比赛结束之后,A组的FLY、PSG,B组的FNC、GAM将争夺剩下的两个出线名额。 回顾这次入围赛中,T1和TES的比…

buu相册

010分析是一个rar文件&#xff0c;7z打开发现是一个apk文件 但没发现什么敏感信息 全局搜索mail 然后就是查看引用与出处 base解密完是一个邮箱&#xff0c;提交对了。

vivado 在硬件中调试串行 I/O 设计-属性窗口

只要在“硬件 (Hardware) ”窗口中选中 GT 或 COMMON 块、在“链接 (Link) ”窗口中选中链接 &#xff0c; 或者在“扫描 (Scan)”窗口中选中扫描 &#xff0c; 那么就会在“ Properties ”窗口中显示该对象的属性。对于 GT 和 COMMON &#xff0c; 包括这些对象的所有属性、…

01 JVM -- JVM 体系结构、HotSpot

1. JVM、HotSpot、 OpenJDK 的区别 JVM (Java Virtual Machine) 是一个虚拟机HotSpot 是 JVM 规范的一个实现。HotSpot 虚拟机通过即时编译 (JIT) 技术将 Java 字节码转换为本地机器码&#xff0c;以提高程序的执行效率。OpenJDK 是一个项目名&#xff0c;它在 HotSpot 的基础…

常见的零拷贝技术

传统IO 基于传统的IO方式&#xff0c;底层实际上通过调用read()和write()来实现。通过read()把数据从硬盘读取到内核缓冲区&#xff0c;再复制到用户缓冲区&#xff1b;然后再通过write()写入到socket缓冲区&#xff0c;最后写入网卡设备。整个过程发生了4次用户态和内核态的上…

[Kubernetes] 安装KubeSphere

选择4核8G&#xff08;master&#xff09;、8核16G&#xff08;node1&#xff09;、8核16G&#xff08;node2&#xff09; 三台机器&#xff0c;按量付费进行实验&#xff0c;CentOS7.9安装Docker安装Kubernetes安装KubeSphere前置环境: nfs和监控安装KubeSphere masternode1no…

RK3568 学习笔记 : 精简 u-boot env 默认复杂的多种引导启动设置

前言 环境&#xff1a; 正点原子 Atompi-CA1 RK3568 开发板、正点原子 DLRK3568 开发板&#xff0c;&#xff08;一时脑热买了两块 RK3568 开发板&#xff09;&#xff0c;Atompi-CA1 RK3568 开发板比较小巧&#xff0c;利于一些前期的嵌入式 Linux 开发学习与实践。 RK3568 开…

小红的循环移位

题目描述&#xff1a;小红拿到了一个数字串&#xff0c;她每次操作可以使得其向左循环移动一位。将串 ss0 s1...sn−1s ​ 向左循环移动一位&#xff0c;将得到串s1...sn−1s0。小红想知道&#xff0c;使得该数字串变成4的倍数&#xff0c;需要最少操作多少次&#xff1f;&…

推荐网站(1)懒人Excel,函数公式、操作技巧等,一看就看会

相信很多小伙伴打开excel表的时候&#xff0c;不知道要怎么操作&#xff0c;也不知道该如何搜索自己想要的结果&#xff0c;那么我推荐个网站懒人Excel&#xff0c;它可以帮我们快速了解使用 EXCEL的基本操作&#xff0c;也可以帮我们解决使用 EXCEL的遇到的问题。 可以看到他…

PCIe总线-事物层之TLP格式介绍(五)

1.概述 PCIe总线事务层位于应用层和数据链路层之间。发送时将应用层的数据请求转换成PCIe总线事务&#xff0c;然后发送到数据链路层。接收时&#xff0c;从来自数据链路层报文中提取PCIe总线事务&#xff0c;并将数据提交到应用层。事务层使用TLP表示PCIe总线事务&#xff0c…

RK3568笔记二十四:基于Flask的网页监控系统

若该文为原创文章&#xff0c;转载请注明原文出处。 此实验参考 《鲁班猫监控检测》&#xff0c;原代码有点BUG&#xff0c;已经下载不了。2. 鲁班猫监控检测 — [野火]嵌入式AI应用开发实战指南—基于LubanCat-RK系列板卡 文档 (embedfire.com) 一、简介 记录简单的摄像头监…

C++程序设计:C++的内存分布与管理

C的内存分布与管理 栈区堆区全局区代码区常量区 栈区 &#xff08;1&#xff09;什么是栈区&#xff1f; 栈区&#xff08;Stack&#xff09; 是用于存储函数调用&#xff0c;局部变量和函数参数的一种内存区域&#xff0c;它的特性就是先进后出&#xff08;FILO&#xff09;。…

ES数据存储与查询基本原理

Elasticsearch&#xff08;ES&#xff09;简介 Elasticsearch&#xff08;ES&#xff09;是一个分布式、可扩展、近实时的搜索和分析引擎&#xff0c;它基于Lucene&#xff0c;设计用于云计算中&#xff0c;处理大规模文档检索和数据分析任务&#xff0c;常用于实现内部搜索引…

【LAMMPS学习】八、基础知识(5.7)Drude感应偶极子

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

记录PR学习查漏补缺(持续补充中。。。)

记录PR学习查漏补缺 常用快捷键文件编辑素材序列标记字幕窗口帮助 效果基本3D高斯模糊查找边缘色彩颜色平衡超级键马赛克中间值变形稳定器轨道遮罩键 常用 快捷键 注意&#xff1a;比较常用的用红色字体显示 文件 快捷键作用Ctrl Alt N新建项目Ctrl O打开项目Ctrl I导入…

Samsung三星NP930XCJ-K01CN笔记本原厂Win10系统安装包下载

三星SAMSUNG笔记本电脑原装出厂Windows10预装OEM系统&#xff0c;恢复开箱状态自带系统 链接&#xff1a;https://pan.baidu.com/s/1Y3576Tsp8MtDxIpJGDucbA?pwdt0ox 提取码&#xff1a;t0ox 三星原装W10系统自带声卡,网卡,显卡,指纹,蓝牙等所有驱动、三星出厂主题专用壁纸…
最新文章