一、小程序代码组成
1、工程目录
├── pages //页面目录
│ │── index //页面index
│ │ ├── index.wxml //页面HTML
│ │ ├── index.js //页面脚本
│ │ ├── index.json //页面配置(可选)
│ │ └── index.wxss //页面CSS(可选)
│ └── logs //页面logs
│ ├── logs.wxml
│ └── logs.js
├── utils //插件目录
├── app.js //启动脚本
├── app.json //全局配置
├── app.wxss //全局CSS(可选)
├── project.config.json //工具配置
2、JSON配置
{
"pages" : [
"pages/index/index" ,
"pages/logs/logs"
] ,
"window" : {
"backgroundTextStyle" : "light" ,
"navigationBarBackgroundColor" : "#fff" ,
"navigationBarTitleText" : "WeChat" ,
"navigationBarTextStyle" : "black"
}
}
JSON的值只能是以下几种数据格式:
数字,包含浮点数和整数 字符串,需要包裹在双引号中 Bool值,true 或者 false 数组,需要包裹在方括号中 [] 对象,需要包裹在大括号中 {} Null
3、WXML模板
< text> 当前时间:{{time}}</ text>
< text data-test = " {{test}}" > hello world</ text>
< text> {{ a === 10? "变量 a 等于10": "变量 a 不等于10"}}</ text>
< view> {{a + b}} + {{c}} + d </ view>
< view wx: if= " {{length > 5}}" > 1 </ view>
< view wx: elif= " {{length > 2}}" > 2 </ view>
< view wx: else> 3 </ view>
< view wx: for= " {{array}}" >
{{index}}: {{item.message}}
</ view>
< view wx: for= " {{array}}" wx: for-index= " idx" wx: for-item= " itemName" >
{{idx}}: {{itemName.message}}
</ view>
< switch wx: for= " {{objectArray}}" wx: key= " id" > {{item.id}} </ switch>
< switch wx: for= " {{numberArray}}" wx: key= " *this" > {{item}} </ switch>
< template name = " temp1" >
< view>
< text> {{index}}: {{msg}} </ text>
< text> Time: {{time}} </ text>
</ view>
</ template>
< template name = " temp2" > ……</ template>
< template is = " temp1" data = " {{...item}}" />
< template is = " {{item.index == 0 ? 'temp1' : 'temp2'}}" />
< import src = " item.wxml" />
< include src = " header.wxml" />
属性名 类型 描述 注解 id String 组件的唯一标识 整个页面唯一 class String 组件的样式类 在对应的 WXSS 中定义的样式类 style String 组件的内联样式 可以动态设置的内联样式 hidden Boolean 组件是否显示 所有组件默认显示 data-* Any 自定义属性 组件上触发的事件时,会发送给事件处理函数 bind*/catch* EventHandler 组件的事件
4、WXSS样式
.icon {
width : 100rpx; //在一个宽度为375物理像素的屏幕下,1rpx = 1px
height : 200rpx;
}
@import './test.wxss'
< view style = " color : red; font-size : 48rpx" > </ view>
< view style = " color: { { eleColor} } ; font-size: { { eleFontsize} } " > </ view>
选择器 类型 描述 #id id选择器 选择拥有 id=“*” 的组件 .class 类选择器 选择所有拥有 class=“*” 的组件 element 元素选择器 选择所有文档的*组件 ::after 伪元素选择器 在*组件后边插入内容 ::before 伪元素选择器 在*组件前边插入内容
优先级:!important
> style=""
> #id
> .class
> element
5、JavaScript脚本
module. exports = function ( value ) {
return value * 2 ;
}
var multiplyBy2 = require ( './moduleA' )
var result = multiplyBy2 ( 4 )
App ( {
globalData : 1
} )
var global = getApp ( )
global. globalData++
global. globalValue = 'globalValue'
脚本的执行顺序: step1、根据 app.js 中 require 的模块顺序决定文件的运行顺序 step2、按照 app.json 中定义的 pages 的顺序,逐一执行JS
运行环境 逻辑层 渲染层 iOS平台 JavaScriptCore WKWebView Android平台 X5 JSCore X5浏览器 小程序IDE NWJS Chrome WebView
二、理解小程序宿主环境
1、程序
App ( {
onLaunch : function ( options ) { } ,
onShow : function ( options ) { } ,
onHide : function ( ) { } ,
onError : function ( msg ) { } ,
globalData : 'I am global data'
} )
var appInstance = getApp ( )
appInstance. globalData = 'change data'
参数属性 类型 描述 onLaunch Function 当小程序初始化完成时,会触发 onLaunch(全局只触发一次) onShow Function 当小程序启动,或从后台进入前台显示,会触发 onShow onHide Function 当小程序从前台进入后台,会触发 onHide onError Function 当小程序发生脚本错误,或者 API 调用失败时,会触发 onError 并带上错误信息 其他 Any 可以添加任意的函数或数据到 Object 参数中,在App实例回调用 this 可以访问
onLaunch,onShow参数(options):
字段 类型 描述 path String 打开小程序的页面路径 query Object 打开小程序的页面参数query scene Number 打开小程序的场景值,详细场景值请参考小程序官方文档 shareTicket String shareTicket,详见小程序官方文档 referrerInfo Object 当场景为由从另一个小程序或公众号或App打开时,返回此字段 referrerInfo.appId String 来源小程序或公众号或App的 appId,详见下方说明 referrerInfo.extraData Object 来源小程序传过来的数据,scene=1037或1038时支持
以下场景支持返回 referrerInfo.appId:
场景值 场景 appId信息含义 1020 公众号 profile 页相关小程序列表 返回来源公众号 appId 1035 公众号自定义菜单 返回来源公众号 appId 1036 App 分享消息卡片 返回来源应用 appId 1037 小程序打开小程序 返回来源小程序 appId 1038 从另一个小程序返回 返回来源小程序 appId 1043 公众号模板消息 返回来源公众号 appId
2、页面
Page ( {
data : { text : "This is page data." } ,
onLoad : function ( option ) { } ,
onShow : function ( ) { } ,
onReady : function ( ) { } ,
onHide : function ( ) { } ,
onUnload : function ( ) { } ,
onPullDownRefresh : function ( ) { } ,
onReachBottom : function ( ) { } ,
onPageScroll : function ( option ) { } ,
onShareAppMessage : function ( ) { }
} )
wx. navigateTo ( { url : 'pages/detail/detail?id=1&other=abc' } )
Page ( {
onLoad : function ( option ) {
console. log ( option. id, option. other)
this . setData ( {
text : 'change data'
} , function ( ) { } )
}
} )
onPageScroll : function ( option ) {
console. log ( option. scrollTop)
}
onShareAppMessage : function ( ) {
return {
title : '自定义转发标题' ,
path : '/page/user?id=123'
}
}
参数属性 类型 描述 data Object 页面的初始数据 onLoad Function 生命周期函数–监听页面加载,触发时机早于onShow和onReady onShow Function 生命周期函数–监听页面显示,触发事件早于onReady onReady Function 生命周期函数–监听页面初次渲染完成 onHide Function 生命周期函数–监听页面隐藏 onUnload Function 生命周期函数–监听页面卸载 onPullDownRefresh Function 页面相关事件处理函数–监听用户下拉动作 onReachBottom Function 页面上拉触底事件的处理函数 onShareAppMessage Function 用户点击右上角转发 onPageScroll Function 页面滚动触发事件的处理函数 其他 Any 可以添加任意的函数或数据,在Page实例的其他函数中用 this 可以访问
触发时机 路由方式 路由前生命周期 路由后生命周期 小程序打开的第一个页面 初始化 onLoad, onShow wx.navigateTo 打开新页面 调用 onHide onLoad, onShow wx.redirectTo 页面重定向 调用 onUnload onLoad, onShow wx.navigateBack 页面返回 调用 onUnload onShow wx.switchTab Tab切换 调用 …… …… wx.reLaunch 重启动 调用 onUnload onLoad, onShow
当前页面 切换页面 触发的生命周期(按顺序) TabA TabB A.onHide(), B.onLoad(), B.onShow() TabA TabB(已打开过) A.onHide(), B.onShow() AtoC TabA C.onUnload(), A.onShow() AtoC TabB C.onUnload(), B.onLoad(), B.onShow() CtoD TabB D.onUnload(), C.onUnload(), B.onLoad(), B.onShow() CtoD(转发进入) TabA D.onUnload(), A.onLoad(), A.onShow() CtoD(转发进入) TabB D.onUnload(), B.onLoad(), B.onShow()
3、API
wx. request ( {
url : 'test.php' ,
success : function ( res ) { } ,
fail : function ( ) { } ,
complete : function ( ) { }
} )
接口前缀 参数 描述 wx.on* callback(回调函数) 监听某个事件发生的接口类 wx.get* 获取宿主环境数据的接口类 wx.set* 写入数据到宿主环境的接口类 …… 其他接口类
参数名称 类型 必填 描述 success Function 否 接口调用成功的回调函数 fail Function 否 接口调用失败的回调函数 complete Function 否 接口调用结束的回调函数(调用成功、失败都会执行)
4、事件
< view id = " touch1" bind: touchstart= " onTouch" > Touch me! </ view>
< view id = " touch2" catch: touchstart= " onTouch" > Touch me! </ view>
< view id = " outer" bind: tap= " onTap1" capture-bind: tap= " onTap2" >
< view id = " inner" bind: tap= " onTap3" capture-bind: tap= " onTap4" > 点击我!</ view>
</ view>
< view id = " outer" bind: tap= " onTap1" capture-catch: tap= " onTap2"
>
< view id = " inner" bind: tap= " onTap3" capture-bind: tap= " onTap4" > 点击我!</ view>
</ view>
Page ( {
onTouch : function ( event ) {
console. log ( event)
} ,
onTap2 : function ( event ) {
console. log ( event. target)
console. log ( event. currentTarget)
}
} )
类型 触发条件 touchstart 手指触摸动作开始 touchmove 手指触摸后移动 touchcancel 手指触摸动作被打断,如来电提醒,弹窗 touchend 手指触摸动作结束 tap 手指触摸后马上离开 longpress 手指触摸后,超过350ms再离开,如果指定了事件回调函数并触发了这个事件,tap事件将不被触发 longtap 手指触摸后,超过350ms再离开(推荐使用longpress事件代替) transitionend 会在 WXSS transition 或 wx.createAnimation 动画结束后触发 animationstart 会在一个 WXSS animation 动画开始时触发 animationiteration 会在一个 WXSS animation 一次迭代结束时触发 animationend 会在一个 WXSS animation 动画完成时触发
属性 类型 说明 type String 事件类型 timeStamp Integer 页面打开到触发事件所经过的毫秒数 target Object 触发事件的源头组件的一些属性值集合 currentTarget Object 绑定事件的当前组件的一些属性值集合 detail Object 额外的信息 touches Array 触摸事件,当前停留在屏幕中的触摸点信息的数组 changedTouches Array 触摸事件,当前变化的触摸点信息的数组
target和currentTarget对象属性:
属性 类型 说明 id String 当前组件的id tagName String 当前组件的类型 dataset Object 当前组件上data-*自定义属性组成的集合
touch和changedTouches对象属性:
属性 类型 说明 identifier Number 触摸点的标识符 pageX, pageY Number 距离文档左上角的距离,文档的左上角为原点 clientX, clientY Number 距离页面可显示区域(屏幕除去导航条)左上角距离
5、兼容
wx. getSystemInfo ( {
success ( res ) { }
} )
try {
const res = wx. getSystemInfoSync ( )
} catch ( e) { }
if ( wx. openBluetoothAdapter) {
wx. openBluetoothAdapter ( )
} else {
wx. showModal ( {
title : '提示' ,
content : '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试'
} )
}
wx. canIUse ( 'openBluetoothAdapter' )
wx. canIUse ( 'getSystemInfoSync.return.screenWidth' )
wx. canIUse ( 'getSystemInfo.success.screenWidth' )
wx. canIUse ( 'showToast.object.image' )
wx. canIUse ( 'onCompassChange.callback.direction' )
wx. canIUse ( 'request.object.method.GET' )
wx. canIUse ( 'contact-button' )
wx. canIUse ( 'text.selectable' )
wx. canIUse ( 'button.open-type.contact' )
参数段 说明 有效值 ${API} API 名字 ${method} 调用方式 return, success, object, callback ${param} 参数或者返回值 ${options} 参数的可选值 ${component} 组件名字 ${attribute} 组件属性 ${option} 组件属性的可选值
三、场景应用
1、基本的布局方法——Flex布局
// 内容不确定的容器中实现垂直居中
.container {
display : flex; // 定义为弹性容器
flex-direction : column; // 项目从上到下垂直排列
justify-content : center; // 项目在水平轴上居中无缝排列
}
1.1 容器属性:设置容器内项目布局,也就是管理项目的排列方式和对齐方式
flex-direction属性:通过设置坐标轴,来设置项目排列方向
属性值 描述 row (默认值)项目沿主轴排列,从左到右排列 row-reverse 项目沿主轴排列,从右到左排列 column 项目沿主轴排列,从上到下排列 column-reverse 项目沿主轴排列,从下到上排列
flex-wrap属性:设置是否允许项目多行排列,以及多行排列时换行的方向
属性值 描述 nowrap (默认值)不换行。如果单行内容过多,则溢出容器 wrap 容器单行容不下所有项目时,换行排列 wrap-reverse 容器单行容不下所有项目时,向上换行排列
justify-content属性:设置项目在主轴方向上对齐方式,以及分配项目之间及其周围多余的空间
属性值 描述 flex-start (默认值)项目对齐主轴起点,项目间不留空隙 center 项目在主轴上居中排列,项目间不留空隙 flex-end 项目对齐主轴终点,项目间不留空隙 space-between 项目间间距相等,第一个项目离主轴起点和最后一个项目离主轴终点距离为0 space-around 第一个项目离主轴起点和最后一个项目离主轴终点距离为中间项目间间距的一半 space-evenly 项目间间距、第一个项目离主轴起点和最后一个项目离主轴终点距离等于项目间间距
align-items属性:设置项目在容器的当前行的侧轴(纵轴)方向上的对齐方式
属性值 描述 stretch (默认值)项目拉伸至填满行高 flex-start 项目顶部与行起点对齐 center 项目在行中居中对齐 flex-end 项目底部与行终点对齐 baseline 项目的第一行文字的基线对齐
align-content属性:多行排列时,设置行在交叉轴方向上的对齐方式,以及分配行之间及其周围多余的空间
属性值 描述 stretch (默认值)当未设置项目尺寸,将各行中的项目拉伸至填满交叉轴。当设置了项目尺寸,项目尺寸不变,项目行拉伸至填满交叉轴 flex-start 首行在交叉轴起点开始排列,行间不留间距 center 行在交叉轴中点排列,行间不留间距,首行离交叉轴起点和尾行离交叉轴终点距离相等 flex-end 尾行在交叉轴终点开始排列,行间不留间距 space-between 行与行间距相等,首行离交叉轴起点和尾行离交叉轴终点距离为0 space-around 行与行间距相等,首行离交叉轴起点和尾行离交叉轴终点距离为行与行间间距的一半 space-evenly 行间间距、以及首行离交叉轴起点和尾行离交叉轴终点距离相等
1.2 项目属性:设置项目的尺寸、位置,以及对项目的对齐方式做特殊设置
order属性:设置项目沿主轴方向上的排列顺序,数值越小,排列越靠前。属性值为整数
flex-shrink属性:当项目在主轴方向上溢出时,通过设置项目收缩因子来压缩项目适应容器。属性值为项目的收缩因子,属性值取非负数
.itemA {
width : 120px; // 原始宽度
flex-shrink : 2; // 收缩因子(默认值为1)
}
设容器的宽度为
w
C
w_C
w C ,项目A、B、C的原始宽度分别为
w
a
0
{w_a}_0
w a 0 、
w
b
0
{w_b}_0
w b 0 、
w
c
0
{w_c}_0
w c 0 ,收缩因子分别为
s
a
s_a
s a 、
s
b
s_b
s b 、
s
c
s_c
s c ; ① 若
s
a
+
s
b
+
s
c
≥
1
s_a + s_b + s_c ≥ 1
s a + s b + s c ≥ 1 ,则项目A的实际宽度为(向下取整):
w
a
1
=
w
a
0
−
w
a
0
∗
s
a
∗
∣
w
C
−
(
w
a
0
+
w
b
0
+
w
c
0
)
∣
(
w
a
0
∗
s
a
+
w
b
0
∗
s
b
+
w
c
0
∗
s
c
)
{w_a}_1 = {w_a}_0 - \frac{{w_a}_0 * s_a * |w_C - ({w_a}_0 + {w_b}_0 + {w_c}_0)|}{({w_a}_0 * s_a + {w_b}_0 * s_b + {w_c}_0 * s_c)}
w a 1 = w a 0 − ( w a 0 ∗ s a + w b 0 ∗ s b + w c 0 ∗ s c ) w a 0 ∗ s a ∗ ∣ w C − ( w a 0 + w b 0 + w c 0 ) ∣ ② 若
s
a
+
s
b
+
s
c
<
1
s_a + s_b + s_c < 1
s a + s b + s c < 1 ,则项目A的实际宽度为(向下取整):
w
a
1
=
w
a
0
−
w
a
0
∗
s
a
∗
∣
w
C
−
(
w
a
0
+
w
b
0
+
w
c
0
)
∣
∗
(
s
a
+
s
b
+
s
c
)
(
w
a
0
∗
s
a
+
w
b
0
∗
s
b
+
w
c
0
∗
s
c
)
{w_a}_1 = {w_a}_0 - \frac{{w_a}_0 * s_a * |w_C - ({w_a}_0 + {w_b}_0 + {w_c}_0)| * (s_a + s_b + s_c)}{({w_a}_0 * s_a + {w_b}_0 * s_b + {w_c}_0 * s_c)}
w a 1 = w a 0 − ( w a 0 ∗ s a + w b 0 ∗ s b + w c 0 ∗ s c ) w a 0 ∗ s a ∗ ∣ w C − ( w a 0 + w b 0 + w c 0 ) ∣ ∗ ( s a + s b + s c )
flex-grow属性:当项目在主轴方向上还有剩余空间时,通过设置项目扩张因子进行剩余空间的分配。属性值为项目的扩张因子,属性值取非负数
.itemA {
width : 120px; // 原始宽度
flex-grow : 1; // 扩张因子(默认值为0)
}
设容器的宽度为
w
C
w_C
w C ,项目A、B、C的原始宽度分别为
w
a
0
{w_a}_0
w a 0 、
w
b
0
{w_b}_0
w b 0 、
w
c
0
{w_c}_0
w c 0 ,扩张因子分别为
g
a
g_a
g a 、
g
b
g_b
g b 、
g
c
g_c
g c ; ① 若
g
a
+
g
b
+
g
c
≥
1
g_a + g_b + g_c ≥ 1
g a + g b + g c ≥ 1 ,则项目A的实际宽度为(向下取整):
w
a
1
=
w
a
0
+
∣
w
C
−
(
w
a
0
+
w
b
0
+
w
c
0
)
∣
g
a
+
g
b
+
g
c
∗
g
a
{w_a}_1 = {w_a}_0 + \frac{|w_C - ({w_a}_0 + {w_b}_0 + {w_c}_0)|}{g_a + g_b + g_c} * g_a
w a 1 = w a 0 + g a + g b + g c ∣ w C − ( w a 0 + w b 0 + w c 0 ) ∣ ∗ g a ② 若
g
a
+
g
b
+
g
c
<
1
g_a + g_b + g_c < 1
g a + g b + g c < 1 ,则项目A的实际宽度为(向下取整):
w
a
1
=
w
a
0
+
∣
w
C
−
(
w
a
0
+
w
b
0
+
w
c
0
)
∣
∗
g
a
{w_a}_1 = {w_a}_0 + |w_C - ({w_a}_0 + {w_b}_0 + {w_c}_0)| * g_a
w a 1 = w a 0 + ∣ w C − ( w a 0 + w b 0 + w c 0 ) ∣ ∗ g a
flex-basis属性:设置或检索弹性盒伸缩基准值
// 水平伸缩
.item {
width : auto | <number>px | <number>%
flex-direction : row | row-reverse
flex-basis : auto | <number>px // 优先级更高时替换width属性值(默认值auto)
}
// 垂直伸缩
.item {
height : auto | <number>px | <number>%
flex-direction : column | column-reverse
flex-basis : auto | <number>px // 优先级更高时替换height属性值(默认值auto)
}
样式场景 优先级 width(height): auto; flex-basis: auto; flex-basis > width(height) width(height): auto; flex-basis: 200px; flex-basis > width(height) width(height): 100px; flex-basis: 200px; flex-basis > width(height) width(height): 100px; flex-basis: auto; width(height) > flex-basis
flex属性:是flex-grow,flex-shrink,flex-basis的简写方式
.item {
flex : none | auto | @flex-grow @flex-shrink @flex-basis
// flex : none; => flex : 0 0 auto;
// flex : auto; => flex : 1 1 auto;
}
align-self属性:覆盖容器的align-items,对项目在纵轴方向上的对齐方式做特殊处理
属性值 描述 auto (默认值)继承父容器的 align-items 属性。如果没有父容器则为 “stretch” stretch 项目拉伸至填满行高 flex-start 项目顶部与行起点对齐 center 项目在行中居中对齐 flex-end 项目底部与行终点对齐 baseline 项目的第一行文字的基线对齐
2、发起HTTPS网络通信
wx. request ( {
url : 'https://test.com/getinfo?id=1&version=1.0.0' ,
success : function ( res ) { }
} )
wx. request ( {
url : 'https://test.com/getinfo' ,
method : 'POST' ,
header : { 'content-type' : 'application/json' } ,
data : {
id : 1 ,
version : [ '1.0.0' , '1.2.3' ] ,
info : {
name : 'test'
}
} ,
success : function ( res ) { }
} )
参数名 类型 必填 默认值 描述 url String 是 开发者服务器接口地址 data Object/String 否 请求的参数 header Object 否 设置请求的 header,header 中不能设置 Referer,默认header[‘content-type’] = ‘application/json’ method String 否 GET (需大写)有效值:OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT dataType String 否 json 回包的内容格式,如果设为json,会尝试对返回的数据做一次 JSON解析 success Function 否 收到开发者服务成功返回的回调函数,其参数是一个Object fail Function 否 接口调用失败的回调函数 complete Function 否 接口调用结束的回调函数(调用成功、失败都会执行)
参数名 类型 描述 data Object/String(根据header[‘content-type’]决定) 开发者服务器返回的数据 statusCode Number 开发者服务器返回的 HTTP 状态码 header Object 开发者服务器返回的 HTTP Response Header
排查异常的方法:
检查手机网络状态以及wifi连接点是否工作正常; 检查小程序是否为开发版或者体验版,因为开发版和体验版的小程序不会校验域名; 检查对应请求的HTTPS证书是否有效,同时TLS的版本必须支持1.2及以上版本,可以在开发者工具的console面板输入showRequestInfo()查看相关信息; 域名不要使用IP地址或者localhost,并且不能带端口号,同时域名需要经过ICP备案; 检查app.json配置的超时时间配置是否太短,超时时间太短会导致还没收到回报就触发fail回调; 检查发出去的请求是否302到其他域名的接口,这种302的情况会被视为请求别的域名接口导致无法发起请求。
3、微信登录
wx. login ( {
success : function ( res ) {
if ( res. code) {
wx. request ( {
url : 'https://test.com/login' ,
data : {
username : 'zhangsan' ,
password : 'pwd123456' ,
code : res. code
} ,
success : function ( ress ) {
if ( ress. statusCode === 200 ) {
console. log ( ress. data. userid)
console. log ( ress. data. session_key)
wx. request ( {
url : 'https://api.weixin.qq.com/sns/jscode2session' ,
data : {
appid : 'wx0a93946bf7a96d4b' ,
secret : 'xxxxxxxx' ,
js_code : res. code,
grant_type : 'authorization_code'
} ,
success : function ( resss ) {
if ( resss. statusCode === 200 ) {
console. log ( resss. data. openid)
console. log ( resss. data. session_key)
var user = {
userid : ress. data. userid,
openid : resss. data. openid
}
}
}
} )
}
}
} )
} else {
console. log ( res. errMsg)
}
}
} )
4、本地数据缓存
wx. getStorage ( {
key : 'key1' ,
success : function ( res ) {
console. log ( res. data)
} ,
fail : function ( ) { }
} )
try {
var value2 = wx. getStorageSync ( 'key2' )
} catch ( e) { }
wx. setStorage ( {
key : "key" ,
data : "value1"
success : function ( ) { } ,
fail : function ( ) { }
} )
try {
wx. setStorageSync ( 'key' , 'value2' )
} catch ( e) { }
var app = getApp ( )
Page ( {
onLoad : function ( ) {
wx. login ( {
success : function ( res ) {
wx. request ( {
url : 'https://test.com/login' ,
data : { code : res. code } ,
success : function ( res ) {
app. globalData. sessionId = res. data. sessionId
wx. setStorageSync ( 'SESSIONID' , res. data. sessionId)
var expiredTime = + new Date ( ) + 1 * 24 * 60 * 60 * 1000
app. globalData. expiredTime = expiredTime
wx. setStorageSync ( 'EXPIREDTIME' , expiredTime)
}
} )
}
} )
}
} )
App ( {
onLaunch : function ( options ) {
var sessionId = wx. getStorageSync ( 'SESSIONID' )
var expiredTime = wx. getStorageSync ( 'EXPIREDTIME' )
var now = + new Date ( )
if ( now - expiredTime <= 1 * 24 * 60 * 60 * 1000 ) {
this . globalData. sessionId = sessionId
this . globalData. expiredTime = expiredTime
}
} ,
globalData : {
sessionId : null ,
expiredTime : 0
}
} )
wx.getStorage/wx.getStorageSync详细参数:
参数名称 类型 必填 描述 key String 是 本地缓存中指定的key success Function 否 异步接口调用成功的回调函数,回调参数格式: {data: key对应的内容} fail Function 否 异步接口调用失败的回调函数 complete Function 否 异步接口调用结束的回调函数(调用成功、失败都会执行)
wx.setStorage/wx.setStorageSync详细参数:
参数名称 类型 必填 描述 key String 是 本地缓存中指定的key data Object/String 是 需要存储的内容 success Function 否 异步接口调用成功的回调函数 fail Function 否 异步接口调用失败的回调函数 complete Function 否 异步接口调用结束的回调函数(调用成功、失败都会执行)
5、设备能力
wx. scanCode ( {
success : function ( res ) {
console. log ( res. result)
}
} )
wx. getNetworkType ( {
success : function ( res ) {
if ( res. networkType == 'wifi' ) {
wx. downloadFile ( {
url : 'http://test.com/somefile.pdf' ,
success : function ( res ) {
wx. openDocument ( {
filePath : res. tempFilePath
} )
}
} )
} else {
wx. showToast ( { title : '建议使用wifi网络进行下载' } )
}
}
} )
wx. onNetworkStatusChange ( { } )