0.小程序开发
1.业务模块
-
规格选择模块:
商品id ===> 有不同产品规格 ===不同产品id 后端返回一个颜色数组和尺寸数组 ,产品数组 颜色数组 id + 尺寸数组 id 5_5 ===> 去找产品数组对应id,再提交
-
登录模块:
调用wx.getUserProfile和wx.login方法返回用户加密的信息,然后提交给后台,后台在返回用户资料和token
-
支付模块:
调用wx.requestPayment这个api
2.注意事项(bug)
-
封装request.js;里面封装axios,配置基准地址,请求拦截器,响应拦截器 发起请求会用getApp()方法解构出axios实例,再发请求 但是⭐独立分包(优惠活动页面)不能引入,会报错(独立分包不能加载主包资源)
-
开发者,体验者权限。不校验域名以及https证书
看包体积,后台布置接口到线上,把后台接口放入合法域名白名单中,项目地址换为线上地址再提交
-
tabbar有缓存,只会触发一次onload ===> onshow
tabbar 进来放onshow;非tabbar放onload
<view hidden="true"></view> ====================<div></div>
<rich-text nodes="{{str}}"></rich-text> ========== v-html
<text></text>===================== <span></span>
wx.getStroageSync
1.⭐⭐生命周期
1.应用生命周期app
1.onLaunch:当小程序初始化完成时,全局只触发一次
2.onShow:当小程序启动,或从后台进入前台显示
3.onHide:当小程序从前台进入后台,会触发 4.onError:当小程序发生脚本错误,或者 api 调用失败时,会触发 onError 并带上错误信息
onError: function (msg) {}
2.页面生命周期page
3.组件生命周期component
lifetimes: {
created() {
// 在组件实例刚刚被创建时执行⭐
},
attached() {
// ⭐⭐在组件实例进入页面节点树后⭐⭐
},
ready() {
// 在组件在视图层布局完成后执行
},
moved() {
// 在组件实例被移动到节点树另一个位置时执行
},
detached() {
// 在组件实例被从页面节点树移除时执行⭐
},
error(err) {
// 每当组件方法抛出错误时执行
}
},
//组件所在页面生命周期;让组件可以捕捉页面变换
pageLifetimes: {
show() {
// 页面被展示
},
hide() {
// 页面被隐藏
},
resize(size) {
// 页面尺寸变化(横屏)
},
},
2.基本语法
1.插值语法以及修改data
2.wx:for循环
wx:for 必须要配合 wx:key
3.post及get请求
发起post,get请求优化
1.在pages同级目录下创建utils目录放入request.js文件
2.在app.js中引入request.js
3.login.js中用getApp()方法引入axios
4.发请求:
4.关闭下拉刷新
3.⭐⭐页面导航
1.声明式导航
⭐⭐【总结】小程序里面页面传参依靠的是URL上面的查询参数,但是不能给tabBar页面传递
1.导航到 tabBar 页面
<navigator url="/pages/home/home" open-type="switchTab">跳转到tabBar页面</navigator>
url表示要跳转的 页面的地址,必须以/开头open-type表示 跳转的方式 ,必须为switchTab
2.导航到非 tabBar 页面
<navigator url="/pages/event/event" open-type="navigate">跳转到 非tabBar页面</navigator>
// ⭐传参⭐ //
<navigator url="/pages/event/event?id=10&tom=1" >跳转到非 tabBar页面</navigator>
url表示要跳转的 页面的地址,必须以/开头open-type表示 跳转的方式 ,必须为navigate
3.后退导航
如果要后退到上一页面或多级页面,则需要指定 open-type 属性和 delta 属性,例如:
<navigator open-type="navigateBack">后退导航</navigator>
open-type的值必须是navigateBack,表示要进行后退导航delta的值必须是数字,表示要后退的层级- 后退导航不用配置
url - 后退导航在
tabBar页面是无效的
2.编程式导航
1.导航到 tabBar 页面
调用wx.switchTab({...})方法,可以跳转到 tabBar 页面,其中 Object 参数对象的属性列表如下:
| 属性 | 类型 | 是否必选 | 说明 |
|---|---|---|---|
| url | string | 是 | 需要跳转的 tabBar 页面的路径 ,路径后不能带参数。 |
| success | function | 否 | 接口调用成功的回调函数 |
| fail | function | 否 | 接口调用失败的回调函数 |
| complete | function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
tabFn(){
wx.switchTab({
url:'/pages/home/home'
})
}
2.导航到非tabBar 页面
调用wx.navigateTo({...})方法,可以跳转到非 tabBar 的页面。其中 Object 参数对象的属性列表如下
| 属性 | 类型 | 必填 | 说明 |
|---|---|---|---|
| url | string | 是 | 需要跳转的应用内非tabBar 的页面的路径, 路径后可以带参数 |
| success | function | 否 | 接口调用成功的回调函数 |
| fail | function | 否 | 接口调用失败的回调函数 |
| complete | function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
tabFn(){
wx.navigateTo({
url:'/pages/home/home'
// ⭐传参⭐
url:"/pages/event/event?id=10&tom=1"
})
}
3.后退导航
调用wx.navigateBack({ ... }) 方法,可以返回上一页面或多级页面。其中 Object 参数对象可选的属性列表如下:
| 属性 | 类型 | 默认值 | 必填 | 说明 |
|---|---|---|---|---|
| delta | number | 1 | 否 | 返回的页面数,如果delta 大于现有页面数,则返回到首页。 |
| success | function | 否 | 接口调用成功的回调函数 | |
| fail | function | 否 | 接口调用失败的回调函数 | |
| complete | function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
tabFn(){
wx.navigateBack({
delta:1
})
}
3.接收参数
4.⭐⭐分包
分包指的是把一个 完整的小程序项目,按照需求划分为不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载
可以优化小程序首次启动的下载时间
TabBar必须在主包
相当于路由懒加载
分包的加载规则
- 在小程序启动时,默认会下载 主包并启动主包内页面
- 当用户进入分包内某个页面时,客户端会把对应分包下载下来,下载完成后再进行展示
每个包最多2mb,主包 + 所有分包最多20mb
1.引用原则
① 主包无法引用分包内的私有资源
② 分包之间不能相互引用私有资源
③ 分包可以引用主包内的公共资源
2.独立分包
- 具有一定功能独立性的页面配置到独立分包中,不依赖主包,独立运行,提升分包页面的启动速度
- 普通分包必须依赖于主包才能运行
- 和普通分包对比, 独立分包就是在 subpackages 数组的某个元素中, 配置 independent 为true即可
- 独立分包和普通分包以及主包之间,是相互隔绝的,不能相互引用彼此的资源
- 临时加的广告也或活动页面
3.分包预加载
在进入小程序的某个页面时,由框架自动预下载可能需要的分包,从而提升进入后续分包页面时的启动速度。
同一个分包中的页面享有共同的预下载大小限额 2M;packages和上面的name对应
5.wxs语法
- 不能写es6,遵循commonJs规范
6.组件
1.局部引用
2.全局引用
7.组件样式
自定义组件的样式只对当前组件有效,不会影响组件之外的UI结构
在组件和引用组件的页面中建议使用class选择器, 不要使用id、属性、标签选择器!
只有class选择器才有样式隔离效果
8.⭐⭐父子通信
1.方法数据
2.父传子
无单向数据流,可以修改props
3.子传父
4.父子
9.监听器
10.插槽
1.单个插槽
2.多个插槽(具名插槽)
11.behaviors(类似mixin)
【指南=>自定义组件=>behavior】
12.⭐⭐微信登录
暗坑:必須同時有,超時都不行
13.mobx
全局数据共享(又叫做:状态管理)是为了解决组件之间数据共享的问题。
1.全局数据共享
全局数据共享(又叫做:状态管理)是为了解决组件之间数据共享的问题。
开发中常用的全局数据共享方案有: Vuex 、 Redux 、 MobX 等。
在小程序中,可使用 mobx-miniprogram 配合 mobx-miniprogram-bindings 实现全局数据共享。其
中:
- mobx-miniprogram 用来创建 Store 实例对象
- mobx-miniprogram-bindings 用来把 Store 中的共享数据或方法,绑定到组件或页面中使用
2.安装Mobx
在项目中运行如下的命令,安装 MobX 相关的包:
npm install --save mobx-miniprogram@4.13.2 mobx-miniprogram-bindings@1.2.1
注意: MobX 相关的包安装完毕之后,记得删除 miniprogram_npm 目录后,重新构建 npm 。
3.构建Mobx的Store实例
在项目根目录下新建store文件夹,并且新建 store.js 文件
// 按需导入第三方包的方法 observable action
import { observable,action } from 'mobx-miniprogram'
// 创建Store实例对象,并导出
export const store = observable({
// 核心概念1:共享数据字段
numA:1,
numB:2,
// 核心概念2:计算属性
// 在计算属性的方法前,必须添加get修饰符,代码sum的值是只读的,无法进行修改
// 计算属性sum 依赖numA和numB的值,因此sum函数返回值就是最终的值
get sum(){
return this.numA + this.numB
},
// 核心概念3:action方法
// 定义actions方法,用来修改store中的数据
updateNum1:action(function(step){
this.numA += step
}),
updateNum2:action(function(step){
this.numB += step
})
})
4.使用Store的成员
1、页面中使用
- 页面的
js文件中
// 1. 首先 导入第三方包,将数据绑定到页面
import { createStoreBindings } from 'mobx-miniprogram-bindings'
// 2. 其次 在页面的js文件的头部导入仓库实例对象
import { store } from '../../store/store'
// 3. 绑定操作: 将仓库的东西绑定到页面中,在页面的js文件的Page方法中
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
// 调用createStoreBindings方法
// 参数1: 绑定给谁: 当前页面this
// 参数2:对象 { store:容器, fields:数据, actions:方法 }
this.storeBindings = createStoreBindings(this,{
// 映射容器的实例
store,
// 映射容器的数据字段
fields:['numA','numB','sum'],
// 映射容器修改的方法
actions:['updateNum1']
})
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
// 使用this.storeBindings,得到绑定对象
// 调用绑定对象的destroyStoreBindings 方法,进行清理销毁的工作
this.storeBindings.destroyStoreBindings()
},
// 事件处理函数,触发action
btnHandler1 (e) {
console.log(e);
// 使用仓库的中的方法,并传递数据
this.updateNum1(100)
}
})
- 页面的 wxml 文件中
<!-- 使用仓库中的数据 -->
<view>{{numA}} + {{numB}} = {{sum}}</view>
<van-button type="primary" bindtap="btnHandler1">numA+100</van-button>
2、组件中使用
- 组件的
.js文件中
// 1. 按需导入仓库实例
// 2. 在组件的behaviors节点 实现自动绑定
// 3. 在 storeBindings 节点指定要绑定的store和要绑定的数据及方法
import { storeBindingsBehavior } from 'mobx-miniprogram-bindings'
import { store } from '../../store/store'
Component({
// 通过 storeBindingsBehavior 来实现自动绑定
behaviors:[storeBindingsBehavior],
storeBindings:{
store, // 指定要绑定的store
fields:{ // 指定要绑定的数据字段和计算属性
numA: ()=>store.numA, // 绑定字段方式1
numB: store=>store.numB, // 绑定字段方式2
sum:'sum' // 绑定字段方式3
},
actions:{ // 指定要绑定的方法
updateNum2:'updateNum2'
}
},
/**
* 组件的方法列表
*/
methods: {
btnHandler2(e){
// 直接使用this调用仓库中的方法
this.updateNum2(20)
}
}
})
- 组件的
.wxml中
<!-- 组件的 .wxml 结构 -->
<view>{{ numA }} + {{ numB }} = {{ sum }} </view>
<van-button type="primary" bindtap="btnHandler2">numB+20</van-button>