电话咨询
QQ咨询
微信咨询
返回顶部

微信小程序开发30讲:从0到1掌握10个核心API与5个实战项目

微信小程序开发,听起来像是个技术活,但别被“代码”两个字吓到。今天咱们就聊聊从零开始搭建一个小程序的完整思路,不是那种复制粘贴官方文档的教程,而是真正能让你理解“为什么这么做”的实战讲解。

先解决一个常见困惑:觉得小程序就是“手机上的网页”,其实大错特错。小程序的核心是“轻量级原生应用”,它有自己的渲染引擎和逻辑层,和浏览器里的网页完全是两码事。举个例子,你在浏览器里打开一个网页,如果网络断了,页面直接白屏;但小程序如果提前缓存了数据,就算断网也能展示部分内容。这就是原生和网页的本质区别。

开始写代码前,先搞定环境。去微信公众平台注册一个账号,注意选“小程序”而不是“公众号”。下载开发者工具时,你会看到三个版本:稳定版、预发布版、开发版。别纠结,直接选稳定版,除非你想当小白鼠。安装后打开,你会发现界面分三块:模拟器、编辑器、调试器。模拟器默认是iPhone 6的尺寸,但你要知道,实际用户用的可能是折叠屏、平板甚至车机,所以测试时记得切换设备类型。

新建项目时,有个坑踩:AppID填错了。如果你只是测试,可以用“测试号”,但真机预览、发布上线必须用真实AppID。填完AppID后,选择“不使用云开发”还是“使用云开发”?我的建议是:初期别碰云开发。云开发确实方便,但会把你锁死在微信生态里,以后想迁移后端很麻烦。自己搭个简单的Node.js服务器,或者用Firebase、Supabase都行,自由度更高。

项目创建后,你会看到四个核心文件:app.jsapp.jsonapp.wxsspages文件夹。一上来就写页面,忽略了app.json。这个文件是小程序的“总开关”,里面定义了什么页面存在、窗口样式、tabBar等等。举个例子,你想让小程序顶部标题栏变成蓝色,就在window字段里加"navigationBarBackgroundColor": "#1c487f"。但注意,这个颜色是全局的,如果某个页面想单独改颜色,得在页面的.json里覆盖。

写页面时,WXML(类似HTML)和WXSS(类似CSS)是基础。但有个关键区别:WXML里不能用div,只能用viewtextimage这些标签。而且WXSS的单位是rpx,不是px。为什么?因为不同手机屏幕宽度不同,rpx会根据屏幕宽度自动缩放。比如iPhone 6是375px宽,等于750rpx;而iPhone 12 Pro是390px宽,还是750rpx。所以设计稿如果是750px宽,你直接写width: 375rpx,在所有手机上都是屏幕一半宽。

数据绑定是微信小程序的灵魂。在WXML里写{{message}},然后在JS的data里定义message: "你好",页面就会显示“你好”。但注意,如果你在JS里直接写this.data.message = "改了",页面不会变。必须用this.setData({ message: "改了" })。为什么这么麻烦?因为setData会触发视图层重新渲染,而直接赋值只是改了内存里的数据。这就像你往冰箱里放了菜,但没告诉厨师,厨师当然不会做菜。

事件绑定也容易搞混。比如你想点击按钮弹出提示,在WXML里写bindtap="handleClick",然后在JS里定义handleClick() { wx.showToast({ title: '点击了' }) }。但注意,bindtapcatchtap的区别:bindtap会冒泡(子元素点击后父元素也触发),catchtap阻止冒泡。实际开发中,如果你有一个列表,每个列表项里有个删除按钮,点击删除按钮时不想触发列表项的点击事件,就用catchtap

说到列表渲染,wx:for是必用的。比如你有一个数组items: ["苹果", "香蕉", "橘子"],在WXML里写{{item}},就会显示三个view。但这里有个性能问题:如果列表很长(比如1000条),每次数据变化都重新渲染整个列表,会很卡。解决方案是使用wx:key,比如wx:key="id",这样小程序只会更新变化的那一项。就像你有一排灯泡,只换坏的那个,而不是全部换掉。

