项目文件
-
app.js 小程序的脚本代码,监听处理小程序的生命周期函数、申明全局变量、调用框架提供的API等等
- App();函数注册一个小程序
- onLaunch();程序初始化完成时触发,全局指触发一次
- onShow(options);启动或从后台进入前台显示时触发
- onHide();从前台进入后台会触发
- onError(msg);脚本错误或API调用失败会触发,并带上错误信息
- getUserInfo(){};获取用户信息,需要先调用wx.login();
- wx.login({});调用微信登录接口,获取登录凭证(code),进而获取用户登录信息,包括用户的唯一标识(openid),及本次登录的会话密钥(session_key)。用户数据的加解密通讯需要密钥来完成。
-
app.json 搜对整个小程序的全局配置:配置小程序是由哪些页面组成,配置小程序的窗口背景色,配置导航条样式,配置默认标题。
- ”pages”: [],配置页面路由
- “window”:{}设置默认页面的窗口表现
app.wxss 是整个小程序的公共样式表我们可以在页面组件的class上直接使用app.wxss中申明的样式规则
-
创建页面
- *.js 文件 :脚本文件 — 在这个文件中我们可以监听并处理页面的生命周期函数、获取小程序实例,声明并处理数据,响应页面交互事件等。
- *.json 文件 :配置文件 — 页面的配置文件是非必要的。当有页面的配置文件时,配置项在该页面会覆盖 app.json 的 window 中相同的配置项。如果没有指定的页面配置文件,则在该页面直接使用 app.json 中的默认配置。
- *.wxss 文件 :页面样式文件
- *.wxml 文件 :页面结构文件
文件结构
-
配置:
-
app.json
1. ”pages”: [] 设置页面路径 2. “window”: { //设置默认窗口的表现(颜色都是十六进制的) “navigationBarBackgroundColor”: #000, //导航栏背景颜色 “navigationBarTextStyle”: white/black, //导航栏标题颜色,仅支持black/white “navigationBarTitleText”: string, //导航栏标题 “backgroundColor”: #fff, //窗口的背景颜色 “backgroundTextStyle”: dark, //下拉背景字体、loading 图的样式,仅支持 dark/light “enablePullDownRefresh”: boolean //是否开启下拉刷新,详见页面相关事件处理函数。 } 3. “tabBar”: { //设置底部的tab “color”: #ddd, //tab上文字的默认颜色 “selectedColor”: #333, //选中tab时的颜色 “backgroundColor” #ccc, //tab背景颜色 “borderStyle”: black/white, //tabBar上边框的颜色,仅支持black/white “list”: [ //tab 的列表 { “pagePath”: ‘../..’, //pages中定义的页面路径 “text”: string, //tab上的按钮文字 “iconPath”: ‘../..’, //图片路径,icon 大小限制为40kb,建议尺寸为 81px * 81px,当 postion 为 top 时,此参数无效 “selectedIconPath”: ‘../..’ //选中时的图片路径,icon 大小限制为40kb,建议尺寸为 81px * 81px ,当 postion 为 top 时,此参数无效 } ], “position”: top/bottom // } 4. “networkTime”: { //网络超时时间 “request”: 10 000, //wx.request 的请求超时时间,默认60 000(下面都是) “connectSocket”: 10 000, //wx.connectSocket的超时时间 “uploadFile”: 10 000, //wx.uploadFile的超时时间 “downloadFile”: 10 000, //wx.downloadFile的超时时间 } 5. “debug”: boolean 是否开启debug模式
page.json :页面的.json只能设置 window 相关的配置项,以决定本页面的窗口表现,所以无需写 window 这个键
-
属性如下:
{ “navigationBarBackgroundColor”: #000, “navigationBarTextStyle”: black/white, “navigationBarTitleText”: string, “backgroundColor”: #ddd, “backgroundTextStyle”: dark/light, “enablePullDownRefresh”: boolean, “disableScroll”: boolean //设置为 true 则页面整体不能上下滚动;只在 page.json 中有效,无法在 app.json 中设置该项(默认 false ) }
-
逻辑层
注册程序:App(options);
App() 函数用来注册一个小程序。接受一个 object 参数,其指定小程序的生命周期函数等。
options = {
onLaunch: function(){}, //生命周期函数--监听小程序初始化(只会触发一次)
onShow: function(){}, //生命周期函数--监听小程序显示(每次显示小程序都会触发)
onHide: function(){}, //生命周期函数--监听小程序隐藏(每次小程序从前台进入后台都会触发)
onError: function(msg){}, //当小程序发生脚本错误,或者 api 调用失败时,会触发 onError 并带上错误信息
userFun:function(){} //用户自定义函数
}
问题:
- onLaunch 和 onShow 的参数
- path: string 打开小程序的路径
- query: {} 打开小程序的query
- scene: number 打开小程序的场景值
- shareTicket: string ???
- getApp()函数:获取小程序实例
- console.log(getApp().globalData);
- App()必须在app.js中注册,并且不能注册多个
- 不要再App()内部使用getApp(),用this即可
- 不要再onLaunch时调用getCurrentPage(),此时page还没有生成
- 通过getApp()获取实例后,不要随意调用生命周期函数 ??????
注册页面
Page(options) 函数用来注册一个页面。接受一个 object 参数,其指定页面的初始数据、生命周期函数、事件处理函数等。
options = {
data: {}, // 页面的初始数据
onLoad: function(){},
onReady: function(){}, //生命周期函数--监听页面初次渲染完成
onShow: function(){},
onHide: function(){},
onUnload: function(){}, //生命周期函数--监听页面卸载 当redirectTo或navigateBack的时候调用。
onPullDownRefresh: function(){}, //页面相关事件处理函数--监听用户下拉动作
onReachButton: function(){}, //页面上拉触底事件的处理函数
onShareAppMessage: function(){}, //用户点击右上角转发
route: string, //当前页面的路径
userFun:function(){}
}
更改data中的数据需要用到this.setData(key: value);方法,否则不会生效
页面路由
-
页面栈:
1. 页面栈以栈(先进后出)的形式维护页面与页面之间的关系; 2. 小程序提供了getCurrentPages()函数获取页面栈,第一个元素为首页,最后一个元素为当前页面。 3. 使用wx.navigateTo每新开一个页面,页面栈大小加1,直到页面栈大小为5为止; 4. 使用wx.navigateTo重复打开界面,页面栈大小加1,直到页面栈大小为5为止; 5. 使用wx.redirectTo重定向,当前页面被替换,页面栈不变,如果新页面之前打开过,则得到的是两个状态独立的同一页面 6. 使用wx.navigateBack返回,当delta为1,等同于左上返回按钮,页面栈减一;当delta为2,关闭依次五级页面和四级页面,当前页面为三级页面,页面栈大小减2;以此类推,直到栈底为止,也就是首页。
-
哪些情况会触发页面跳转
小程序启动,初始化第一个页面
-
打开新页面,调用 API wx.navigateTo 或使用组件
wx.navigateTo({ //目的页面地址,原页面保留 url: 'pages/logs/index', success: function(res){}, ... })
-
页面重定向,调用 API wx.redirectTo 或使用组件
wx.redirectTo({ //目的页面地址,原页面被关闭,不可返回 url: 'pages/logs/index', success: function(res){}, ... })
<navigator url="pages/logs/index" hover-class="navigator-hover">跳转</navigator> // 当该组件添加redirect属性时,等同于wx.redirectTo接口;默认redirect属性为false,等同于wx.navigateTo接口。
-
页面返回,调用 API wx.navigateBack或用户按左上角返回按钮
wx.navigateBack({ delta: 1 }) // delta为1时表示返回上一页,为2时表示上上一页,以此类推;如果dalta大于已打开的页面总数,则返回到首页。返回后,元界面会销毁。
tarbar切换 页面全部出栈,只留下新的 Tab 页面
重加载 页面全部出栈,只留下新的 Tab 页面
-
如何正确使用页面跳转: 官方规定小程序最多只能有五个页面同时存在,意思是在不关闭页面的情况,最多新开五个页面,页面深度为5。
- 对于可逆操作,使用wx.navigateTo,比如从首页跳转到二级页面,从二级页面返回是不需要重新渲染首页
- 对于不可逆操作,使用wx.redirectTo,比如用户登录成功后,关闭登录页面,不能返回到登录界面。
- 对于一些介绍性等不常用页面wx.redirectTo或wx.navigatrBack
- 对于类似九宫格、列表项,使用
- 不要在首页使用wx.redirectTo,这样会导致应用无法返回首页
- 简化需求、简化流程;核心功能在两三个页面完成便是张小龙追求『小而美』的体现
getCurrentPages(): 用于获取当前页面栈的实例,以数组形式按栈的顺序给出,第一个元素为首页,最后一个元素为当前页面。
-
注意:
1. navigateTo, redirectTo 只能打开非 tabBar 页面。 2. switchTab 只能打开 tabBar 页面。 3. reLaunch 可以打开任意页面。 4. 页面底部的 tabBar 由页面决定,即只要是定义为 tabBar 的页面,底部都有 tabBar。 5. 调用页面路由带的参数可以在目标页面的onLoad中获取。
-
模块化
-
文件作用域
- 在js文件中申明的函数只在该文件中有效,
- 通过全局的getApp()函数可以获得全局的应用实例:
//app.js App({ globalData: 1 }) // index.js var app = getApp(); app.globalData ++; // logs.js console.log(getApp().globalData);
-
模块化
- 我们可以将一些公共的代码抽离成为一个单独的 js 文件,作为一个模块。模块只有通过 module.exports 或者 exports(不推荐使用) 才能对外暴露接口。
- 小程序目前不支持直接引入 node_modules , 开发者需要使用到 node_modules 时候建议拷贝出相关的代码到小程序的目录中。
- 在需要使用这些模块的文件中,使用 require(path) 将公共代码引入
// common.js function sayHello(name){ console.log(\`hello ${name} !\`) } function sayBye(name){ console.log(\`Goodbye ${name} !\`) } module.exports.sayHello = sayHello; exports.sayBye = sayBye; // index.js中调用 var comm = require(../common.js); Page({ helloJack:function(){ comm.sayHello("Jack"); }, goodByeRose: function(){ comm.sayBye("Rose"); } })