ARTICLE · 1224329
【WG-SKILLS】——uniapp【弹窗容器】 base-popup:5 个方向 + 12 类实战场景,自定义弹窗组件一次成型!
大家好,我是【考拉搞AI】,一个专注于 VibeCoding 分享 & AI 工程化 的博主。
兜兜转转,今天我们继续回到uniapp-skill的 迭代上来,因为从最近的 实战来看,最简单的 反而是 最复杂的。
现在是全民VibeCoding的时代,有了好的点子和创意 ,在以前还得花钱找人做,还得各种拉扯,现在很多大佬、小白,都是全盘梭哈了,搞个Codex/Claude/Cursor,或者弄点国产能打的 DeepSeek/Glm,直接进入许愿式编程模式~
一句话甩给workbuddy:我要做一个京东那样的APP,能不能搞?不能搞我去找别人!
workbuddy:能搞,能搞!别说京东了,脸书都能搞!
等了半小时之后,几张崭新的、冒着热气的、花花绿绿的 html 跑了出来,各种商品、购物、下单,丝滑的很~
X:这也太牛了吧~
于是,兴高采烈的 把localhost:3000发送给小伙伴!
可三分钟之后,似乎哪里不对劲?
我怎么下单?我怎么付款?我怎么收钱啊?
一番拉扯之后,才发现:我还需要搞接口、搞服务器、搞测试啊~~~~~
段子归段子,但两个不争的事实 仍然摆在眼前:
AI 疯狂发展,逐渐降低了 开发的门槛,许愿式编程 或许不是 假设
与此同时,
粗制滥造/豆包式人格的Agent 也越来越多,做的东西良莠不齐,想真正做一个 产品,绝非三言两语完事的
所以博主的建议是:
掌握更多的 全栈开发知识(前端 后端 数据库 运维 安全 等等),不求深入 但求全面
规范开发,学会更好的给AI 制定路线,让AI 发挥100%的能量
这也是博主一直坚持做 这些内容的初衷,既是对十年古法经验的总结,也是 让 个人去驾驭AI,而不是彻彻底底让AI主导一切。
殊不知,你 能直接让AI 做到的,意味着,其他小伙伴们 也能让AI 直接做到。
对于个人开发者来说:
好的
点子、创意仍然是第一核心要素驾驭AI 、规范开发 ,提升效率,知道如何更好地让AI 干活,有识别 和 判别的能力,将点子融进AI,掌握更多的知识、准确高效落地
当然咯,做出更优美、高大上更具设计感的页面仍然是必备,毕竟第一印象最重要!
废话不多说。
一、弹窗
base-popup) | ||
maskClosable | ||
safeArea | ||
base-card) |
换句话说:容器只干"外壳"这一件事,内容排版全部甩给 base-card。这就是这套技能一直在强调的容器原则——所有内容型组件都有一套统一的壳。
base-popup 直接把 base-card 装在了自己内部,你写业务的时候根本不用关心"弹窗里的卡片壳子怎么搭"。
二、圆角对齐
uni-app 里弹窗最烦的就是"方向"和"圆角"要自己算。底部弹窗圆角在上面,左侧抽屉圆角在右边,写反一个像素,四个方向就长得不一样。
base-popup 的做法是:方向决定圆角,不用自己写。
bottom | |||
top | |||
left | |||
right | |||
center |
一段定位、一段动画:
/* 位置:4 个方向靠 transform 位移 */.popup-bottom { bottom: 0; left: 0; right: 0; transform: translateY(100%); }.popup-bottom.show { transform: translateY(0); }.popup-left { top: 0; left: 0; bottom: 0; transform: translateX(-100%); }.popup-left.show { transform: translateX(0); }/* 居中:缩放 + 淡入,和滑入是两种气质 */.popup-center {top: 50%;left: 50%;transform: translate(-50%, -50%) scale(0.9);opacity: 0;transition: transform linear, opacity linear;}.popup-center.show {transform: translate(-50%, -50%) scale(1);opacity: 1;}center 这个方向是这一版新加的。原因很实际:居中确认框是 App 里出现频率最高的弹窗,而之前的组件只有 4 个滑入方向,想做一个居中框只能自己另写一个 modal——那就等于把风格统一又打破了一次。
现在它就是 direction="center",一行配置的事。
三、参数大全
弹窗组件最怕参数多。base-popup 一共 11 个 prop,够用且不啰嗦:
showv-model:show | false | ||
direction | 'top''bottom' | 'left' | 'right' | 'center' | 'bottom' | |
radius | '16px' | ||
height | 'auto' | ||
width | '280px' | ||
padding | 'default''sm' | 'none' | 'default' | |
title | '' | ||
mask | true | ||
maskClosable | true | ||
duration | 300 | ||
safeArea | true |
另外 3 个 slot:
header-right | |
footer |
最小可用形态,简单到不像一个组件:
<base-popup v-model:show="show" direction="bottom" title="提示"> <text>这里是弹窗内容</text></base-popup>带底部操作区的完整形态:
<script setup lang="ts">import { ref } from 'vue'import { BasePopup } from '@/components/base'const show = ref(false)</script><template> <base-popup v-model:show="show" direction="bottom" title="选择支付方式" padding="default" > <view class="pay-list"> <view class="pay-item" @click="pay = 'wechat'"> <text>微信支付</text> </view> <view class="pay-item" @click="pay = 'alipay'"> <text>支付宝</text> </view> </view> <template #footer> <button @click="show = false">取消</button> <button type="primary" @click="confirmPay">确认支付</button> </template> </base-popup></template>注意这里没有手写卡片外壳、没有写分割线、没有写头部底部的 padding——全是 base-card 在内部兜住了。
四、实战案例
base-popup 本身只是壳,真正决定它好不好用的是能撑起哪些业务场景。这次我们把常见 App 里的弹窗场景盘了一遍,当前是12个场景。
1. 支付方式选择(bottom)
最经典的结算页弹窗。难点不在弹窗,在状态联动:没选之前"确认支付"是禁用的,选中某一项才亮。
不可用的选项不是隐藏,而是保留位置 + 给出原因(比如"余额不足,需充值 ¥799 后使用")。这点很关键:隐藏会让用户以为系统没这个选项,给原因才是好体验。
2. 加入购物车(bottom)—— 多维规格联动
这个场景最能体现"容器 + 业务组件"的组合思路。颜色 × 尺码两个维度,选一边要把另一边不可能的组合置灰:
关键在于:选中的颜色如果和当前尺码冲突,尺码要主动清空,而不是留一个非法组合在页面上。库存判断逻辑放在场景里,容器只管把这块内容摆出来。
3. 优惠券选择(bottom)—— 可用 / 不可用分组
券列表最容易做成一个只能选一张券的 radio 列表,但真实场景里用户需要**同时看到"还有什么券不能用"**,否则会去别处找。
分组 + 不可用项标注原因("已过期" / "不满足使用条件"),是这个场景的标准解法。
4. 搜索面板(top)—— 历史 + 热词
搜索面板是从顶部下拉的,方向和底部弹窗相反,但容器是同一个:
历史记录要能单条删除,也能一键清空;热词是运营位。两块内容在弹窗里分区排布,靠 base-card 的分割线隔开。
5. 居中确认弹窗(center)—— 危险操作二次确认
删除账号、注销订单这类操作,必须有一个"你确定吗"的居中框。direction="center" 就是为它准备的。
这种弹窗有个硬要求:点遮罩不能关。所以 maskClosable 要显式关掉:
<base-popup v-model:show="showConfirm" direction="center" width="320px" :maskClosable="false"> <view class="dialog-body"> <text class="dialog-title">确认删除账号?</text> <text class="dialog-desc">删除后无法恢复</text> </view> <template #footer> <button @click="showConfirm = false">取消</button> <button type="primary" @click="confirmDelete">删除</button> </template></base-popup>6. 右侧筛选 / 左侧抽屉(right / left)
这两个是老朋友了,但这次把它们放进了同一张"场景速查表"里,方便按场景直接查:
全部案例图:








