一般软件的应用架构:
每个子目录中保存着一个页面的相关文件 —— 通常是4种不同扩展名的文件,
分别是页面中的逻辑文件、页面结构文件、样式表文件、配置文件;
为了减少开发时的配置项,框架特别约定描述页面的这4个文件
必须具备相同的路径和文件名
;
一个微信小程序的主体部分 由3个文件组成, 这个3个文件必须放在项目的主目录中, 3个文件的名称也是固定的(app);
微信小程序通常需要由多个页面组成,
每个页面由4个文件构成,
描述页面的这4个文件
必须具备相同的路径和文件名
,
通过4种不同扩展名来区分,扩展名的含义:
主配置文件app.json位于项目主目录中,用来对项目进行全局配置, 对所有页面都适用; 包括配置每个页面文件的路径、窗口表现、设置网络超时时间、设置多tab等。
pages
【String数组类型】:定义小程序中用到的页面;这里配置的是两个界面,“pages/index”目录下的“index”界面、“pages/logs”下的“logs”界面;window
:定义窗口的表现形式;
如tabBar
tabBar
有5个属性:list 数组
的每一项是一个JSON对象,可以设置4个属性值:网络配置
networkTimeout
属性【JSON对象类型】,
可以设置 各种 网络请求的超时时间【单位:ms】;debug
属性
可以在开发者工具中开启 debug模式,在开发者工具的 控制台面板,调试信息
以info
的形式给出,其信息有Page的注册、页面路由、数据更新和事件触发
,可以快速定位一些常见的问题;例程:
{
"pages":[
"pages/index/index",
"pages/logs/logs"
],
"window":{
"backgroundTextStyle":"dark",
"navigationBarBackgroundColor": "#0af",
"navigationBarTitleText": "WeChat",
"navigationBarTextStyle":"white"
},
"tabBar":{
"color":"#dddddd",
"selectedColor":"#3cc51f",
"borderStyle":"black",
"backgroundColor":"#ffffff",
"list":[{
"pagePath": "pages/index/index",
"text":"首页"
},{
"pagePath": "pages/logs/logs",
"text":"日志"
}]
},
"networkTimeout":{
"request":10000,
"downloadFile":10000
},
"style": "v2",
"sitemapLocation": "sitemap.json"
}
窗口表现
。无需写window
这个键,但要保留花括号;
例程:{
"navigationBarBackgroundColor":"#00aaff",
"navigationBarTextStyle":"black",
"navigationBarTitleText": "查看启动日志(Demo)",
"backgroundColor":"#eeeeee",
"backgroundTextStyle":"dark",
"usingComponents": {}
}
小程序作为前端:
document、window
等JS对象;ServiceWorker
,所以逻辑层也称之为App Service
。app.js
中进行程序的注册
,并且只能注册一次;
因此,主逻辑文件app.js
中必须包含注册
的方法;App()函数
即可,函数参数是一个JSON对象
,在这个对象中可指定小程序的生命周期函数
: onLaunch
:当小程序初始化完成
时,会触发onLaunch
,全局只触发一次;onShow
:当小程序启动
,或从后台
进入前台显示
,会触发onShow
;onHide
:当小程序从前台
进入后台
,会触发onHide
;如点击关闭按钮,或手机的返回主界面按钮离开微信时,小程序并不会直接被销毁
,只是进入了后台
,触发onHide
;(前后后台 指 小程序界面 是否展示出来)一定时间
,或手机资源占用过高
,就会被 手机系统 从后台销毁
;//app.js
App({
onLaunch: function () {
// 展示本地存储能力
var logs = wx.getStorageSync('logs') || []
logs.unshift(Date.now())
wx.setStorageSync('logs', logs)
// 登录
wx.login({
success: res => {
// 发送 res.code 到后台换取 openId, sessionKey, unionId
}
})
// 获取用户信息
wx.getSetting({
success: res => {
if (res.authSetting['scope.userInfo']) {
// 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框
wx.getUserInfo({
success: res => {
// 可以将 res 发送给后台解码出 unionId
this.globalData.userInfo = res.userInfo
// 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
// 所以此处加入 callback 以防止这种情况
if (this.userInfoReadyCallback) {
this.userInfoReadyCallback(res)
}
}
})
}
}
})
},
globalData: {
userInfo: null
}
})
App()
函数中 添加 任意名称的函数
或数据
到参数
中,以完成特定的功能
;Page() 函数
进行注册,函数参数 类似App()注册程序函数
,是一个JSON对象
,在这个对象中可定义页面的生命周期函数
,也可编写 自定义的函数
来响应页面的事件
;data
属性,用于定义页面中使用到的数据;//index.js
//获取应用实例
const app = getApp()
Page({
data: {
motto: 'Hello World',
userInfo: {},
hasUserInfo: false,
canIUse: wx.canIUse('button.open-type.getUserInfo')
},
//事件处理函数
bindViewTap: function() {
wx.navigateTo({
url: '../logs/logs'
})
},
onLoad: function () {
if (app.globalData.userInfo) {
this.setData({
userInfo: app.globalData.userInfo,
hasUserInfo: true
})
} else if (this.data.canIUse){
// 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
// 所以此处加入 callback 以防止这种情况
app.userInfoReadyCallback = res => {
this.setData({
userInfo: res.userInfo,
hasUserInfo: true
})
}
} else {
// 在没有 open-type=getUserInfo 版本的兼容处理
wx.getUserInfo({
success: res => {
app.globalData.userInfo = res.userInfo
this.setData({
userInfo: res.userInfo,
hasUserInfo: true
})
}
})
}
},
getUserInfo: function(e) {
console.log(e)
app.globalData.userInfo = e.detail.userInfo
this.setData({
userInfo: e.detail.userInfo,
hasUserInfo: true
})
}
})
data
中,初始化数据 将作为页面的第一次渲染;data
将会以JSON
的形式 由 逻辑层 传至 视图层
,所以其 数据
必须是可以转成 JSON格式的数据
,如字符串、数字、布尔值、对象、数组
等;如上,在data中定义了motto【字符串】,定义了userInfo【空对象】;wxml
对 data中定义的数据
进行绑定;Page()函数
的参数中,可定义当前界面
的生命周期函数
参考自《从零开始学微信小程序开发》