页面跳转是另一个高频场景。小程序有五种跳转方式:wx.navigateTowx.redirectTowx.switchTabwx.reLaunchwx.navigateBack。分不清,我举个例子:你在首页点“详情”,用navigateTo,因为用户可能还想返回首页;在登录页点“登录成功”,用redirectTo跳转到主页,因为登录页不需要保留;底部导航栏的切换用switchTabreLaunch会关闭所有页面,打开新页面,适合退出登录时用。记住一个原则:能返回的用navigateTo,不能返回的用redirectTo

生命周期函数也是新手容易懵的地方。每个页面有onLoadonShowonReadyonHideonUnload。区别在哪?onLoad只执行一次,页面创建时触发;onShow每次页面显示都触发,包括从后台切回来。比如你有个计数器,想在用户每次看到页面时重置,就写在onShow里。而onReady在页面初次渲染完成时触发,适合做动画。曾经有个项目,用户反馈数据刷新不及时,排查发现代码写在了onLoad而不是onShow里,导致从其他页面返回时没刷新。

谈到数据存储,wx.setStorageSyncwx.getStorageSync是同步方法,但注意:同步方法会阻塞后续代码。如果存储的数据很大(比如用户头像base64),就不要用同步,改用异步的wx.setStoragewx.getStorage。另外,小程序本地存储上限是10MB,别把整个数据库存进去。我见过有人把100MB的日志存本地,结果小程序直接闪退。

网络请求这块,wx.request是核心。但有个坑:必须配置合法域名。开发阶段可以在开发者工具里勾选“不校验合法域名”,但上线前必须在微信公众平台配置。而且wx.request默认超时时间是60秒,如果接口慢,建议手动设置timeout。另外,wx.request不支持同步请求,如果你需要先拿到数据再执行下一步,可以用async/await包裹。比如:

async getData() { const res = await wx.request({ url: '...' }); this.setData({ list: res.data }) }

组件化开发是提升效率的关键。小程序提供了Component构造器,可以自定义组件。比如你做一个“加载中”的动画组件,在多个页面复用。注意,组件的样式默认是隔离的,父组件的样式不会影响子组件。如果想穿透,可以用addGlobalClass: true。还有个技巧:组件间通信。父组件传值给子组件用properties,子组件通知父组件用triggerEvent。比如一个“删除”按钮组件,点击后触发this.triggerEvent('delete', { id: 1 }),父组件监听bind:delete事件。

真机调试是最后一步。模拟器跑得好好的,一上真机就出问题。常见原因:模拟器用的是PC的算力,真机是手机芯片。比如复杂的动画在模拟器流畅,在低端手机上卡成PPT。解决办法:减少setData频率,把多次setData合并成一次;避免在onScroll里做复杂计算。另一个坑:wx.getSystemInfoSync获取的设备信息在模拟器和真机上可能不同,比如状态栏高度,真机上有刘海屏、打孔屏,模拟器没有。所以实际开发中,最好在onLaunch里获取一次真实设备信息,存到全局变量里。

扩展一个话题:分包加载。如果你的小程序超过2MB,就必须分包。比如电商小程序,首页、商品列表、购物车、个人中心,每个模块超过500KB,就可以把每个模块做成一个分包。用户在访问首页时,只下载首页分包,其他分包按需加载。这样首屏加载速度能提升50%以上。配置方法很简单,在app.json里加subPackages字段,指定每个分包的根目录和页面路径。

最后聊个容易被忽略的点:小程序的更新机制。用户打开小程序时,会检查是否有新版本。如果有,会异步下载新版本,但用户当前用的还是旧版本。下次冷启动(杀掉进程再打开)才会用新版本。如果你想强制用户更新,可以在onLaunch里调用wx.getUpdateManager,监听到新版本后弹窗提示“更新已下载,请重启应用”,然后调用applyUpdate。但注意,别频繁弹窗,否则用户会反感。

说了这么多,其实小程序的精髓在于“快”和“轻”。不要想着把所有功能都塞进去,而是思考用户最需要什么。比如一个天气小程序,核心功能就是显示温度、湿度、风力,别加什么社交、商城、游戏。少即是多,在小程序开发里尤其适用。

上一篇
iPhone SE用户狂吐槽:小程序按钮小到手指戳酸了都点不到!
下一篇
bootstrap开发cms模板是什么,bootstrap cms模板