似乎缺少 时间类选择器,后续补上。
12 类场景速查表
bottom | action-sheet | ||
right | |||
left | |||
top | |||
bottom | picker | ||
bottom | checkbox-group | ||
bottom | |||
bottom | radio-group | ||
bottom | stepper | ||
bottom | coupon | ||
top | search-bar | ||
center |
总结一下
uniapp最大的好处 是 可以同时做小程序 和 APP,一码两用,但同时这也是其劣势,兼容性较差,效率相对其他做APP 的 方式相对较慢
reactNative、flutter 是另外两个不错的构建 APP 的方式,相对来说更稳。
小伙伴们 使用哪种方式开发 APP呢,遇到了何种问题?都可以留言讨论!
博主所有的构想、资源和 学习方案都会放在个人站点里:
https://itlifetime.com
这是一个综合性 的 AI 学习&资源站点~ 也会持续不断更新 更多VibeCoding的内容!
欢迎感兴趣的小伙伴点赞关注+收藏!
【WG-SKILLS】——6套高大上登录页:App金融感、旅居感 + PC科技感、极客感,一套全搞定
【wg-skills】技能大盘点之数据库:AI时代,我为什么推荐 SQLite
一天一个SKILL——数据库选型与设计规范:5 大规范体系+8 个模块技能,告别 AI 乱建表,VibeCoding基座——数据层从此稳如磐石!
一天一个SKILL——uniapp+移动端APP【选择器】13种形态:下拉/弹出/标签/城市/搜索/宫格/分组/级联/树形/异步,样式对齐、主题统一!















































































