[小程序初始化]
|
V
[onLaunch]
|
V
[onShow] (循环,当小程序显示时触发)
| |
|<----|
V
[onHide] (当小程序隐藏时触发)
|
V
[onError] (发生错误时触发)
onLoad:页面加载时触发。一个页面只会调用一次,可以在 onLoad 的参数中获取打开当前页面路径中的参数。
onShow:页面显示/切入前台时触发。
onReady:页面初次渲染完成时触发。一个页面只会调用一次,代表页面已经准备妥当,可以和视图层进行交互。对界面的设置如 wx:if 等请在此函数中进行,否则可能出现设置无效的情况。
onHide:页面隐藏/切入后台时触发。如 navigateTo 或底部 tab 切换到其他页面,小程序切入后台等。
onUnload:页面卸载时触发。如 redirectTo 或 navigateBack 的其他页面。
此外,还有一些与页面滚动相关的事件:
onPullDownRefresh:监听用户下拉动作,一般用于实现下拉刷新功能。
onReachBottom:页面上拉触底事件的处理函数。
onShareAppMessage:用户点击右上角转发时触发。
[页面加载]
|
V
[onLoad] (页面加载时触发,只触发一次)
|
V
[onShow] (页面显示时触发,每次显示都会触发)
|
V
[onReady] (页面初次渲染完成时触发,只触发一次)
|
V
[页面与用户交互]
|
V
[onHide] (页面隐藏时触发)
|
V
[onUnload] (页面卸载时触发)
^ |
| |
|<----|
|
V
[onPullDownRefresh] (用户下拉刷新时触发)
|
V
[onReachBottom] (页面上拉触底时触发)
[开始]
|
V
[用户触发登录]
|
V
[小程序前端调用 wx.login()]
|
V
[微信服务器返回 code]
|
V
[小程序前端将 code 发送到开发者服务器]
|
V
[开发者服务器请求微信服务器验证 code]
|
V
[微信服务器验证 code 并返回 openid, session_key]
|
V
[开发者服务器处理用户信息并生成登录态]
|
V
[开发者服务器将登录态返回给小程序前端]
|
V
[小程序前端存储登录态]
|
V
[小程序前端完成登录]
|
V
[可选:获取用户更多信息]
|
V
[可选:手机号授权]
|
V
[结束]
| 函数名 | 跳转方式 | 特性 |
|---|---|---|
| wx.navigateTo | 保留当前页面并跳转 | 保留当前页面,最多可保留10个页面在栈中 |
| wx.redirectTo | 关闭当前页面并跳转 | 关闭当前页面,跳转到应用内某个页面,不允许跳转到tabBar页面 |
| wx.switchTab | 跳转到tabBar页面 | 跳转到tabBar页面,并关闭其他所有非tabBar页面 |
| wx.navigateBack | 关闭当前页面并返回上一级或多级 | 关闭当前页面,返回上一页面或多级页面 |
| wx.reLaunch | 关闭所有页面并重新打开 | 关闭所有页面,打开到应用内的某个页面 |
| WXML | HTML | |
|---|---|---|
| 用途 | 微信小程序中用于构建页面结构的标记语言 | 用于构建网页的标记语言 |
| 平台限制 | 专为微信小程序设计,主要在微信客户端上运行 | 可在各种Web浏览器上运行 |
| 语法结构 | 类似于HTML,但更简洁,使用尖括号包裹标签,尾部斜杠闭合 | 使用尖括号包裹标签,尾部斜杠或双标签闭合 |
| 标签特点 | 为微信小程序定制,包括view、text、image等 | 广泛的标签集合,如div、p、span、img、a等 |
| 样式表 | 使用WXSS | 使用CSS |
| 布局方式 | 支持flex布局、grid布局等 | 支持盒模型、浮动、定位等 |
| 数据绑定 | 支持数据绑定功能,如{{ }}和wx:if等 | 无内置数据绑定功能,但可通过JavaScript或前端框架实现 |
| DOM树与window对象 | 无DOM树和window对象 | 有DOM树和window对象 |
| 组件与扩展性 | 组件进行了重新封装,可通过自定义组件扩展 | 丰富的组件和广泛的生态系统 |
| 兼容性 | 在微信小程序平台上具有良好的兼容性 | 在各种Web浏览器上具有良好的兼容性 |
| 预览与调试 | 只能在微信小程序开发工具中预览和调试 | 可在浏览器内预览和调试 |
| WXSS | CSS | |
|---|---|---|
| 用途 | 微信小程序中用于描述页面样式的语言 | 用于描述HTML或XML等文件样式的计算机语言 |
| 语法结构 | 大部分与CSS相似,但有一些特定的扩展和限制 | 标准的样式表语法 |
| 选择器 | 支持特定的选择器,如.class、#id、element等,但不支持某些高级选择器,如属性选择器[attribute] | 支持丰富的选择器,包括元素选择器、类选择器、ID选择器、属性选择器等 |
| 尺寸单位 | 引入新的尺寸单位rpx(responsive pixel),可自适应屏幕宽度 | 使用传统的像素(px)、百分比(%)、em、rem等单位 |
| 样式特性 | 专注于微信小程序的特性,如rpx单位的自适应 | 通用性强,适用于各种Web页面 |
| 响应式设计 | 通过rpx单位支持响应式设计 | 通过媒体查询等方式支持响应式设计 |
| 应用平台 | 主要在微信小程序中使用 | 广泛应用于各种Web页面 |
| 与HTML/WXML的关系 | 与WXML配合,用于描述微信小程序页面的样式 | 与HTML配合,用于描述网页的样式 |
| 继承与层叠 | 与CSS类似,支持样式的继承和层叠 | 完整的继承和层叠机制 |
| 动画与过渡 | 支持动画和过渡效果,但具体实现可能与CSS略有不同 | 丰富的动画和过渡效果支持 |
| 调试工具 | 使用微信小程序开发者工具进行调试 | 可在浏览器开发者工具中调试 |
封装请求函数
// utils/request.js
function request(url, method = 'GET', data = {}, header = {}) {
return new Promise((resolve, reject) => {
wx.request({
url: url,
method: method.toUpperCase(),
data: method === 'GET' ? {} : data, // 根据请求方法决定是否发送 data
header: {
'content-type': 'application/json', // 默认为 JSON 数据
...header,
},
success(res) {
if (res.statusCode === 200) {
resolve(res.data);
} else {
reject(res);
}
},
fail(err) {
reject(err);
},
});
});
}
module.exports = {
request,
};
在页面或其他地方使用封装的请求
// pages/somePage/somePage.js
const { request } = require('../../utils/request');
Page({
onLoad: function () {
request('https://api.example.com/data', 'GET')
.then((res) => {
console.log('请求成功', res);
// 处理成功逻辑
})
.catch((err) => {
console.error('请求失败', err);
// 处理失败逻辑
});
},
// ... 其他页面逻辑
});
假设我们有一个全局的用户信息,需要在多个页面中使用,如用户名、头像等。
app.js
App({
globalData: {
userInfo: null // 初始化为null,后续可以通过登录等操作设置值
}
});
xxx.js
const app = getApp();
// 设置全局变量
app.globalData.userInfo = {name: '张三', avatarUrl: 'http://example.com/avatar.jpg'};
// 获取全局变量
console.log(app.globalData.userInfo);
假设我们有一个商品列表页面(pages/productList/productList),当用户点击某个商品时,我们想要跳转到商品详情页面(pages/productDetail/productDetail)并传递商品ID。
productList.js
wx.navigateTo({
url: `/pages/productDetail/productDetail?productId=${productId}` // 假设productId是用户点击商品的ID
});
productDetail.js
Page({
onLoad: function (options) {
// options中包含了从URL中解析出的参数
const productId = options.productId;
// 使用productId进行后续操作,如请求商品详情数据等
}
});
用户登录后,我们想要将登录凭证(如token)存储在缓存中,以便在后续请求中使用。
登录成功页面(loginSuccess.js)
wx.setStorageSync('token', loginToken); // 假设loginToken是登录成功后获取的token
需要token的页面(xxx.js)
const token = wx.getStorageSync('token');
// 使用token进行后续请求或其他操作
A页面打开一个B页面,并希望在B页面打开后立即传递一些数据给B页面。
A.js
wx.navigateTo({
url: '/pages/B/B',
success: function (res) {
// 通过eventChannel向B页面发送数据
const eventChannel = res.eventChannel;
eventChannel.emit('acceptDataFromA', { data: '这是A页面传递的数据' });
}
});
B.js
Page({
onLoad: function (options) {
// 监听A页面通过eventChannel发送的数据
const eventChannel = this.getOpenerEventChannel();
eventChannel.on('acceptDataFromA', function (data) {
console.log(data); // 输出:{ data: '这是A页面传递的数据' }
});
}
});
大体相同,但小程序直接this.data的属性是不可以同步到视图的,必须调用this.setData()方法!
| 小程序双向绑定 | Vue双向绑定 | |
|---|---|---|
| 实现方式 | 通过WXML模板和JS脚本实现,需要手动调用setData()更新数据 | 通过模板引擎和响应式数据等机制实现,数据变化自动触发视图更新 |
| 数据绑定方式 | 单向绑定,从数据到视图 | 双向绑定,支持从视图到数据和从数据到视图的自动同步 |
| 视图渲染 | 基于组件的渲染,需要手动编写组件模板和逻辑 | 基于组件的渲染,提供丰富的组件选项和生命周期钩子函数 |
| 开发效率 | 相对较低,需要手动处理数据更新和视图渲染 | 相对较高,数据变化自动触发视图更新,减少手动操作 |
<view>
<input name="username" bindinput="handleInput" placeholder="请输入用户名" />
<view>输入的用户名是:{{username}}</view>
</view>
Page({
data: {
username: ''
},
handleInput: function(e) {
this.setData({
username: e.detail.value
});
}
});
<div id="app">
<input v-model="message" placeholder="请输入信息">
<p>输入的信息是:{{ message }}</p>
</div>
new Vue({
el: '#app',
data: {
message: ''
}
});