微信小程序组件生命周期与接口请求方法详解
一、小程序组件生命周期
微信小程序组件的生命周期指的是组件在不同阶段自动触发的函数,开发者可以利用这些钩子函数在特定时机执行相应操作。小程序组件的生命周期主要分为两类:组件自身生命周期和组件所在页面的生命周期。
1. 组件自身生命周期
主要生命周期函数
生命周期函数 | 触发时机 | 说明 |
---|---|---|
created |
组件实例刚被创建时 | 此时不能调用setData ,适合添加自定义属性字段 |
attached |
组件进入页面节点树时 | this.data 已初始化,适合大多数初始化工作 |
ready |
组件视图层布局完成后 | 可以获取节点信息 |
moved |
组件被移动到节点树另一位置时 | 较少使用 |
detached |
组件从页面节点树移除时 | 适合做清理工作 |
error |
组件方法抛出错误时 | 错误处理 |
生命周期执行顺序
页面进入时:
text
子组件 ———————— created 子组件 ———————— attached 页面 ———————— onLoad 子组件 ———————— pageLifetimes —————— show 页面 ———————— onShow 子组件 ———————— ready 页面 ———————— onReady
页面跳转或退出时:
text
子组件 ———————— pageLifetimes —————— hide 页面 ———————— onHide
页面回退时:
text
子组件 ———————— pageLifetimes —————— show 页面 ———————— onShow ```:cite[5]
生命周期定义方式
推荐在lifetimes
字段内声明生命周期函数(优先级最高):
javascript
Component({ lifetimes: { created() { console.log('组件实例刚被创建'); }, attached() { console.log('组件进入页面节点树'); // 适合在此处发起数据请求 }, detached() { console.log('组件从页面节点树移除'); } } });
2. 组件所在页面的生命周期
组件可以监听所在页面的状态变化,通过pageLifetimes
定义:
生命周期函数 | 触发时机 | 说明 |
---|---|---|
show |
页面被展示时 | 如从后台切回前台 |
hide |
页面被隐藏时 | 如切后台或跳转页面 |
resize |
页面尺寸变化时 | 接收尺寸参数 |
routeDone |
页面路由完成时 | - |
定义示例:
javascript
Component({ pageLifetimes: { show() { console.log('页面展示'); // 可以在此刷新数据 }, hide() { console.log('页面隐藏'); }, resize(size) { console.log('页面尺寸变化', size); } } });
二、小程序接口请求方法设置
1. 基本请求配置
小程序网络请求使用wx.request
API,必须配置HTTPS域名248。
服务器域名配置步骤:
登录小程序管理后台
进入「开发」-「开发设置」-「服务器域名」
配置
request
合法域名
注意事项:
只支持HTTPS协议
不能使用IP地址或localhost(开发时可临时关闭校验)
域名必须经过ICP备案
一个月内最多可修改5次4
基本请求示例
javascript
wx.request({ url: 'https://example.com/api', // 必须为HTTPS method: 'GET', // 或POST、PUT等 data: { // 请求参数 key1: 'value1', key2: 'value2' }, header: { // 请求头 'content-type': 'application/json' }, success(res) { console.log('请求成功', res.data); }, fail(err) { console.error('请求失败', err); }, complete() { console.log('请求完成'); } });
2. 开发环境跳过域名校验
在开发者工具中可临时开启:
点击右上角「详情」
勾选「不校验合法域名、web-view域名、TLS版本及HTTPS证书」
注意:仅限开发调试使用,正式环境必须配置合法域名48
3. 请求封装示例
建议对请求进行统一封装,便于管理和维护:
javascript
// utils/http.js const request = (options) => { return new Promise((resolve, reject) => { wx.request({ url: `https://yourdomain.com${options.url}`, method: options.method || 'GET', data: options.data || {}, header: { 'content-type': 'application/json', 'Authorization': wx.getStorageSync('token') || '' ...options.header }, success(res) { if (res.statusCode === 200) { resolve(res.data); } else { reject(res.data); } }, fail(err) { reject(err); } }); }); }; // GET请求封装 const get = (url, data = {}, options = {}) => { return request({ url, data, method: 'GET', ...options }); }; // POST请求封装 const post = (url, data = {}, options = {}) => { return request({ url, data, method: 'POST', ...options }); }; export default { request, get, post };
4. 组件中发起请求的最佳实践
在组件的attached
或页面生命周期的show
中发起请求:
javascript
Component({ lifetimes: { attached() { this.loadData(); } }, pageLifetimes: { show() { // 页面显示时刷新数据 this.loadData(); } }, methods: { async loadData() { try { const res = await get('/api/data'); this.setData({ list: res.data }); } catch (err) { console.error('加载数据失败', err); } } } });
5. 注意事项
并发限制:
wx.request
、wx.uploadFile
、wx.downloadFile
最大并发限制为10个wx.connectSocket
最大并发限制为5个2
后台运行:
小程序进入后台5秒内未完成的请求会被中断2
数据编码:
建议服务器返回UTF-8编码数据
小程序会自动过滤BOM头2
GET与POST区别:
GET参数在URL中,有长度限制
POST参数在请求体中,适合大数据量传输8
三、综合应用示例
组件生命周期与请求结合示例
javascript
// components/my-component.js Component({ lifetimes: { created() { // 初始化非响应式数据 this.timer = null; }, attached() { // 组件挂载时加载数据 this.fetchData(); // 启动轮询 this.timer = setInterval(() => { this.fetchData(); }, 60000); }, detached() { // 组件卸载时清除定时器 clearInterval(this.timer); } }, pageLifetimes: { show() { // 页面显示时立即刷新数据 this.fetchData(); }, hide() { // 页面隐藏时暂停轮询 clearInterval(this.timer); } }, methods: { async fetchData() { wx.showLoading({ title: '加载中...' }); try { const res = await post('/api/list', { page: this.data.currentPage }); this.setData({ list: res.data.list, total: res.data.total }); } catch (err) { wx.showToast({ title: '加载失败', icon: 'error' }); } finally { wx.hideLoading(); } }, onReachBottom() { // 上拉加载更多 if (this.data.list.length < this.data.total) { this.setData({ currentPage: this.data.currentPage + 1 }, () => { this.fetchData(); }); } } } });
四、常见问题解决方案
请求失败排查步骤:
检查域名是否配置正确
确认域名已HTTPS且ICP备案
开发环境可临时关闭域名校验
检查网络连接是否正常
查看服务器日志定位问题46
组件生命周期不触发:
确保使用Component构造器
检查基础库版本是否支持
确认组件在页面节点树中17
数据更新不及时:
在
pageLifetimes.show
中刷新数据使用事件总线或全局状态管理通知更新59
跨域问题:
小程序不存在浏览器跨域问题
只需配置合法域名即可68
通过合理利用组件生命周期和网络请求API,可以构建出高效、可靠的小程序应用。建议在开发过程中遵循最佳实践,如封装请求方法、合理选择生命周期钩子等,以提高代码质量和维护性。