微信小程序核心技术栈
微信小程序核心技术栈
- WXML
- 一.WXML基础概念
- 1.本质与特点
- 2.与HTML的主要差异
- 二.数据绑定
- 1.基础绑定
- 2.高级绑定模式
- 3.数据绑定限制
- 三.条件渲染
- 1.基础条件判断
- 2.多条件渲染优化
- 3.条件渲染性能建议
- 四.列表渲染
- 1.基础列表
- 2.进阶用法
- 3.wx:key的深度解析
- 五.模版系统
- 1.定义模版
- 2.使用模版
- 3.动态模版
- 六.事件系统
- 1.事件分类
- 3.事件对象详情
- 4.自定义数据传递
- 七.WXML特殊组件
- 1.< block> 标签
- 2.< wxs>脚本模块
- 八.最佳实践与性能优化
- WXSS
- 一、WXSS基础概念
- 1.本质与特点
- 2. 与 Web CSS 的主要差异
- 二、尺寸单位
- 1.核心单位对比
- 2.rpx适配原理
- 3.单位使用建议
- 三、样式导入与作用域
- 1.导入方式
- 2.样式隔离规则
- 3.强制样式穿透
- 四、选择器系统
- 1.支持的选择器类型
- 2.不支持的选择器
- 3.选择器优先级
- 五、Flex布局(官方推荐方案)
- 1.基本使用
- 2.常用布局模式
- 3.兼容性注意
- 六、WXSS高级特性
- 1.变量与计算
- 2.媒体查询
- 3.动画支持
- JavaScript
- 一、小程序JS运行环境
- 1.双线程架构
- 2.与浏览器JS的差异
- 二、App和Page生命周期
- 1.App生命周期(全局)
- 2.Page生命周期(全局)
- 三、数据绑定与更新机制
- 1.数据初始化
- 2.setData 深度解析
- 四、事件处理系统
- 1.事件绑定与传参
- 2.事件对象结构
- 3.自定义组件
- 组件化开发
- 一、组件基础概念
- 1.组件vs页面
- 2.组件文件结构
- 二、组件创建全流程
- 1.配置组件
- 三、组件通信机制
- 1.父 → 子通信
- 2. 子 → 父通信
- 3. 兄弟组件通信
- 四、组件高级特性
- 1. 插槽系统(Slot)
- 2.样式隔离配置
- 3.外部样式类
- 动态组件实现
- API体系
- 一、API 基础架构
- 1. 调用方式
- 2.运行环境限制
- 二、核心 API 分类详解
- 1. 网络请求
- 2.数据缓存
- 3.界面交互
- 4.设备能力
- 5.媒体处理
- 6.开放接口
- 三、API 高级用法
- 1. Promise 化封装
- 2. 并发请求控制
- 3. 自定义拦截器
- WXML语法文档
- WXS模块文档
WXSS官方文档
API文档
自定义组件
组件间通信与事件
WXML
一.WXML基础概念
1.本质与特点
- 基于 XML 的模板语言,类似 HTML 但具有动态绑定能力
- 与 JavaScript 逻辑层分离,通过数据驱动视图更新
- 支持模块化,可通过 复用代码片段
2.与HTML的主要差异
特性 | WXML | HTML |
---|---|---|
数据绑定 | {{ }} 语法 | 无原生支持 |
事件绑定 | bind/catch前缀 | on前缀 |
条件渲染 | wx:if/wx:for指令 | 需手动操作DOM |
模版系统 | < template> 支持数据传入 | 无标准模板方案 |
二.数据绑定
1.基础绑定
<!-- 文本插值 -->
<view>Hello {{name}}!</view><!-- 属性绑定 -->
<input placeholder="{{placeholderText}}" /><!-- 表达式支持 -->
<view>{{ age + 1 }}</view>
<view>{{ flag ? 'ON' : 'OFF' }}</view>
2.高级绑定模式
<template is="user-card" data="{{...userInfo, extraData: 123}}"/>
-
对象展开绑定:
-
计算属性模拟:
// JS 中预处理数据
Page({data: {items: [1, 2, 3],computedItems: [] // 通过函数计算后 setData},onLoad() {this.setData({computedItems: this.data.items.map(x => x * 2)})}
})
3.数据绑定限制
- 不支持函数调用:{{ Math.round(price) }} ❌
- 不支持复杂表达式:{{ value1 + value2 === 3 ? ‘Y’ : ‘N’ }} ✅
- 不支持直接修改数据:必须在 JS 中使用 setData
三.条件渲染
1.基础条件判断
<view wx:if="{{score >= 90}}">优秀</view>
<view wx:elif="{{score >= 60}}">及格</view>
<view wx:else>不及格</view>
2.多条件渲染优化
- hidden属性(适用于频繁切换的场景):
<view hidden="{{!isActive}}">内容</view>
原理:通过 display:none 控制显示
对比 wx:if :
- wx:if : 动态添加/移除DOM
3.条件渲染性能建议
场景 | 推荐方案 | 理由 |
---|---|---|
初始不显示且后续少切换 | wx:if | 减少初始 DOM 节点数 |
需要频繁切换显示状态 | hidden | 避免频繁操作 DOM |
四.列表渲染
1.基础列表
<view wx:for="{{items}}" wx:key="id">索引:{{index}},值:{{item.name}}
</view>
2.进阶用法
- 指定索引/项变量名:
<view wx:for="{{array}}" wx:for-index="idx" wx:for-item="itm">{{idx}}: {{itm}}
</view>
Page({data: {array: ['苹果', '香蕉', '橙子']}
})
0: 苹果
1: 香蕉
2: 橙子
- 嵌套列表
<block wx:for="{{nestedArray}}"><view wx:for="{{item.subItems}}" wx:key="*this">{{item}}</view>
</block>
Page({data: {nestedArray: [{ subItems: ['子项1-1', '子项1-2'] },{ subItems: ['子项2-1', '子项2-2'] }]}
})
子项1-1
子项1-2
子项2-1
子项2-2
- < view wx:for=“{{item.subItems}}” wx:key=“*this”>:针对外层数组中每个元素的 subItems 属性(这是一个子数组)再次使用 wx:for 指令进行遍历。wx:key=“*this” 表示把当前遍历的元素自身当作唯一键值,这样能提升渲染效率。
3.wx:key的深度解析
- 作用原理:复用已有节点,避免重新创建
- 正确写法:
<!-- 唯一 ID -->
<view wx:for="{{users}}" wx:key="id"></view><!-- 数组项本身(适用于基本类型数组) -->
<view wx:for="{{[1,2,3]}}" wx:key="*this"></view>
- 错误示例:
<!-- 避免使用 index 作为 key -->
<view wx:for="{{items}}" wx:key="index"></view>
五.模版系统
1.定义模版
<!-- templates/user.wxml -->
<template name="userCard"><view class="card"><text>姓名:{{user.name}}</text><text>年龄:{{user.age}}</text><slot></slot> <!-- 插槽支持 --></view>
</template>
2.使用模版
<!-- 页面中引入 -->
<import src="../../templates/user.wxml"/><!-- 基本使用 -->
<template is="userCard" data="{{user}}"/><!-- 带插槽内容 -->
<template is="userCard" data="{{user}}"><view>这是插入的内容</view>
</template>
<template name="userCard"><view class="user-card"><view>姓名: {{user.name}}</view><view>年龄: {{user.age}}</view><slot></slot></view>
</template>
3.动态模版
<template is="{{templateName}}" data="{{...data}}"/>
Page({data: {templateName: 'userA',data: { name: '张三' }}
})
六.事件系统
1.事件分类
事件类型 | 描述 | 示例事件 |
---|---|---|
冒泡事件 | 向父节点传递 | tap、touchstart |
非冒泡事件 | 不向上传递 | input、scroll |
###2.事件绑定语法 |
<!-- 冒泡事件 -->
<view bindtap="handleTap"></view><!-- 阻止冒泡 -->
<view catchtap="handleTap"></view><!-- 互斥事件(仅一个触发) -->
<view mut-bindtap="handleTap"></view>
3.事件对象详情
Page({handleTap(e) {console.log(e.type) // 事件类型console.log(e.timeStamp) // 时间戳console.log(e.currentTarget) // 当前组件console.log(e.target) // 触发源组件console.log(e.detail) // 自定义数据console.log(e.mark) // 事件标记}
})
4.自定义数据传递
<view data-id="123" bindtap="handleTap">点击</view>
handleTap(e) {console.log(e.currentTarget.dataset.id) // "123"
}
七.WXML特殊组件
1.< block> 标签
- 虚拟容器:不渲染真实节点,仅用于逻辑分组
- 典型场景:
< block wx:if=“{{show}}”>
< view>A
< view>B
< /block>
2.< wxs>脚本模块
- 作用:在WXML中处理数据(类似过滤器)
- 示例:
<wxs module="m1">function formatPrice(price) {return '¥' + price.toFixed(2)}module.exports = {formatPrice: formatPrice}
</wxs><view>{{m1.formatPrice(100)}}</view>
八.最佳实践与性能优化
1.避免过深的嵌套层级(建议不超过5层)
2.减少不必要的数据绑定:
<!-- 不推荐 -->
<view>{{ largeObject.text }}</view><!-- 推荐 -->
<view>{{ text }}</view>
3.使用key提升列表性能(尤其对动态排序列表)
4.复杂逻辑移至js处理,保持模版简洁
WXSS
一、WXSS基础概念
1.本质与特点
- 基于 CSS 的样式语言,扩展了响应式像素单位(rpx)
- 与 Web CSS 的兼容性:支持大多数 CSS2.1 和部分 CSS3 特性
- 样式隔离机制:默认局部作用域,避免样式污染
2. 与 Web CSS 的主要差异
特性 | WXSS | CSS |
---|---|---|
单位系统 | 新增rpx响应式单位 | 传统 px/em/rem |
样式导入 | @import 支持相对路径 | 支持多种导入方式 |
选择器支持 | 部分伪类不支持(如:hover) | 完整支持 |
全局/局部样式 | 通过文件路径自动隔离 | 需手动管理 |
二、尺寸单位
1.核心单位对比
单位 | 计算方式 | 适用场景 |
---|---|---|
rpx | 1rpx = 屏幕宽度 / 750 | 推荐 响应式布局 |
px | 1px = 物理像素 | 固定尺寸元素(如边框) |
vw/vh | 1vw = 视图宽度1% | 特殊全屏布局 |
% | 相对于父元素 | 传统百分比布局 |
2.rpx适配原理
- 基准设备:iPhone6(屏幕宽度375pt)
- 换算关系:
设备 宽度(pt) 1rpx换算
iPhone6 375 0.5px
iPhoneX 375 0.5px
iPad 768 1.024px
3.单位使用建议
/* 推荐方案 */
.container {width: 750rpx; /* 满屏宽度 */padding: 32rpx; /* 通用间距 */font-size: 28rpx; /* 基础字号 */
}/* 特殊情况使用 px */
.border {border: 1px solid #ddd; /* 物理像素边框 */
}
三、样式导入与作用域
1.导入方式
/* 导入相对路径样式文件 */
@import "../../common/base.wxss";/* 引入 iconfont */
@font-face {font-family: 'iconfont';src: url('https://at.alicdn.com/t/font_123456.woff2');
}
2.样式隔离规则
样式类型 | 作用范围 | 示例文件 |
---|---|---|
全局样式 | 所有页面 | 推荐 响应式布局 |
页面样式 | 当前页面 | pages/index/index.wxss |
组件样式 | 当前自定义组件 | components/my-component/my-component.wxss |
3.强制样式穿透
/* 方法1:添加 !important */
.text {color: red !important;
}/* 方法2:使用 >>> 或 ::v-deep(部分版本支持) */
.parent >>> .child {font-size: 32rpx;
}
四、选择器系统
1.支持的选择器类型
类型 | 示例 | 说明 |
---|---|---|
类选择器 | .container | 最常用 |
ID选择器 | #header | 避免滥用 |
元素选择器 | view | 匹配组件标签 |
伪类选择器 | ::after | 仅支持部分伪类 |
属性选择器 | [data-type=“1”] | 需注意性能 |
后代选择器 | .parent .child | 避免过深嵌套(≤3层) |
2.不支持的选择器
- 通配符选择器(*)
- 部分伪类(如:hover、:focus)
- 兄弟选择器(~、+)
3.选择器优先级
/* 优先级从高到低 */
!important > 行内样式 > ID > Class/属性 > 元素
五、Flex布局(官方推荐方案)
1.基本使用
.container {display: flex;flex-direction: row; /* 主轴方向:row | column */justify-content: center; /* 主轴对齐 */align-items: flex-start; /* 交叉轴对齐 */flex-wrap: wrap; /* 换行控制 */
}
2.常用布局模式
- 水平等分布局
.item {flex: 1; /* 等分容器 */min-width: 0; /* 防止内容溢出 */
}
- 垂直居中
.center {display: flex;justify-content: center;align-items: center;
}
3.兼容性注意
- 小程序全版本支持 Flex 布局
- 避免使用 gap 属性(需用 margin 替代)
六、WXSS高级特性
1.变量与计算
/* 定义全局变量(需配合 JS 实现) */
page {--theme-color: #ff0000;
}/* 使用变量 */
.text {color: var(--theme-color);
}
2.媒体查询
/* 根据屏幕宽度适配 */
@media screen and (min-width: 768px) {.card {width: 80%;}
}
3.动画支持
/* 定义关键帧 */
@keyframes slidein {from { transform: translateX(100%); }to { transform: translateX(0); }
}/* 应用动画 */
.box {animation: slidein 0.5s ease-in-out;
}
JavaScript
一、小程序JS运行环境
1.双线程架构
线程类型 | 运行环境 | 职责 |
---|---|---|
逻辑层 | JavaScriptCore / V8 | 数据处理、API调用 |
渲染层 | WebView | 页面渲染、事件响应 |
2.与浏览器JS的差异
特性 | 小程序JS | 浏览器JS |
---|---|---|
DOM/BOM | 不可用 | 完整支持 |
全局对象 | wx代替window | window |
模块系统 | CommonJs | ES Modules |
异步API | 回调/Promise混用 | 主流Promise |
二、App和Page生命周期
1.App生命周期(全局)
App({// 生命周期onLaunch(options) {// 初始化完成时触发(全局一次)console.log('场景值:', options.scene) },onShow(options) {// 小程序启动或从后台进入前台},onHide() {// 小程序从前台进入后台},// 自定义全局方法/数据globalData: {userInfo: null},// 自定义全局函数fetchData() {return wx.request({url: 'https://api.example.com'})}
})
2.Page生命周期(全局)
Page({// 生命周期onLoad(options) {// 页面创建时触发,接收路由参数},onShow() {// 页面显示/切入前台时触发},onReady() {// 页面初次渲染完成},onHide() {// 页面隐藏/切入后台},onUnload() {// 页面卸载时触发(跳转或关闭)},// 页面事件处理onPullDownRefresh() {// 处理下拉刷新wx.stopPullDownRefresh()},onReachBottom() {// 页面上拉触底},onPageScroll(e) {// 页面滚动时触发console.log(e.scrollTop)},onShareAppMessage() {// 用户点击分享时触发return { title: '分享标题' }}
})
三、数据绑定与更新机制
1.数据初始化
Page({data: {message: 'Hello',list: [],user: { name: '张三', age: 20 }}
})
2.setData 深度解析
在微信小程序里,页面的data对象用来存储页面的数据。当你需要动态更新页面上的数据,并且让界面随之刷新以反映这些数据的变化时,就可以使用this.setData方法。
基本用法
this.setData({'message': 'New Value','user.age': 21 // 支持路径写法
})
高级特性
- 异步更新:多个setData会合并执行
- 性能优化:
// 错误示范(频繁更新)
for(let i=0; i<100; i++) {this.setData({ count: i })
}// 正确做法(批量更新)
this.setData({ count: 100,'list[0].name': '李四'
})
四、事件处理系统
1.事件绑定与传参
<!-- WXML 中绑定 -->
<view bindtap="handleTap" data-id="123">点击</view>
<view bindinput="handleInput"></view>
- 1.通过dataset传参
可以在组件上使用*data-自定义属性来传递参数。在事件处理函数中,可以通过event.currentTarget.dataset来获取这些参数。
<!-- pages/index/index.wxml -->
<view bindtap="handleTap" data-id="123" data-name="example">点击我</view>
// pages/index/index.js
Page({handleTap: function(event) {const id = event.currentTarget.dataset.id;const name = event.currentTarget.dataset.name;console.log('传递的 id:', id);console.log('传递的 name:', name);}
})
- 全局变量传参
如果需要传递复杂的数据,可以使用全局变量,在app,.js中定义全局变量,然后在页面中通过**getApp()**方法来访问和修改这些变量。
// app.js
App({globalData: {userInfo: null}
})
// pages/index/index.js
Page({onLoad: function() {const app = getApp();app.globalData.userInfo = {name: 'John',age: 25};},handleTap: function() {const app = getApp();const userInfo = app.globalData.userInfo;console.log('全局变量中的用户信息:', userInfo);}
})
- 3.事件对象本事传参
有些事件对象本身会携带一些有用的信息,例如touchstart、touchmove、touchend等触摸事件,会携带触摸点的坐标信息。
<!-- pages/index/index.wxml -->
<view bindtouchstart="handleTouchStart">触摸我</view>
// pages/index/index.js
Page({handleTouchStart: function(event) {const touch = event.touches[0];const x = touch.clientX;const y = touch.clientY;console.log('触摸点的 x 坐标:', x);console.log('触摸点的 y 坐标:', y);}
})
综合示例
<!-- pages/index/index.wxml -->
<view><view wx:for="{{list}}" wx:key="*this" bindtap="handleItemTap" data-index="{{index}}">{{item}}</view>
</view>
// pages/index/index.js
Page({data: {list: ['苹果', '香蕉', '橙子']},handleItemTap: function(event) {const index = event.currentTarget.dataset.index;const item = this.data.list[index];console.log('点击的是第', index + 1, '项:', item);}
})
2.事件对象结构
Page({handleTap(e) {console.log(e.type) // 事件类型(如 tap)console.log(e.currentTarget) // 绑定事件的组件console.log(e.target) // 触发事件的源组件console.log(e.detail) // 额外信息(如 input 的值)console.log(e.mark) // 事件标记数据}
})
3.自定义组件
在微信小程序里,自定义事件是实现组件间通信的重要手段,可用于实现父组件向子组件、子组件向父组件,以及兄弟组件间的通信。
子组件向父组件通信
子组件可通过触发自定义事件并携带数据,将信息传递给父组件。父组件监听该自定义事件,在事件处理函数中接收数据。
子组件代码
// components/child/child.js
Component({methods: {sendDataToParent() {const data = '这是来自子组件的数据';// 触发自定义事件,并传递数据this.triggerEvent('customEvent', { data });}}
})
<!-- components/child/child.wxml -->
<button bindtap="sendDataToParent">向父组件发送数据</button>
父组件代码
// pages/parent/parent.js
Page({handleCustomEvent(e) {const receivedData = e.detail.data;console.log('接收到子组件的数据:', receivedData);}
})
<!-- pages/parent/parent.wxml -->
<child bind:customEvent="handleCustomEvent"></child>
父组件向子组件通信
子组件代码
// components/child/child.js
Component({properties: {parentData: {type: String,value: ''}},attached() {console.log('接收到父组件的数据:', this.data.parentData);}
})
<!-- components/child/child.wxml -->
<view>父组件传递的数据: {{parentData}}</view>
父组件代码
// pages/parent/parent.js
Page({data: {dataToChild: '这是来自父组件的数据'}
})
<!-- pages/parent/parent.wxml -->
<child parent-data="{{dataToChild}}"></child>
兄弟组件间通信
兄弟组件间通信可借助共同的父组件作为中间桥梁。一个兄弟组件触发自定义事件将数据传递给父组件,父组件再将数据传递给另一个兄弟组件。
组件A代码
// components/componentA/componentA.js
Component({methods: {sendDataToParent() {const data = '这是来自组件A的数据';this.triggerEvent('customEvent', { data });}}
})
<!-- components/componentA/componentA.wxml -->
<button bindtap="sendDataToParent">向父组件发送数据</button>
组件B代码
// components/componentB/componentB.js
Component({properties: {siblingData: {type: String,value: ''}},attached() {console.log('接收到兄弟组件的数据:', this.data.siblingData);}
})
<!-- components/componentB/componentB.wxml -->
<view>兄弟组件传递的数据: {{siblingData}}</view>
父组件代码
// pages/parent/parent.js
Page({data: {dataToComponentB: ''},handleCustomEvent(e) {const receivedData = e.detail.data;this.setData({dataToComponentB: receivedData});}
})
<!-- pages/parent/parent.wxml -->
<componentA bind:customEvent="handleCustomEvent"></componentA>
<componentB sibling-data="{{dataToComponentB}}"></componentB>
组件化开发
一、组件基础概念
1.组件vs页面
特性 | 组件 | 页面 |
---|---|---|
配置文件 | 需声明 “component”: true | 无需特殊声明 |
初始化方式 | Component() | Page() |
作用域 | 样式/数据隔离 | 全局样式可影响 |
用途 | 回调/功能复用 | 业务主视图 |
2.组件文件结构
components/├─ my-component/├─ my-component.js # 组件逻辑├─ my-component.json # 组件配置├─ my-component.wxml # 组件模板├─ my-component.wxss # 组件样式
二、组件创建全流程
1.配置组件
// my-component.json
{"component": true,//"usingComponents":这是一个对象,用于声明当前组件所使用的其他自定义组件。在这个对象里,键是自定义组件在模板中使用的标签名,值是自定义组件的路径。"usingComponents": {//"child-comp": "../child/child":这一配置表示在当前组件里,能够使用名为child-comp的自定义组件,该组件的路径是../child/child。"child-comp": "../child/child" # 嵌套组件声明}
}
父组件
//parent.json
{"component": true,"usingComponents": {"child-comp": "../child/child"}
}
//parent.wxml
<view>这是父组件<child-comp></child-comp>
</view>
//parent.js
Component({properties: {// 父组件的属性},methods: {// 父组件的方法}
})
子组件
//child.json
{"component": true
}
//child.wxml```javascript
<view>这是子组件</view>
//child.js
Component({properties: {// 子组件的属性},methods: {// 子组件的方法}
})
### 2.组件构造函数```javascript
// my-component.js
Component({// 组件属性定义(对外接口)properties: {title: {type: String,value: '默认标题',observer(newVal, oldVal) {// 属性变化监听}}},// 组件内部数据data: {count: 0},// 生命周期lifetimes: {attached() {console.log('组件实例进入页面节点树')},detached() {console.log('组件实例被移除')}},// 页面生命周期(所在页面的生命周期)pageLifetimes: {show() { /* 页面显示 */ },hide() { /* 页面隐藏 */ }},// 方法methods: {handleTap() {this.setData({ count: this.data.count + 1 })this.triggerEvent('countchange', { value: this.data.count })}}
})
三、组件通信机制
1.父 → 子通信
方式一:Properties 传递
<!-- 父组件 WXML -->
<my-component title="自定义标题" count="{{parentCount}}"/>
方式二:通过 selectComponent 获取实例
// 父组件 JS
this.selectComponent('#my-comp').setData({ count: 10 })
2. 子 → 父通信
// 子组件触发自定义事件
this.triggerEvent('eventname', {detail: { /* 数据 */ },bubbles: false, // 是否冒泡composed: false // 是否跨越组件边界
})// 父组件监听
<my-component bind:eventname="handleEvent"/>
3. 兄弟组件通信
方案一:通过父组件中转
// 子组件A触发事件 → 父组件 → 子组件B
this.triggerEvent('update', {data: 1})// 父组件 WXML
<comp-a bind:update="handleUpdate"/>
<comp-b id="comp-b"/>// 父组件 JS
handleUpdate(e) {this.selectComponent('#comp-b').setData(e.detail)
}
方案二:使用全局事件总线
// app.js 中定义
App({eventBus: {emit(event, data) { /*...*/ },on(event, callback) { /*...*/ }}
})// 组件中使用
getApp().eventBus.emit('update', {data: 1})
四、组件高级特性
1. 插槽系统(Slot)
基础用法
<!-- 组件模板 -->
<view class="container"><slot></slot>
</view><!-- 使用组件 -->
<my-component><view>插入的内容</view>
</my-component>
具名插槽
<!-- 组件模板 -->
<slot name="header"></slot>
<slot name="footer"></slot><!-- 使用组件 -->
<my-component><view slot="header">头部</view><view slot="footer">底部</view>
</my-component>
2.样式隔离配置
Component({options: {styleIsolation: 'isolated' // 可选值:// isolated - 完全隔离// apply-shared - 父影响子// shared - 相互影响}
})
3.外部样式类
// 组件 JS
Component({externalClasses: ['custom-class'] // 接受外部样式类
})<!-- 组件 WXML -->
<view class="custom-class">内容</view><!-- 使用组件 -->
<my-component custom-class="red-text"/>
动态组件实现
<!-- 动态加载组件 -->
<component is="{{componentName}}"/><!-- 配合 wx:if -->
<view wx:if="{{type === 'A'}}"><comp-a/>
</view>
<view wx:else><comp-b/>
</view>
API体系
一、API 基础架构
1. 调用方式
调用形式 | 示例 | 特点 |
---|---|---|
同步 API | wx.setStorageSync(key, data) | 立即返回结果,命名包含 Sync |
异步 API(回调) | wx.request({ success(){} }) | 通过回调函数处理结果 |
异步 API(Promise) | wx.request().then() | 需自行封装或使用云开发 SDK |
2.运行环境限制
- 部分 API 需声明权限:在 app.json 中配置
{"permission": {"scope.userLocation": {"desc": "获取位置信息"}}
}
- 安全域名限制:网络请求必须配置合法域名(开发阶段可关闭校验)
二、核心 API 分类详解
1. 网络请求
基础请求
wx.request({url: 'https://api.example.com',method: 'POST',data: { key: 'value' },header: { 'Content-Type': 'application/json' },success(res) {console.log(res.statusCode, res.data)},fail(err) {console.error(err)}
})
高级特性
- 文件上传:
wx.uploadFile({url: 'https://upload.example.com',filePath: tempFilePaths[0],name: 'file',success(res) {console.log(res.data)}
})
- WebSocket
const socket = wx.connectSocket({url: 'wss://echo.websocket.org'
})
socket.onMessage(msg => console.log(msg))
2.数据缓存
操作类型 | 同步方法 | 异步方法 |
---|---|---|
存储 | wx.setStorageSync | wx.setStorage |
读取 | wx.getStorageSync | wx.getStorage |
删除 | wx.removeStorageSync | wx.removeStorage |
清空 | wx.clearStorageSync | wx.clearStorage |
// 敏感数据建议加密存储
const crypto = require('./crypto-utils')
wx.setStorageSync('token', crypto.encrypt(rawToken))
3.界面交互
弹窗系列
// 显示加载框
wx.showLoading({ title: '加载中' })
setTimeout(() => wx.hideLoading(), 2000)// 模态对话框
wx.showModal({title: '提示',content: '确认删除?',success(res) {if (res.confirm) console.log('用户确认')}
})
导航控制
// 页面跳转(保留当前页)
wx.navigateTo({ url: '/pages/detail?id=1' })// Tab页切换
wx.switchTab({ url: '/pages/index' })// 返回上一页
wx.navigateBack({ delta: 1 })
4.设备能力
地理位置
wx.getLocation({type: 'wgs84',success(res) {const { latitude, longitude } = reswx.openLocation({ latitude, longitude })}
})
扫码功能
wx.scanCode({success(res) {console.log('扫码结果:', res.result)}
})
5.媒体处理
图片处理
// 选择图片
wx.chooseImage({count: 1,sizeType: ['compressed'],success(res) {wx.previewImage({ urls: res.tempFilePaths })}
})
录音功能
const recorderManager = wx.getRecorderManager()
recorderManager.onStart(() => console.log('录音开始'))
recorderManager.start({ format: 'mp3' })
6.开放接口
用户信息
wx.getUserProfile({desc: '用于完善会员资料',success(res) {console.log(res.userInfo)}
})
微信支付
wx.requestPayment({timeStamp: '',nonceStr: '',package: '',signType: 'MD5',paySign: '',success(res) { /* 支付成功 */ }
})
三、API 高级用法
1. Promise 化封装
// 通用封装方法
const promisify = (api) => (options) => new Promise((resolve, reject) => {api({...options,success: resolve,fail: reject})})// 使用示例
const request = promisify(wx.request)
request({ url: 'https://api.example.com' }).then(res => console.log(res.data))
2. 并发请求控制
// 使用 Promise.all
Promise.all([promisify(wx.request)({ url: '/api/user' }),promisify(wx.request)({ url: '/api/goods' })
]).then(([userRes, goodsRes]) => {console.log(userRes, goodsRes)
})
3. 自定义拦截器
// 请求拦截示例
const originalRequest = wx.request
wx.request = function(options) {// 添加全局 headeroptions.header = {...options.header,'X-Token': wx.getStorageSync('token')}return originalRequest(options)
}
相关文章:
微信小程序核心技术栈
微信小程序核心技术栈 WXML一.WXML基础概念1.本质与特点2.与HTML的主要差异 二.数据绑定1.基础绑定2.高级绑定模式3.数据绑定限制 三.条件渲染1.基础条件判断2.多条件渲染优化3.条件渲染性能建议 四.列表渲染1.基础列表2.进阶用法3.wx:key的深度解析 五.模版系统1.定义模版2.使…...
系统架构设计中的ATAM方法:理论、实践与深度剖析
引言 在复杂系统架构设计中,如何在性能、安全性、可维护性等质量属性之间实现平衡,是每一位资深架构师必须面对的终极挑战。传统的架构评审往往依赖经验直觉或局部优化,而ATAM(Architecture Tradeoff Analysis Method,架构权衡分析方法)通过结构化分析框架,系统性解…...
模板引擎语法-过滤器
模板引擎语法-过滤器 文章目录 模板引擎语法-过滤器[toc]1.default过滤器2.default_if_none过滤器3.length过滤器4.addslashes过滤器5.capfirst过滤器6.cut过滤器7.date过滤器8.dictsort过滤器 1.default过滤器 default过滤器用于设置默认值。default过滤器对于变量的作用&…...
关于GoWeb(1)
Go Web (1) 一、网络通信与 Socket 编程 (一)Socket 编程基础 Socket 是网络通信的核心,它允许程序之间通过网络进行数据交换。在 Go 中,可以使用标准库 net 来实现 Socket 编程。 (二&…...
实现从一个微信小程序跳转到另一个微信小程序
前言: 最近在公司完成了一个两个小程序之间进行跳转的需求,将跳转方式与携带参数的方式分享给伙伴们: 代码展示: wx.navigateToMiniProgram({// 另一个程序的appIdappId: "wxbbd...",//你希望跳转到另一个小程序的目标路径&#…...
【教程】Docker运行gitlab容器
Docker运行gitlab容器 前言1.拉取gitlab镜像2.创建挂载数据卷3.运行镜像4 登录Gitalb5 访问linux的gitlab地址,输入用户名与密码 前言 在linux系统中安装gitlab的教程 1.拉取gitlab镜像 不指定 默认拉取最新版镜像 docker pull gitlab/gitlab-ce 2.创建挂载数据…...
微信小程序鲜花销售系统设计与实现
概述 在鲜花电商行业快速发展的背景下,移动端销售平台成为花店拓展业务的重要渠道。幽络源平台今日分享一款功能完善的微信小程序鲜花销售系统,该系统实现了多角色管理、在线订购、会员服务等核心功能,为鲜花行业提供了完整的电商解决方案。…...
嵌入式C设计模式---策略模式
目录 1.策略设计模式动漫详解 2.LVGL策略模式实现详解与应用 3.嵌入式中策略模式应用的优缺点 4.大话设计模式C语言实现 1.策略设计模式动漫详解 2.LVGL策略模式实现详...
打开canoe--点击capl Brower弹出错误,capl打不开
打开canoe–点击capl Brower弹出下图错误,capl打不开,友友们遇到过吗?怎么破?...
ultralytics 目标检测 混淆矩阵 背景图像 没被记录
修改 utils/metrics.py ConfusionMatrix def process_batch(self, detections, gt_bboxes, gt_cls):"""Update confusion matrix for object detection task.Args:detections (Array[N, 6] | Array[N, 7]): Detected bounding boxes and their associated inf…...
C++之map
因为前些天做了一道题:PTA:查询首都或国名-CSDN博客 这道题我和朋友的实现方式不同,想要学习学习她的这种方式,于是乎有了这篇研究 map 的文章。 先学习一下 map 的基本定义吧: map 是标准模板库(STL)中…...
【每天一个知识点】点乘(Dot Product)
点乘(Dot Product)在很多机器学习和图神经网络(GNN)中都有广泛应用,尤其在图结构重构中,它通常用来衡量节点之间的相似性或者关联性。让我们逐步深入理解点乘,尤其是在图结构重构中的应用。 1.…...
2025上海车展| 和芯星通发布覆盖车载全场景的产品方案
2025上海车展充满科技范儿,更加聚焦用户价值与安全性。智能化、电动化进一步深入融合,呈现辅助驾驶成熟量产化、舱驾融合一体化、产业链创新本土化、跨界融合生态化的趋势。 与其他辅助驾驶系统传感器相比,GNSS卫星定位能够提供独立于外部地…...
【Linux网络】构建HTTP响应与请求处理系统 - HttpResponse从理解到实现
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
识破养生假象,拥抱科学健康
在这个全民热衷养生的时代,各种养生理念与方法如潮水般涌来。但其中不少是迷惑大众的 “烟雾弹”,只有识破这些养生假象,我们才能踏上真正的健康之路。 不少人觉得,养生就得靠保健品 “撑腰”。市面上,各类宣称具有…...
设计一个关键字统计程序:利用HashMap存储关键字统计信息,对用户输入的关键字进行个数统计。
思路分析 首先,在KeywordCounter类中,定义了一个包含所有Java关键字的字符串数组KEYWORDS,用于存储所有关键字。然后创建了一个Scanner对象input,用于从标准输入读取用户的输入。接下来创建了一个StringBuilder对象sb,…...
Python文件操作及数据库交互(Python File Manipulation and Database Interaction)
Python文件操作及数据库的交互 在实际开发中,文件操作与数据库交互是非常常见的任务。Python作为一种高效且灵活的编程语言,不仅提供了丰富的文件操作功能,还通过多种库与数据库进行高效交互。本文将详细介绍如何使用Python进行文件操作&…...
Eigen稀疏矩阵类 (SparseMatrix)
1. SparseMatrix 核心属性与初始化 模板参数 cpp SparseMatrix<Scalar, Options, StorageIndex> Scalar:数据类型(如 double, float)。 Options:存储格式(默认 ColMajor,可选 RowMajor࿰…...
【运维】Windows 与 Linux 中实时查看日志的命令对比详解(tail -f)
🔍 Windows 与 Linux 中实时查看日志的命令对比详解(tail -f) 在日常开发、调试、部署过程中,实时查看日志文件的更新内容是非常常见的需求。尤其是在排查后端服务问题、守护进程行为、系统异常等场景下,查看实时日志…...
巧用 Element - UI 实现图片上传按钮的智能隐藏
引言 在前端开发中,使用 Element - UI 组件库来构建用户界面是非常常见的操作。其中图片上传功能更是在许多项目中频繁出现,比如用户头像上传、商品图片上传等场景。有时候,我们会有这样的需求:当上传图片达到一定数量后…...
高级 SQL 技巧:提升数据处理能力的实用方法
在数据驱动的时代,SQL 作为操作和管理关系型数据库的标准语言,其重要性不言而喻。基础的 SQL 语句能满足日常的数据查询需求,但在处理复杂业务逻辑、进行数据分析和优化数据库性能时,就需要掌握一些高级 SQL 技巧。这些技巧不仅能提高查询效率,还能实现复杂的数据处理任务…...
2.4.5goweb项目上传到csdn的git仓库
在开始使用 Git 之前,你需要先安装它。不同操作系统的安装方法不同: (git先实战,能从仓库上传,下载之后,在听课程,记住大致流程。以后使用就知道往哪里查了) Windows:可以从Git 官方网站下载安…...
Eclipse 插件开发 3 菜单栏
Eclipse 插件开发 3 菜单栏 1 增加菜单2 指定位置3 点击事件4 二级菜单 (静态)5 二级菜单 (动态) 位置locationURI备注菜单栏menu:org.eclipse.ui.main.menu添加到传统菜单工具栏toolbar:org.eclipse.ui.main.toolbar添加到工具栏 1 增加菜单 <?xml version"1.0&quo…...
win11右键菜单改回win10模式
win11右键菜单非常不好用,经常需要点击最下方的“显示更多选项”,下面是win11右键菜单改回win10模式的方法。 按下 Win R 组合键,打开“运行”窗口,输入 cmd,此时不要急着按Enter,按 Ctrl Shift Enter …...
SpringBoot 常用注解通俗解释
SpringBoot 常用注解通俗解释 一、启动类相关 1. SpringBootApplication • 作用:这是SpringBoot项目的"总开关",放在主类上 • 通俗理解:相当于对电脑说:"开机!我要用SpringBoot了!…...
26 Arcgis软件常用工具有哪些
一、画图改图工具(矢量编辑) 挪位置工具(移动工具) 干哈的?选中要素(比如地块、道路)直接拖到新位置,或者用坐标X/Y偏移批量移动,适合“整体搬家”。 磁…...
OpenCV --- 图像预处理(七)
OpenCV — 图像预处理(七) 文章目录 OpenCV --- 图像预处理(七)十七,图像轮廓特征查找17.1 外接矩形17.2 最小外接矩形17.3 最小外接圆 十七,图像轮廓特征查找 图像轮廓特征查找其实就是他的外接轮廓。应用…...
【计算机网络】信息时代的数字神经系统
目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现案例1:Python TCP服务器案例2:网络带宽测试 运行结果验证 三、性能对比测试…...
Adriuno:编程语言基础
Adriuno主要的编程语言是C语言,使得使用者不需要掌握特殊的编程语言,变得更加容易上手。 一、函数 Arduino提供了许多函数,其功能是控制 Arduino开发板,进行数值计算等,包括数字I/O函数、模拟I/O函数、高级I/O函数、时…...
二叉搜索树的实现与应用场景
本章目标 1.二叉搜索树的概念 2.二叉搜索树的性能分析 3.二叉搜索树的实现 4.二叉搜索树的key/key-value的实现场景 1.二叉搜索树的概念 二叉搜索树又叫二叉排序树,它是具有以下性质的树 1.它的左子树不为空,并且左子树上的值都小于根节点 2.它的右子树不为空,并且右子树上的…...
单例模式介绍
单例模式大家都很清楚,最常见的是饿汉式与懒汉式。也有不常见的静态内部类式与枚举式以及,懒汉式的线程安全版本。 单例模式常被用于全局式的配置管理(数据库连接池,日志管理器),资源共享(线程池…...
Pycharm 代理配置
Pycharm 代理配置 文章目录 Pycharm 代理配置1. 设置系统代理1.1 作用范围1.2 使用场景1.3 设置步骤 2. 设置 python 运行/调试代理2.1 作用范围2.2 使用场景2.3 设置步骤 Pycharm 工具作为一款强大的 IDE,其代理配置在实际开发中也是必不可少的,下面介绍…...
springboot入门-repository数据访问层JPA和mybatis
在 Spring Boot 中,Repository 接口是数据访问层(DAO)的核心抽象,而 JpaRepository 和 MyBatis 的实现方式有显著不同。以下是详细解释: 1. JPA 的 Repository 接口为什么使用 interface? (1) 基于接口的动…...
代码随想录算法训练营Day31 | 56. 合并区间 738.单调递增的数字
56. 合并区间 问题描述: 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 解决方式…...
【教学类-102-19】蝴蝶三色图作品1——卡纸蝴蝶(滴颜料按压对称花纹)A4横版最大号22.85CM
背景需求: 前期做了18次实验,基本实现了三色图三线的各种变化效果和16种图纸大小的批量导入 今天开始制作具体可用的学具——黑卡纸蝴蝶(滴颜料按压对撑颜色) 【教学类-102-11】蝴蝶外轮廓01——Python对黑白图片进行PS填充三种颜色+图案描边+图案填充白色+制作1图2图6图…...
Claude系列模型-20250426
文章目录 Claude 3.7 Sonnet - "Our most intelligent model yet"Claude 3.5 Haiku - "Fastest model for daily tasks"Claude 3.5 Sonnet (Oct 2024)Claude 3 Opus总结Claude 3.7 Sonnet - “Our most intelligent model yet” 特点: 这是目前Claude系列…...
ADC单通道采集实验
设置的步骤如下; #include "adc.h"ADC_HandleTypeDef adc_handle {0}; void adc_init(void) {adc_handle.Instance ADC1; //ADC的基地址adc_handle.Init.DataAlign ADC_DATAALIGN_RIGHT; //…...
启动你的RocketMQ之旅(五)-Broker详细——消息传输
前言: 👏作者简介:我是笑霸final。 📝个人主页: 笑霸final的主页2 📕系列专栏:java专栏 📧如果文章知识点有错误的地方,请指正!和大家一起学习,一…...
100个节点的部署,整合Docker、Kubernetes和Jenkins的详细设计
一、架构设计概览 组件角色: Docker:应用容器化封装,确保环境一致性。Kubernetes(K8s):自动化容器编排,管理多节点集群的调度、扩缩容和自愈。Jenkins:CI/CD流水线驱动,实现代码到生产的自动化流程。集群规模: Master节点:3个(高可用,避免单点故障)。Worker节点:…...
神经网络与计算机视觉
2016 年,随着 AlphaGo 在围棋比赛中击败李世石,“人工智能”、“神经网络”、“深度 学习”等字眼便越来越多的出现在大众眼前,智能化好像成为一种不可逆转的趋势,带给大家新奇感的同时也带来了一丝忧惧:在不远的未来,机器是否真的拥有思维和情感?《终结者》中天网大战人…...
openEuler对比CentOS的核心优势分析
openEuler对比CentOS的核心优势分析 在开源操作系统领域,openEuler与CentOS均占据重要地位,但随着CentOS维护策略的调整(如CentOS 8停止维护,转向CentOS Stream),越来越多的用户开始关注国产化替代方案。o…...
高性能电脑系统优化工具Advanced SystemCare PRO v18.3.0.240 解锁永久专业版
软件介绍 IObit Advanced SystemCare,系统清理维护与安全防护软件,大幅提升整体系统性能和安全!一键AI智能模式,全面扫描优化修复系统,拥有性能加速模式、系统优化、网络加速、启动项优化、软件更新、实时监视清理、隐…...
【C语言练习】005. 编写表达式并确定其值
【C语言练习】005. 编写表达式并确定其值 005. 编写表达式并确定其值示例 1:算术表达式计算过程:最终结果:示例 2:关系和逻辑表达式计算过程:最终结果:示例 3:复合赋值和算术表达式计算过程:最终结果:示例 4:位运算表达式计算过程:最终结果:示例 5:综合表达式计算…...
力扣面试150题--合并两个有序链表和随机链表的复制
Day 33 题目描述 思路 常规题目,比较list1和list2节点的值,取出较小值扩展链表,最后其中一个遍历完直接拼接另外一个即可(归并排序) /*** Definition for singly-linked list.* public class ListNode {* int v…...
测试用例的设计
组合原则:多个选项有效数据建议组合使用(正向功能)、单个选项无效数据组合其他选项有效数据使用(逆向功能) 一、针对登录模块设计测试用例: 1.账号:已注册手机号、已注册邮箱、为空、未注册手机号、未注册邮箱 2.密码:注册密码、为空、错误密码 3.验证码:正确、过期、错误 …...
关于TCP三次握手和四次挥手的疑点
参考文章:浅谈TCP三次握手和四次挥手 1、三次握手的作用 (1)确保双方收到对方的初始序列号:客户端发送SYN包,服务器回复SYN-ACK包,客户端再回复ACK包,确保双方都接收到对方的序列号。 …...
逆向|dy|a_bogus|1.0.1.19-fix.01
2025-04-26 请求地址:aHR0cHM6Ly93d3cuZG91eWluLmNvbS91c2VyL01TNHdMakFCQUFBQV96azV6NkoyMG1YeGt0eHBnNkkzRVRKejlyMEs3d2Y2dU9EWlhvd2ttblZWRnB0dlBPMmMwN2J0WFotcVU4V3M 个人主页的视频数据 我们需要逆向这个接口,所以现在需要分析这个请求, 分析这几个数据包可以发现: 只有…...
【软考-架构】13.5、中间件
✨资料&文章更新✨ GitHub地址:https://github.com/tyronczt/system_architect 文章目录 中间件技术典型应用架构 中间件技术 在分布式系统环境中,出于操作系统和应用程序之间的软件。 主要的中间件有五类: 数据库访问中间件࿱…...
【Redis】基础2:作为缓存
文章目录 1. 一些概念2. 主动更新策略/缓存设计模式2.1 cache-aside pattern(lazy loading)2.2 read-through pattern(针对读操作)2.3 write-through pattern2.4 write behind pattern(write back pattern)…...
豆包,Kim,deepseek对比
以下是豆包、Kimi、DeepSeek的对比与应用: 对比 - 核心技术:DeepSeek-R1完全依赖强化学习驱动,跳过监督微调阶段。Kimi k1.5采用“轻量级SFT预热RL优化”的混合策略。 - 多模态支持:Kimi k1.5支持文本与图像的多模态联合推理。De…...