逻辑层
逻辑层概述
小程序开发框架的逻辑层使用 JavaScript 引擎为小程序提供开发者 JavaScript 代码的运行环境以及微信小程序的特有功能
逻辑层将数据进行处理后发送给视图层,同时接受视图层的事件反馈。
在 JavaScript 的基础上,我们增加了一些功能,以方便小程序的开发:
- 增加
App和Page方法,进行程序注册和页面注册。 - 增加
getApp和getCurrentPages方法,分别用来获取App实例和当前页面栈。 - 提供丰富的 API,如微信用户数据,扫一扫,支付等微信特有能力。
- 提供模块化能力,每个页面有独立的作用域。
小程序框架的逻辑层并非运行在浏览器中,因此 JavaScript 在 web 中一些能力都无法使用,如 window,document 等。
小程序注册
在 app.js 中使用 App 这个函数注册小程序,指定小程序的生命周期回调
小程序的生命周期
onLaunch: function () {
this._readPhone();
this._readPhoto()
this._login()
},
当小程序启动,或从后台进入前台显示,会触发 onShow
onShow: function (options) {
console.log("app show")
},
当小程序从前台进入后台,会触发 onHide
onHide: function () {
console.log("app hide")
},
当小程序发生脚本错误,或者 api 调用失败时,会触发 onError 并带上错误信息
onError: function (msg) {
//调用错误日志接口
},
onPageNotFound:function(){
//重定向到首页或者404页面
}, onLaunch: function () {
this._readPhone();
this._readPhoto()
this._login()
},
当小程序启动,或从后台进入前台显示,会触发 onShow
onShow: function (options) {
console.log("app show")
},
当小程序从前台进入后台,会触发 onHide
onHide: function () {
console.log("app hide")
},
当小程序发生脚本错误,或者 api 调用失败时,会触发 onError 并带上错误信息
onError: function (msg) {
//调用错误日志接口
},
onPageNotFound:function(){
//重定向到首页或者404页面
},其他
globalData:{
token:"",
name:""
},
_login:function(){
this.globalData.token="abcdefg"
},
_readPhoto:function(){
console.log("读取你的相册")
},
_readPhone:function(){
console.log("读取联系人")
} globalData:{
token:"",
name:""
},
_login:function(){
this.globalData.token="abcdefg"
},
_readPhoto:function(){
console.log("读取你的相册")
},
_readPhone:function(){
console.log("读取联系人")
}getApp 的讲解
整个小程序只有一个 App 实例,是全部页面共享的。开发者可以通过 getApp 方法获取到全局唯一的 App 实例,获取 App 上的数据或调用开发者注册在 App 上的函数。
const appInstance = getApp()
console.log(appInstance.globalData) // I am global dataconst appInstance = getApp()
console.log(appInstance.globalData) // I am global data- 不要在定义于
App()内的函数中,或调用App前调用getApp(),使用this就可以拿到 app 实例。 - 通过
getApp()获取实例之后,不要私自调用生命周期函数。
页面注册 Page()
页面的生命周期。
Page({
// 页面的初始数据
data: {
goods: []
},
_change: function () {
this.setData({
age: this.data.age + 1
})
},
// 生命周期函数--监听页面加载
onLoad: function (options) {
console.log("index load")
},
// 生命周期函数--监听页面初次渲染完成
onReady: function () {
console.log("index ready")
},
// 生命周期函数--监听页面显示
onShow: function () {},
// 生命周期函数--监听页面隐藏
onHide: function () {
console.log("index hide")
},
// 生命周期函数--监听页面卸载
onUnload: function () {},
// 页面相关事件处理函数--监听用户下拉动作
onPullDownRefresh: function () {
console.log("下拉刷新")
},
// 页面上拉触底事件的处理函数
onReachBottom: function () {
console.log("加载更多")
},
// 用户点击右上角分享
onShareAppMessage: function () {
console.log("+1")
}
})Page({
// 页面的初始数据
data: {
goods: []
},
_change: function () {
this.setData({
age: this.data.age + 1
})
},
// 生命周期函数--监听页面加载
onLoad: function (options) {
console.log("index load")
},
// 生命周期函数--监听页面初次渲染完成
onReady: function () {
console.log("index ready")
},
// 生命周期函数--监听页面显示
onShow: function () {},
// 生命周期函数--监听页面隐藏
onHide: function () {
console.log("index hide")
},
// 生命周期函数--监听页面卸载
onUnload: function () {},
// 页面相关事件处理函数--监听用户下拉动作
onPullDownRefresh: function () {
console.log("下拉刷新")
},
// 页面上拉触底事件的处理函数
onReachBottom: function () {
console.log("加载更多")
},
// 用户点击右上角分享
onShareAppMessage: function () {
console.log("+1")
}
})关于 data
可以使用 this.data.属性 获取 data 中的值,使用 this.setData({属性: 值}) 进行赋值并重新渲染页面。也可以使用 this.data.属性 = 值 直接赋值(但不会重新渲染页面)。
事件系统
概念
事件是视图层到逻辑层的通讯方式。
事件可以将用户的行为反馈到逻辑层进行处理。
事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数。
事件对象可以携带额外信息,如 id, dataset, touches
事件绑定
使用 bind+事件=“函数名” 或者使用 catch+事件=“函数名”,来绑定事件,
<view bindtap="_fn1">点击1</view>
<view catchtap="_fn2">点击2</view><view bindtap="_fn1">点击1</view>
<view catchtap="_fn2">点击2</view>事件处理函数
_fn1: function () {
console.log("fn1")
},
_fn2: function () {
console.log("fn2")
}, _fn1: function () {
console.log("fn1")
},
_fn2: function () {
console.log("fn2")
},事件分类
- 冒泡事件:当一个组件上的事件被触发后,该事件会向父节点传递。
- 非冒泡事件:当一个组件上的事件被触发后,该事件不会向父节点传递。
冒泡事件
非冒泡事件
除上表之外的其他组件自定义事件如无特殊声明都是非冒泡事件,如 form 的submit事件,input 的input事件,scroll-view 的scroll事件
使用 bind 绑定的事件不会阻止冒泡,使用 catch 绑定的事件会阻止冒泡
传参接参(重点)
可以在绑定元素的组件上使用 data-属性名=值,来进行传参,在对应的事件对象中 e.currentTarget.dataset 或者 e.target.dataset 中获取对应的传递的参数。可以传递对象
<view data-name="zhangsan" data-user-age="18" data-user="{{user}}" class="father" bindtap="_fn1">
<view class="son" catchtap="_fn2"></view>
</view><view data-name="zhangsan" data-user-age="18" data-user="{{user}}" class="father" bindtap="_fn1">
<view class="son" catchtap="_fn2"></view>
</view>总结:
e.target 代表的是事件触发的元素
e.currentTarget:代表是事件绑定的元素。
在哪个元素上绑定,参数就写在哪个元素上,获取参数使用 currentTarget 获取
导航
跳转到别的小程序
<navigator app-id="wx6acf0caf71cb5860" target="miniProgram">星座运势</navigator>
```js
wx.navigateToMiniProgram({
appId: 'wx6acf0caf71cb5860',
})<navigator app-id="wx6acf0caf71cb5860" target="miniProgram">星座运势</navigator>
```js
wx.navigateToMiniProgram({
appId: 'wx6acf0caf71cb5860',
})
### 导航组件(声明式导航)
open-type:
navigate:新的页面会入栈。如果还想原路返回就是用这种跳转方式 wx.navigateTo()
redirect:当前的页面会出栈,新的页面会入栈。登录成功或者注册成功的跳转。wx.redirectTo
reLaunch:之前的页面栈都会删除,新的页面会入栈。支付成功跳转。wx.reLaunch
switchTab:之前的页面栈都会删除,新的页面会入栈。跳转 tabBar 页面必须用它
navigateBack:页面不断的出栈,用来返回的。
```jsx
<navigator open-type="navigate" url="../c/c">
跳转c页面
</navigator>
### 导航组件(声明式导航)
open-type:
navigate:新的页面会入栈。如果还想原路返回就是用这种跳转方式 wx.navigateTo()
redirect:当前的页面会出栈,新的页面会入栈。登录成功或者注册成功的跳转。wx.redirectTo
reLaunch:之前的页面栈都会删除,新的页面会入栈。支付成功跳转。wx.reLaunch
switchTab:之前的页面栈都会删除,新的页面会入栈。跳转 tabBar 页面必须用它
navigateBack:页面不断的出栈,用来返回的。
```jsx
<navigator open-type="navigate" url="../c/c">
跳转c页面
</navigator>路由 API(编程式导航)
wx.navigateTo({
url: '../b/b',
})
wx.redirectTo({
url: '../b/b',
})
wx.reLaunch({
url: 'url',
})wx.navigateTo({
url: '../b/b',
})
wx.redirectTo({
url: '../b/b',
})
wx.reLaunch({
url: 'url',
})导航传参
;<navigator open-type="navigate" url="../detail/detail?id=1&name=xiaomi">
跳转detail页面
</navigator>
wx.navigateTo({
url: '../detail/detail?id=2&name=华为',
});<navigator open-type="navigate" url="../detail/detail?id=1&name=xiaomi">
跳转detail页面
</navigator>
wx.navigateTo({
url: '../detail/detail?id=2&name=华为',
})接收导航传参
在跳转之后的 onload 生命周期中的形参中接受参数
onLoad: function (options) {
console.log(options)
},onLoad: function (options) {
console.log(options)
},tabbar 页面不能传参
说明:可以在微信开发者工具选择普通编译--继续选择添加编译模式--选择启动页面--添加启动参数即可,然后即可在当前目标页面的 onLoad 中获取参数
Cao Note