
文章分类:新闻资讯 发布时间:2026-09-12 原文作者:小程序开发 阅读( )

拿到这个标题,估计不少人心里犯嘀咕:菜单开发?不就是往页面上堆几个按钮吗?还真不是。我见过太多团队,功能做得挺复杂,结果卡在菜单交互上,用户点两下就懵了。菜单这东西,表面上是个导航工具,实际上是你整个小程序的信息架构。它决定了用户能不能在三秒钟之内搞清楚“这地方是干嘛的”,也决定了你的核心功能到底能不能被点到。所以咱别小看这个活儿,今天就从一个空白的开发者工具界面开始,一步步给你拆解清楚,到底怎么把一套真正能用的菜单给搭起来。
第一步,先把项目骨架搭好。打开微信开发者工具,新建一个项目,选“小程序”而不是“小游戏”,这个别搞错。AppID用测试号就行,不用急着注册。项目建好之后你会看到一堆默认文件,别慌,大部分都得删掉或者改掉。核心要留的是app.json、app.js、app.wxss,还有pages目录。app.json是全局配置,你的菜单逻辑很大程度上就写在这里。比如你要做一个底部TabBar菜单,直接在app.json里配一个tabBar字段,写上list数组,每个对象对应一个页面路径和图标文字。这一招对大多数工具类小程序够用了,但如果你想要的是那种顶部横向滑动、或者侧边抽屉式的菜单,那光靠原生配置就不行了,得用组件自己画。
这时候你可能会问,到底选哪种菜单形态才合适?我给你的建议是,看你的内容层级。如果你的业务就三四个一级分类,底部TabBar是最稳的,用户上手零成本,因为整个微信生态都这么玩。但如果你是个资讯类或者电商类的小程序,分类特别多,比如生鲜电商,光蔬菜就能分成叶菜、根茎、菌菇,那底部TabBar根本放不下。这时候你需要的是顶部分类标签加左侧二级菜单的组合。这种结构在“美团外卖”和“京东到家”里特别常见,左边是品类栏,右边是具体商品列表,用户左点右滑,效率极高。这种菜单就得靠scroll-view加自定义样式来实现,没法走捷径。
我拿一个实战案例给你拆解一下。假设咱们要做的是一个社区团购小程序,菜单结构是“首页、分类、购物车、我的”四个底部Tab,其中“分类”页面里,左侧是“蔬菜、水果、肉禽、海鲜、零食”五个一级分类,右侧对应显示每个分类下的子类。先改app.json,把tabBar配上,选中态和未选中态的图标得准备两份,这个细节别偷懒,不然用户根本不知道自己点到了哪里。然后新建一个category页面,在它的wxml里,左侧用一个scroll-view,高度设成100vh减去底部导航栏的高度,右侧再套一个scroll-view,两个都开启纵向滚动。左边每一项绑定一个点击事件,点击的时候切换当前选中的分类索引,右边根据索引去渲染对应的数据。数据源你可以先写死一个数组,后面再对接接口。
光有结构还不够,交互细节才是菜单的灵魂。你想想,用户手指头在屏幕上划拉,左边点一下,右边要立刻跳转到对应分类的顶部,这个体验如果做得顺滑,用户就会觉得“这小程序挺高级”。怎么实现?在右边的scroll-view上绑定一个scroll-top属性,每次左边切换分类的时候,把这个值设成0,右边就回到顶部了。还有个坑,左边菜单的选中态如果只是换文字颜色,视觉上会显得特别飘。最好是加个背景色变化,再加一条左侧的指示条,用绝对定位画一个宽度4像素的圆角矩形,通过绑定样式动态改变它的top值,这样选中项就非常明显了。这招是我从好几个成熟项目里总结出来的,效果立竿见影。
接下来你得处理数据联动的问题。菜单不是摆设,它得驱动内容。在Vue或者React里,你习惯了响应式数据流,在小程序里其实也类似。在data里声明一个activeCategory,默认值是0。左边菜单的每一项都绑定data-index,点击的时候通过e.currentTarget.dataset.index拿到索引,setData更新activeCategory。右边的内容区域,用wx:for遍历分类列表,每一项用wx:if判断一下当前索引是否等于activeCategory,等于就显示。这里有个性能上的小建议:如果你的分类特别多,右边内容又很重,就别一次性把所有分类都渲染出来,改成只渲染当前激活的分类加前后一个分类,滑动的时候再动态切换,这样页面不会卡。小程序对DOM数量是有性能红线的,超过一定量级,真机上的表现会很难看。
菜单开发还有个容易忽略的点:状态保持。用户点开分类页,翻了半天,看到某个商品感兴趣,点进去看详情,然后返回,这时候菜单应该回到他刚才的位置,而不是重置回第一项。这个逻辑得靠页面的onShow生命周期来配合。你可以把activeCategory存到globalData里,或者用storage缓存起来,每次进入页面的时候先读取,再setData。另外,如果小程序有分享功能,用户从分享卡片点进来,可能直接落到某个分类下,这时候你还要在onLoad里解析一下分享参数,把菜单状态设置到对应位置。这些细节虽然不起眼,但就是它们决定了你的菜单是“能用”还是“好用”。
再提醒一个很多人会踩的坑:自定义导航栏。如果你做了沉浸式状态栏,也就是把navigationStyle设成custom,那你的菜单顶部就得自己预留状态栏高度。这个高度不是硬编码的,得通过wx.getSystemInfoSync拿到statusBarHeight,然后动态设置padding-top。不然的话,iPhone 14 Pro Max和iPhone SE的显示效果会差出天际。另外,菜单里的字体大小、图标尺寸,建议用rpx单位,自适应不同屏幕宽度。但要注意,rpx不是万能的,如果你做的菜单里包含Canvas或者视频组件,这些是原生组件,层级最高,会盖住你的菜单,这时候得用cover-view来包菜单,才能保证它浮在最上面。
接着得聊聊测试。菜单这东西,看着简单,但它的状态组合特别多,比如快速点击、滑动中断、切换分类时数据还没加载完、底部Tab切换时页面状态被销毁重建。每一条都值得你写个测试用例。真机调试的时候,专门拿一台低端安卓机和一台老款iPhone去跑,看看有没有掉帧、白屏、点击无响应的情况。我见过太多开发者在开发者工具里跑得飞快,一到真机就拉胯,就是因为没考虑性能边界。菜单是用户操作最密集的区域,它的流畅度直接决定用户对你整个小程序的第一印象,这个环节投入再多时间都不亏。
菜单的功夫在菜单之外。你花一晚上把布局调好了,把交互做顺了,以为大功告成,其实才完成了一半。真正考验你的是:菜单结构跟业务逻辑是不是真的匹配?用户能不能顺着你的菜单找到他想要的东西?你加了那么多分类,是不是反而增加了选择成本?所以别急着堆功能,先把菜单当成一个产品去设计,你才会发现,这活儿一点都不简单。但一旦你把它做透了,你的小程序就赢在了起跑线上。