当前位置: 首页 > article >正文

UniApp在Vue3的setup语法糖下自定义组件插槽详解

UniApp在 Vue3的 setup 语法糖下自定义组件插槽详解

UniApp 是一个基于 Vue.js 的跨平台开发框架,可以用来开发微信小程序、H5、App 等多种平台的应用。Vue 3 引入了 <script setup> 语法糖,使得组件的编写更加简洁和直观。本文将详细介绍如何在 UniApp 中使用 Vue 3 的 <script setup> 语法糖来创建自定义组件,并展示如何使用默认插槽、具名插槽和作用域插槽。

1. 默认插槽

默认插槽是最简单的插槽形式,它允许你在组件内部定义一个可替换的内容区域。父组件可以通过直接放置内容来填充这个插槽。

示例:自定义组件 MyComponent.vue

<template>
  <view class="my-component">
    <!-- 默认插槽 -->
    <slot></slot>
  </view>
</template>

<script setup>
// 这里可以定义组件的逻辑
</script>

<style scoped>
.my-component {
  border: 1px solid #ccc;
  padding: 20rpx;
  margin: 20rpx;
  background-color: #f9f9f9;
}
</style>

使用自定义组件 App.vue

<template>
  <view class="app">
    <MyComponent>
      <text>这是默认插槽的内容</text>
    </MyComponent>
  </view>
</template>

<script setup>
import MyComponent from './components/MyComponent.vue';
</script>

<style>
.app {
  padding: 20rpx;
  background-color: #fff;
}
</style>

2. 具名插槽

具名插槽允许你在组件内部定义多个插槽,并通过名称来区分它们。父组件可以通过 v-slot 指令来指定内容应该填充到哪个插槽。

示例:自定义组件 MyComponent.vue

<template>
  <view class="my-component">
    <!-- 默认插槽 -->
    <slot></slot>

    <!-- 具名插槽 -->
    <view class="header">
      <slot name="header">
        <text>默认头部内容</text>
      </slot>
    </view>

    <view class="footer">
      <slot name="footer">
        <text>默认底部内容</text>
      </slot>
    </view>
  </view>
</template>

<script setup>
// 这里可以定义组件的逻辑
</script>

<style scoped>
.my-component {
  border: 1px solid #ccc;
  padding: 20rpx;
  margin: 20rpx;
  background-color: #f9f9f9;
}

.header, .footer {
  margin: 10rpx 0;
  padding: 10rpx;
  border: 1px dashed #ccc;
}
</style>

使用自定义组件 App.vue

<template>
  <view class="app">
    <MyComponent>
      <!-- 默认插槽内容 -->
      <text>这是默认插槽的内容</text>

      <!-- 具名插槽内容 -->
      <template #header>
        <text>这是头部插槽的内容</text>
      </template>

      <template #footer>
        <text>这是底部插槽的内容</text>
      </template>
    </MyComponent>
  </view>
</template>

<script setup>
import MyComponent from './components/MyComponent.vue';
</script>

<style>
.app {
  padding: 20rpx;
  background-color: #fff;
}
</style>

3. 作用域插槽

作用域插槽允许你在组件内部传递数据给父组件,父组件可以使用这些数据来生成插槽内容。

示例:自定义组件 MyComponent.vue

<template>
  <view class="my-component">
    <!-- 默认插槽 -->
    <slot></slot>

    <!-- 具名插槽 -->
    <view class="header">
      <slot name="header">
        <text>默认头部内容</text>
      </slot>
    </view>

    <!-- 作用域插槽 -->
    <view class="content">
      <slot name="content" :item="item">
        <text>默认内容:{{ item.text }}</text>
      </slot>
    </view>

    <view class="footer">
      <slot name="footer">
        <text>默认底部内容</text>
      </slot>
    </view>
  </view>
</template>

<script setup>
import { ref } from 'vue';

const item = ref({
  text: '这是作用域插槽的默认内容'
});
</script>

<style scoped>
.my-component {
  border: 1px solid #ccc;
  padding: 20rpx;
  margin: 20rpx;
  background-color: #f9f9f9;
}

.header, .content, .footer {
  margin: 10rpx 0;
  padding: 10rpx;
  border: 1px dashed #ccc;
}
</style>

使用自定义组件 App.vue

<template>
  <view class="app">
    <MyComponent>
      <!-- 默认插槽内容 -->
      <text>这是默认插槽的内容</text>

      <!-- 具名插槽内容 -->
      <template #header>
        <text>这是头部插槽的内容</text>
      </template>

      <!-- 作用域插槽内容 -->
      <template #content="{ item }">
        <text>这是作用域插槽的内容:{{ item.text }}</text>
      </template>

      <!-- 另一个具名插槽内容 -->
      <template #footer>
        <text>这是底部插槽的内容</text>
      </template>
    </MyComponent>
  </view>
</template>

<script setup>
import MyComponent from './components/MyComponent.vue';
</script>

<style>
.app {
  padding: 20rpx;
  background-color: #fff;
}
</style>

总结

通过上述示例,我们详细介绍了如何在 UniApp 中使用 Vue 3 的 <script setup> 语法糖来创建和使用自定义组件的插槽。具体包括:

  1. 默认插槽:通过 <slot></slot> 定义,默认内容可以直接放置在组件标签内。
  2. 具名插槽:通过 <slot name="xxx"></slot> 定义,使用 #xxxv-slot:xxx 来指定内容。
  3. 作用域插槽:通过 <slot name="xxx" :item="item"></slot> 定义,父组件可以通过解构参数来访问传递的数据。

希望这些示例能帮助你更好地理解和使用 UniApp 和 Vue 3 的插槽功能。


http://www.kler.cn/a/401999.html

相关文章:

  • iOS 18 导航栏插入动画会导致背景短暂变白的解决
  • pytest结合allure做接口自动化
  • 网络基础(3)https和加密
  • web——upload-labs——第十关——.空格.绕过
  • Spark:大数据处理的强大引擎
  • 鸿蒙北向开发环境安装指南
  • 力扣.223 矩形面积 rectangle-area
  • Github 2024-11-19 Python开源项目日报 Top9
  • Ubuntu Linux使用前准备动作 配置SSH
  • SQL 语句基础与实用技巧(DDL DML)
  • CH03_反射
  • 基于信号量与共享内存实现客户与服务器进程通信
  • Efficient One-stage Video Object Detection byExploiting Temporal Consistency
  • 数据结构——AVL树
  • python: generator IDAL and DAL using sql server 2019
  • 时间类的实现
  • 【Flutter 问题系列第 84 篇】如何清除指定网络图片的缓存
  • sql数据库-权限控制-DCL
  • 第二十四章 TCP 客户端 服务器通信 - 当前 TCP 设备
  • 大公司如何实现打印机共享的?如何对打印机进行管控或者工号登录后进行打印?异地打印机共享的如何实现可以帮助用户在不同地理位置使用同一台打印机完成打印任务?
  • 【LeetCode面试150】——49字母异位分词
  • PHP进阶-CentOS7部署LNMP服务架构的项目
  • 【苍穹外卖】学习日志-day1
  • 网络安全常见练习靶场
  • 使用ajax-hook修改http请求响应数据,篡改后再返回给正常的程序
  • 【Docker】快速部署 Pikachu:一个包含常见 Web 安全漏洞的渗透测试练习靶场