wxml 类比 html 页面描述文件
js 页面逻辑文件
wxss 类比 css 样式表文件
主目录中,
3个app开头的文件就是微信小程序框架的主描述文件,
这3个文件不属于任何页面;
pages目录下还有2个子目录——index、logs:
每个子目录中保存着一个页面的相关文件 —— 通常是4种不同扩展名的文件,描述页面的这4个文件
必须具备相同的路径和文件名
;一个微信小程序的主体部分 由3个文件组成,
这个3个文件必须放在项目的主目录中,
3个文件的名称也是固定的(app);
微信小程序通常需要由多个页面组成,
每个页面由4个文件构成,描述页面的这4个文件
必须具备相同的路径和文件名
,
通过4种不同扩展名来区分,扩展名的含义:
小程序开发中,除了上述文件外,
一般还会用到图片、音视频、通用js模块等文件,
这些文件可放置在项目中的任何位置,在调用时指定相对目录即可。
图片、音视频等资源类的文件也可以单独创建子目录存放。
大文件放在后端即可。
主配置文件app.json位于项目主目录中,用来对项目进行全局配置,
对所有页面都适用;
包括配置每个页面文件的路径、窗口表现、设置网络超时时间、设置多tab等。
配置文件的内容 即 一个JSON对象;
属性pages
【String数组类型】:定义小程序中用到的页面;
这里配置的是两个界面,
“pages/index”目录下的“index”界面、“pages/logs”下的“logs”界面;
属性window
:定义窗口的表现形式;
如
配置窗口底部tabBar
app.json中加一个“tabBar”属性(数组类型),
最少配置2个、最多5个tab;
tab按数组的顺序排序;
每个tab可配置显示的文字、图标等选项;
对于整个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": {}
}
小程序作为前端:
通常要对 从后端接收到数据进行进一步的加工;
界面中的数据也可能会 根据数据的变化 而改变;
这些都需要前端的逻辑代码实现;
小程序分逻辑层和视图层;
逻辑层将数据进行处理后 发送给 视图层,
同时接受视图层的 事件反馈。
官方为方便小程序开发,
在JS的基础上做了封装和修改:
提供了App 和 Page 方法,用来进行程序和页面的注册;
提供丰富的API,如扫一扫、支付 等微信特有能力;
每个页面有 独立的作用域, 并提供模块化能力;
由于框架没有运行在浏览器中,
所以JS在Web中的一些能力无法使用,
如不能方法document、window
等JS对象;
开发者写的所有代码 最终将被打包成一份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
}
})
上述代码中,
只定义了onLaunch函数,没定义onShow、onHide函数,
这3个函数其实都不是必须的,按需定义即可;
开发者可以在App()
函数中 添加 任意名称的函数
或数据
到参数
中,以完成特定的功能
;
小程序中每个页面 必须使用 Page() 函数
进行注册,
函数参数 类似App()注册程序函数
,是一个JSON对象
,
在这个对象中可定义页面的生命周期函数
,
也可编写 自定义的函数
来响应页面的事件
;
在参数中 有一个 data
属性,用于定义页面中使用到的数据;
页面逻辑文件的文件名 与 页面其他3个文件名相同,扩展名为.js;
如index页面的配置文件名全称为 index.js;
看下初始项目的index.js:
//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格式的数据
,字符串、数字、布尔值、对象、数组
等;wxml
对 data中定义的数据
进行绑定;生命周期函数
Page()函数
的参数中,可定义当前界面
的生命周期函数
参考自《从零开始学微信小程序开发》