一般软件的应用架构:



每个子目录中保存着一个页面的相关文件 —— 通常是4种不同扩展名的文件,
分别是页面中的逻辑文件、页面结构文件、样式表文件、配置文件;
为了减少开发时的配置项,框架特别约定描述页面的这4个文件必须具备相同的路径和文件名;
一个微信小程序的主体部分 由3个文件组成, 这个3个文件必须放在项目的主目录中, 3个文件的名称也是固定的(app);
微信小程序通常需要由多个页面组成,
每个页面由4个文件构成,
描述页面的这4个文件必须具备相同的路径和文件名,
通过4种不同扩展名来区分,扩展名的含义:
主配置文件app.json位于项目主目录中,用来对项目进行全局配置, 对所有页面都适用; 包括配置每个页面文件的路径、窗口表现、设置网络超时时间、设置多tab等。

pages【String数组类型】:定义小程序中用到的页面;这里配置的是两个界面,“pages/index”目录下的“index”界面、“pages/logs”下的“logs”界面;window:定义窗口的表现形式;
如
tabBartabBar有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()函数的参数中,可定义当前界面的生命周期函数 参考自《从零开始学微信小程序开发》