更新记录

1.0.0(2026-10-12) 下载此版本

  • 初始版本,按 u-ui 目标标准(vant-* Vue3 TS + 独立 props.ts/scss + $uni-* 令牌)从零封装。
  • 对齐 Vant 4 Popup API:v-model:show、position、overlay、duration、round、closeable + 关闭图标位置、close-on-click-overlay、safe-area-inset-bottom、overlay-class/overlay-style、z-index。
  • 事件:update:show / open / close / click-overlay / opened / closed。
  • 插槽:default(内容)、overlay(自定义遮罩)。
  • 交互态:disabled(禁用不渲染交互)、loading(加载态 + 屏蔽关闭)。
  • 关闭图标与加载 spinner 均为纯 CSS 绘制,零三方依赖。
  • 迁移自遗留 uni-app x 风格空脚手架(vant-popup.vue 原为空模板)。

平台兼容性

uni-app(3.8.5)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- √ √ √ √ √ √ √ √
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
√ √ √ √ √ √ √ √ √ √ √ √

uni-app x(3.8.5)

Chrome Safari Android iOS 鸿蒙 微信小程序
- - - - - -

其他

多语言 暗黑模式 宽屏模式 蒸汽模式
× × √ ×

vant-popup 弹出层

在页面上方弹出的浮层容器,用于菜单、弹窗、信息提示等场景。基于 Vant 4 Popup API 封装,零业务耦合、数据驱动。

引入

<vant-popup /> 经 easycom 自动注册,无需 import。如需显式引入:

import vantPopup from 'uni_modules/vant-popup/components/vant-popup/vant-popup.vue'

代码演示

基础用法

通过 v-model:show 控制显隐,默认从中心弹出。

<template>
  <vant-button text="打开弹出层" @click="show = true" />
  <vant-popup v-model:show="show">
    <view style="padding: 60rpx;">我是弹出层内容</view>
  </vant-popup>
</template>

<script setup lang="ts">
import { ref } from 'vue'
const show = ref(false)
</script>

弹出位置

通过 position 指定弹出方向:top / bottom / left / right / center。

<vant-popup v-model:show="show" position="bottom" :round="true">
  <view style="height: 400rpx; padding: 32rpx;">底部弹出 + 圆角</view>
</vant-popup>

关闭图标

设置 closeable 显示关闭按钮,close-icon-position 控制位置。

<vant-popup
  v-model:show="show"
  position="bottom"
  :round="true"
  :closeable="true"
  close-icon-position="top-right"
>
  <view style="padding: 32rpx;">带关闭图标的弹层</view>
</vant-popup>

禁用遮罩关闭 / 自定义遮罩

<!-- 点击遮罩不关闭 -->
<vant-popup v-model:show="show" :close-on-click-overlay="false" :closeable="true" />

<!-- 自定义遮罩内容(通过 #overlay 插槽) -->
<vant-popup v-model:show="show">
  <template #overlay>
    <view class="my-overlay-mask" />
  </template>
  <view style="padding: 32rpx;">自定义遮罩</view>
</vant-popup>

禁用与加载态

disabled 时弹层不响应(即便 show=true 也不渲染交互);loading 时展示 loading 并屏蔽关闭。

<vant-popup v-model:show="show" :disabled="true" />
<vant-popup v-model:show="show" :loading="true" />

API

Props

参数 说明 类型 默认值
show 是否显示弹出层(支持 v-model:show) boolean false
position 弹出位置 'top' \| 'bottom' \| 'left' \| 'right' \| 'center' 'center'
overlay 是否显示遮罩层 boolean true
duration 动画时长(ms,传 0 关闭动画) number | string 300
round 是否显示圆角(作用于弹出侧顶角) boolean false
closeable 是否显示关闭图标 boolean false
close-icon 关闭图标名称(留空用内置 CSS 关闭图标) string ''
close-icon-position 关闭图标位置 'top-left' \| 'top-right' \| 'bottom-left' \| 'bottom-right' 'top-right'
lock-scroll 是否锁定背景滚动 boolean true
close-on-click-overlay 是否在点击遮罩后关闭 boolean true
safe-area-inset-bottom 是否开启底部安全区适配 boolean false
overlay-class 自定义遮罩层类名 string ''
overlay-style 自定义遮罩层内联样式 string ''
z-index 弹出层 z-index number | string 2000
disabled 是否禁用(禁用时不渲染交互) boolean false
loading 是否加载状态(展示 loading 并屏蔽关闭) boolean false

Events

事件名 说明 回调参数
update:show 显示状态变化(用于 v-model:show 双向绑定) (value: boolean)
open 打开弹出层时触发 —
close 关闭弹出层时触发 —
click-overlay 点击遮罩层时触发 —
opened 打开动画结束后触发 —
closed 关闭动画结束后触发 —

Slots

名称 说明
default 弹出层内容
overlay 自定义遮罩层内容

主题定制

通过覆盖宿主 uni.scss 的 $uni-* 令牌调整外观:

  • $uni-bg-color-mask:遮罩背景色
  • $uni-bg-color:弹出层背景色
  • $uni-color-primary:加载态 spinner 主色
  • $uni-text-color-grey:关闭图标颜色

弹出层圆角:在 vant-popup.scss 内定义为组件常量 $popup-radius,值为官方 $uni-border-radius-lg 的两倍($uni-border-radius-lg * 2)。如需调整,直接改该常量即可,无需动宿主令牌。

常见问题

  • Q:position 为 top/bottom 时 round 圆角在哪? A:圆角作用于「弹出侧」的顶角(top 在底部两角、bottom 在顶部两角,依此类推),符合 Vant 视觉习惯。
  • Q:小程序里背景还能滚动吗? A:弹层打开时遮罩与内容层均拦截 touchmove(@touchmove.stop.prevent),默认锁定背景滚动;不需要可设 :lock-scroll="false"(交互层仍拦截,仅语义保留)。
  • Q:disabled 与 loading 的区别? A:disabled 让弹层整体不渲染交互(常用于权限/条件未满足);loading 仍显示弹层但展示 loading 且屏蔽关闭,用于异步等待。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

无

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

无

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

许可协议

MIT协议

暂无用户评论。