更新记录
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 且屏蔽关闭,用于异步等待。

收藏人数:
下载插件并导入HBuilderX
赞赏(0)
下载 179
赞赏 0
下载 12672087
赞赏 1955
赞赏
京公网安备:11010802035340号