1初识微信小程序
1.1什么是小程序
1.2 注册微信小程序账号
1.2.1 前置条件
一个邮箱只能开发一个小程序,一个人或者一个实体可以根据其身份类型申请多个小程序。例如,个人身份最多可以注册5个小程序,而企业、政府、媒体或其他组织类型的主体则最多可以注册50个小程序。但是,这些小程序需要使用不同的邮箱进行注册。
1.2.2完善信息
1.2.3项目成员与体验成员
个人开发者,只能添加15个项目成员和15个体验成员,企业则可以添加90个项目成员和90个体验成员。
1.2.4 小程序开发者ID
1.2.5微信小程序开发者工具
2小程序项目
2.1创建小程序项目
2.2项目结构
主体文件
页面文件
2.3新建页面
方法一:点击pages,右键--->新建文件夹--->新建page
方法二:
2.4调试微信小程序
3 微信小程序配置文件
3.1 app.json
配置tabBar字段
3.2页面配置
3.3配置sass
会影响最终编译的都保存在project.config.json中
3.4sitemap.json
4 小程序的样式和组件介绍
1. 基础布局标签
微信小程序标签 | HTML 标签 | 说明 |
---|---|---|
view | div | 基础容器,用于布局和包裹内容。支持 Flex 布局,默认块级元素。 |
scroll-view | div + CSS 滚动 | 可滚动视图容器,需设置 scroll-x 或 scroll-y 属性。 |
swiper | div + JS 轮播库 | 轮播图容器,内置滑动切换功能(如 <swiper-item> 子项)。 |
2. 文本与富文本
微信小程序标签 | HTML 标签 | 说明 |
---|---|---|
text | span | 行内文本容器,支持长按复制、空格解析(space 属性)。 |
rich-text | div + 富文本解析 | 渲染富文本(如 HTML 字符串),通过 nodes 属性传入。 |
3. 媒体组件
微信小程序标签 | HTML 标签 | 说明 |
---|---|---|
image | img | 图片组件,必须指定 src ,支持懒加载(lazy-load )。 |
video | video | 视频播放器,提供全屏、弹幕等扩展功能。 |
audio | audio | 音频播放器,需通过 API 控制播放。 |
4. 表单组件
微信小程序标签 | HTML 标签 | 说明 |
---|---|---|
form | form | 表单容器,提交时通过 bindsubmit 事件获取数据。 |
input | input | 输入框,类型通过 type 设置(如 text , number , idcard 等)。 |
textarea | textarea | 多行输入框,支持自动增高(auto-height )。 |
button | button | 按钮,支持开放能力(如 open-type="getUserInfo" 获取用户信息)。 |
checkbox | input[type=checkbox] | 复选框,需包裹在 checkbox-group 中。 |
5. 导航与路由
微信小程序标签 | HTML 标签 | 说明 |
---|---|---|
navigator | a | 页面跳转链接,通过 url 指定目标页,支持后退(open-type="navigateBack" )。 |
6. 列表与交互
微信小程序标签 | HTML 标签 | 说明 |
---|---|---|
list | ul /ol | 列表容器,需结合 wx:for 循环渲染(类似 v-for 或 map )。 |
swipe-cell | 自定义实现 | 侧滑删除组件(需注意平台兼容性)。 |
7. 其他功能组件
微信小程序标签 | HTML 标签 | 说明 |
---|---|---|
map | 第三方地图库 | 地图组件,支持标记点、路线规划等(依赖微信 API)。 |
canvas | canvas | 画布,需通过 wx.createCanvasContext 操作。 |
8关键差异与注意事项
-
事件绑定
-
小程序使用
bindtap
(点击事件)、bindinput
(输入事件)等,类似 HTML 的onclick
、oninput
。 -
事件对象参数通过
event.detail
传递,而非 HTML 的默认事件对象。
-
-
样式与类名
-
小程序使用
class
和style
属性,但样式文件为.wxss
(支持部分 CSS3)。 -
样式作用域默认局部(可通过
@import
引入全局样式)。
-
-
组件化设计
-
小程序标签是封装的组件(如
scroll-view
自带滚动逻辑),而 HTML 标签更基础。 -
部分功能需通过小程序原生组件实现(如相机
camera
、实时音视频live-pusher
)。
-
-
平台限制
-
小程序禁用部分 HTML 标签(如
iframe
、script
),需使用 API 或组件替代。
-
5 px、rpx、rem、vw
rpx(Responsive Pixel) 是微信小程序中用于适配不同屏幕尺寸的动态单位,具有以下核心特点:
1. 核心原理
-
以屏幕宽度为基准:1rpx = 屏幕宽度的 1/750。
例如:在 iPhone6(屏幕宽度 375px)中,1rpx = 0.5px;在更宽的设备上会自动等比放大。
2. 设计优势
-
设计师友好:直接按 750rpx 宽度的设计稿标注尺寸,开发时无需复杂换算。
-
自动适配:元素大小随屏幕宽度动态调整,保证不同设备上的显示一致性。
3. 与其他单位的对比
单位 | 基准 | 适用场景 |
---|---|---|
rpx | 屏幕宽度(1/750) | 微信小程序、跨设备响应式布局 |
rem | 根字体大小 | Web 响应式设计 |
vw | 视窗宽度的 1% | 现代 Web 适配(如 H5) |
px | 固定像素 | 需要绝对尺寸的场景 |
6 全局样式和局部样式
7 image标签
8 swiper标签
9 text标签
10 navigator 组件
11 字体图标
使用步骤:
1 打开阿里巴巴图标库,搜索需要的图标
2添加到购物车
3 添加到项目
4复制css
5创建文件,并粘贴css
6 导入全局(注意一定要以分号结尾)
7 使用
8可以修改字体大小
12 背景图片
开发推荐使用base图片格式
13 事件系统
13.1绑定事件
绑定事件
处理函数
绑定输入框
在微信小程序中默认输入框默认没有边框
13.2阻止事件冒泡
将原先bind换为catch
13.3 事件传参
方式一:data-*
方式二:mark:*
14wxml语法
14.1声明和绑定数据
声明数据
使用数据
效果
14.2setDate()修改数据
绑定事件
修改数据函数
Page({
/**
* 页面的初始数据
*/
data: {
num:0
},
updateNum(){
this.setData(
{
num:this.data.num+1
})
}
})
14.3修改对象数据
Page({
/**
* 页面的初始数据
*/
data: {
num:0,
userinfo:{
test:111,
sex:'男'
}
},
updateUserinfo(){
//新增(修改)单个或多个属性
// 方法一:比较适合属性不多的情况
// this.setData({
// 'userinfo.name':"林绍玮",
// 'userinfo.age':25
// })
// 方法二
// const userinfo={
// ...this.data.userinfo,
// name:'林稍微',
// age:36
// }
// this.setData({
// userinfo
// })
// 方式三:Object.assign(),将多个对象合并为一个对象
const userinfo=Object.assign(this.data.userinfo,{name:"王五"},{age:18})
this.setData({
userinfo
})
// 删除单个属性
// delete this.data.userinfo.age
// this.setData({
// userinfo:this.data.userinfo
// })
//删除多个属性
const {age,test,...rest}=this.data.userinfo
this.setData({
userinfo:rest
})
},
})
14.4修改数组类型
// 更新list
updateList(){
// 新增
// 方式一
// this.data.list.push(4)
// this.setData({
// list:this.data.list
// })
// 方式二
// const newList=this.data.list.concat(4)
// this.setData({
// list:newList
// })
// 方式三
// const newList=[...this.data.list,4]
// this.setData({
// list:newList
// })
//修改数组
// this.setData({
// 'list[1]':8
// })
//删除数组元素
// 方式一
// this.data.list.splice(1,1)
// this.setData({
// list:this.data.list
// })
// 方式二
const newList=this.data.list.filter(item=>item !== 2 )
this.setData({
list:newList
})
},
14.5简易双向数据绑定
单向绑定
<input type="text" value="{{value}}"/>
双向绑定
<input type="text" model:value="{{value}}"/>
复选框
<checkbox model:checked="{{isChecked}}"/>
14.6列表渲染
block标签类型于vue的template 标签
14.7条件渲染
方式一
方式二
一、wx:if
条件渲染
原理:通过动态创建/销毁组件实现条件渲染(类似 Vue 的 v-if
)。
二、hidden
属性控制
原理:通过 CSS 的 display: none
隐藏组件(类似 Vue 的 v-show
)。
三、wx:if
vs hidden
对比
特性 | wx:if | hidden |
---|---|---|
渲染机制 | 条件为 false 时销毁组件 | 始终渲染,仅控制显示/隐藏 |
性能消耗 | 适合条件不频繁变化的场景 | 适合需要频繁切换的场景 |
初始渲染成本 | 条件为 false 时不渲染 | 无论条件如何都会初始渲染 |
组件状态 | 切换时会销毁/重建(状态丢失) | 保持组件状态 |
15 生命周期
15.1小程序运行机制
15.2小程序更新机制
onLoad: function (options) {
// 获取小程序更新管理器实例
const updateManage = wx.getUpdateManager();
// 监听向微信后台请求检查更新结果的事件
updateManage.onUpdateReady(function () {
// 当新版本准备就绪时,会触发此回调函数
// 弹出确认对话框,提示用户新版本已准备好,并询问是否重启应用以应用更新
wx.showModal({
title: '更新提示', // 对话框标题
content: '新版本已经准备好了,是否重启应用?', // 对话框内容
success(res) { // 用户点击确认按钮后的回调函数
// res.confirm 表示用户是否点击了确认按钮
if (res.confirm) {
// 应用新版本并重启小程序
updateManage.applyUpdate();
}
}
})
});
},
小程序开发模拟更新
15.3 微信小程序的生命周期
15.3.1 应用生命周期
App({
/**
* 当小程序初始化完成时,会触发 onLaunch(全局只触发一次)
*/
onLaunch: function () {
console.log("onLaunch 执行了");
},
/**
* 当小程序启动,或从后台进入前台显示,会触发 onShow
*/
onShow: function (options) {
console.log("onshow执行了");
},
/**
* 当小程序从前台进入后台,会触发 onHide
*/
onHide: function () {
console.log("onHide执行了");
},
/**
* 当小程序发生脚本错误,或者 api 调用失败时,会触发 onError 并带上错误信息
*/
onError: function (msg) {
}
})
15.3.2页面生命周期
16 微信小程序API
16.1网络请求
举例
getData(){
wx.request({
url: 'https://gmall-prod.atguigu.cn/mall-api/index/findBanner',
// 请求方法
method:'GET',
// 请求参数
data:{},
// 请求头
header:{},
// API成功后的回调,
success:(res)=>{
if(res.data.code==200){
this.setData({
data:res.data.data
})
}
},
// 失败后的回调
fail:(err)=>{
console.log(err);
},
// 不管调用成功还是失败都会执行
complete:(res)=>{
console.log(res);
}
})
},
当开发时,可以开启不校验合法域名,就可以请求数据,不用去微信小程序官网配置域名,等上线的时候再去配置域名。
16.2 Loading提示框
getData(){
// 开启提示框
wx.showLoading({
title: '数据加载中...',
// 是否显示一个透明蒙层。如果设置为 true,则会覆盖整个屏幕,阻止用户的其他操作直到加载结束。
mask: true
})
wx.request({
url: 'https://gmall-prod.atguigu.cn/mall-api/index/findBanner',
// 请求方法
method:'GET',
// 请求参数
data:{},
// 请求头
header:{},
// API成功后的回调,
success:(res)=>{
if(res.data.code==200){
this.setData({
data:res.data.data
})
}
},
// 失败后的回调
fail:(err)=>{
console.log(err);
},
// 不管调用成功还是失败都会执行
complete:(res)=>{
// 关闭提示框
wx.hideLoading()
}
})
},
16.3 模态对话框和消息提示框
async delHeadle(){
// 开启模态对话框
const {confirm} = await wx.showModal({
title: '提示',
content: '是否删除数据',
})
if(confirm){
// 显示提示框
wx.showToast({
title: '删除成功',
// 图标选择
icon:'none',
// 展示时间
duration:2000
})
}else{
wx.showToast({
title: '删除失败',
icon:"error",
duration:2000
})
}
},
16.4本地存储
16.5路由与通信
16.6 上拉加载
配置上拉加载
页面上拉触底事件的处理函数
16.7下拉刷新
在js中,设置下拉刷新处理逻辑
16.8增强scroll-view
17自定义组件
17.1创建组件和注册组件
17.2组件的数据及方法
17.3属性properties
用于往组件中传递数据
其中label和position表示往组件内部传递的数据。
下面是数据接收,分为简写和全写方式
17.4 slot插槽
17.4.1 默认插槽
17.4.2具名插槽
组件中开启多个插槽
17.5自定义组件的注意事项
17.6 组件样式隔离
17.7 数据监听器
举例
<!--components/custom1/costom1.wxml-->
<button type="primary" plain bindtap="update"> 更新数据</button>
<view>{{num}}</view>
<view>{{count}}</view>
<view>{{obj.name}}</view>
<view>{{arr[1]}}</view>
<view>{{label}}</view>
// components/custom1/costom1.js
Component({
// 监听属性更新
observers:{
// key为监听的属性
//value为回调函数,形参为最新值
//监听单个属性
// 'num':function(newNum){
// console.log(newNum);
// }
//同时监听多个属性
'num,count':function(newNum,newCount){
console.log(newNum,newCount);
},
//监听对象的属性
'obj.name':function(newName){
console.log(newName);
},
//通配符,监听对象
'obj.**':function(newObj){
console.log(newObj);
},
//监听数组变化
'arr[1]':function(newValue){
console.log(newValue);
},
//监听上级传给子的数据,默认初始化会执行一次
'label':function(newLabel){
console.log(newLabel);
}
},
/**
* 组件的属性列表
*/
properties: {
label:String
},
/**
* 组件的初始数据
*/
data: {
num:10,
count:100,
obj:{name:"tom",age:10},
arr:[1,2,3]
},
/**
* 组件的方法列表
*/
methods: {
update(){
this.setData({
num:this.data.num+1,
count:this.data.count-1,
'obj.name':'lsw',
'arr[1]':10000
})
}
}
})
17.8组件通信
17.8.1父传子
父
子
// pages/mypage/custom-swiper/custom-swiper.js
Component({
options:{
multipleSlots:true
},
/**
* 组件的属性列表
*/
properties: {
checked:{
type:Boolean,
value:false
}
},
observers:{
'checked':function(newValue){
console.log(11);
this.setData({
isChecked:newValue
})
}
},
/**
* 组件的初始数据
*/
data: {
isChecked:false
},
/**
* 组件的方法列表
*/
methods: {
}
})
17.8.2子传父
17.8.3 获取组件实例
res输出如下
17.9组件的生命周期
17.10生命周期总结
冷启动
关闭页面
热启动
17.11 Behavior
在微信小程序中,Behavior
是一种用于组件间代码复用的机制,类似于 Vue 中的 mixins
。
// my-behavior.js
export default Behavior({
// 数据字段
data: {
sharedData: '默认值'
},
// 生命周期(会被组件和所在 Behavior 合并)
lifetimes: {
attached() {
console.log('Behavior attached');
}
},
// 方法
methods: {
sharedMethod() {
console.log('调用了 Behavior 的方法');
this.setData({ sharedData: '修改后的值' });
}
},
// 其他可定义字段(同组件)
properties: {},
observers: {},
// ...
});
引入 Behavior
在组件的 .js
文件中导入并引用:
// component.js
import myBehavior from './my-behavior.js';
Component({
behaviors: [myBehavior], // 注入 Behavior
// 组件自身定义
data: { localData: '组件数据' },
methods: {
localMethod() {
this.sharedMethod(); // 调用 Behavior 的方法
console.log(this.data.sharedData); // 访问 Behavior 的数据
}
}
});
合并规则与优先级
-
数据 (data & properties)
同名字段会进行递归合并,组件自身数据优先级高于 Behavior。
如果多个 Behavior 有冲突,按数组顺序后者覆盖前者。 -
方法 (methods)
同名方法会被覆盖,规则同上。 -
生命周期 & 观察者
生命周期函数(如attached
)和观察者(observers
)会全部执行,执行顺序为:
Behavior
按数组顺序 → 组件自身。 -
冲突处理
若出现不可合并的冲突(如同名非函数字段),会在控制台输出警告,组件优先
18小程序中使用npm
npm初始化
构建npm
18.1自定义npm包
可以观看视频:自定义构建npm
18.2使用vant
导入步骤:快速上手 - Vant Weapp
19分包加载
20开放能力
20.1获取微信头像
当了此时获取的微信头像路径是一个临时的路径,在浏览器是访问不到的,需要我们将头像上传到服务器上面。
20.2获取微信昵称
20.3获取转发功能
20.4分享到朋友圈
测试了好像没有效果,好像要去微信小程序上面申请,要钱的
20.5 手机号验证组件
20.6客服功能
21框架接口
21.1getApp
21.2页面间的通信
21.3组件通信--事件总线
21.4自定义导航栏
更改前
更改后
22 上线发布
23 项目初始化
创建miniprogram,然后将下面文件剪切进去
npm初始化
在project.config.json添加如下配置
24通用模块的封装
24.1消息提示框封装
未封装前
封装后
使用
还有全局配置方式
使用
24.2模态对话框封装
封装前
封装
const modal = (options = {}) => {
return new Promise((resolve) => {
const defaultOpt = {
title: '提示',
content: '您确定要执行该操作吗?',
confirColor: '#f3514f'
}
const opts = Object.assign({}, defaultOpt, options)
wx.showModal({
...opts,
complete({
confirm,
cancel
}) {
confirm && resolve(true)
cancel && resolve(false)
}
})
})
}
// 全局配置
wx.modal = modal
使用
24.3封装本地存储
// 存储数据
export const setStroage=(key,value)=>{
try{
wx.setStorageSync(key, value)
}catch(err){
console.error(`存储指定${key}数据发生了异常`,err)
}
}
//读取数据
export const getStroage=(key)=>{
try{
const value =wx.getStorageSync(key)
if(value){
return value
}
}catch(err){
console.error(`读取指定${key}数据发生了异常`,err)
}
}
//移除指定key
export const removeStroage=(key)=>{
try{
wx.removeStorageSync(key)
}catch(err){
console.error(`移除指定${key}数据发生了异常`,err)
}
}
//清除全部kkey
export const clearStroage=()=>{
try{
wx.clearStorageSync()
}catch(err){
console.error(`移除全部数据发生了异常`,err)
}
}
使用
25 promise补充
ES6 Promise的用法,async/await异步处理同步化 - 哔哩哔哩
26 网络请求
配置http.js
import WxRequest from 'mina-request'
import {getStorageSync,clearStorageSync} from './stroage'
import {toast,modal} from './extentApi'
// 对 WxRequest 进行实例化
const instance = new WxRequest({
baseURL: 'https://some-domain.com/api', // 使用时请换成真实接口
timeout: 15000, // 超时时长
// isLoading: false // 是否使用默认的 loading 效果
})
// 添加请求拦截器
instance.interceptors.request = (config) => {
// 获取token
const token=getStorageSync('token')
if(token){
config.header['token']=token
}
// 在发送请求之前做些什么
return config
}
// 添加响应拦截器
instance.interceptors.response =async (response) => {
// response.isSuccess = true,代码执行了 wx.request 的 success 回调函数
// response.isSuccess = false,代码执行了 wx.request 的 fail 回调函数
// response.statusCode // http 响应状态码
// response.config // 网络请求请求参数
// response.data 服务器响应的真正数据
// 对响应数据做点什么
const{isSuccess,data}=response
if(!isSuccess){
toast({
title:"网络异常请重试",
icon:"error"
})
return Promise.reject(response)
}
switch (data.code) {
case 200:
return data
case 208:
const res=await modal({
content:'鉴权失败,请重新登录',
showCancel:false
})
if(res){
clearStorageSync()
wx.navigateTo({
url: '/pages/login/login',
})
}
return Promise.reject(response)
default:
toast({
title:'程序出现异常,请联系客服或稍后重试'
})
return Promise.reject(response)
}
return response
}
export default instance
27接口调用方式
28设置环境变量
创建配置文件env.js
const {miniProgram}=wx.getAccountInfoSync()
const {envVersion}=miniProgram
let env={
baseURL: 'https://some-domain.com/api'
}
switch (envVersion) {
// 开发版本
case 'develop':
env.baseURL='https://some-domain.com/api1111'
break;
// 测试版本
case 'trial':
env.baseURL='https://some-domain.com/api2222'
break;
// 正式版本
case 'release':
env.baseURL='https://some-domain.com/api3333'
break;
// 默认
default:
env.baseURL='https://some-domain.com/api'
break;
}
export default env
在http.js中导入
29 miniprogram
29.1mobx-miniprogram
类似于pinia
npm install mobx-miniprogram mobx-miniprogram-bindings
官方文档: