页面导航指的是页面之间的相互跳转。例如,浏览器中实现页面导航的方式有如下两种:
tabBar 页面指的是被配置为 tabBar 的页面。
在使用 组件跳转到指定的 tabBar 页面时,需要指定 url 属性和 open-type 属性,其中:
示例代码如下:
<navigator url="/pages/message/message" open-type="switchTab">导航到消息页面navigator>
非 tabBar 页面指的是没有被配置为 tabBar 的页面。
在使用 组件跳转到普通的非 tabBar 页面时,则需要指定 url 属性和 open-type 属性,其中:
示例代码如下:
<navigator url="/pages/info/info">导航到info页面navigator>
注意:为了简便,在导航到非 tabBar 页面时,open-type=“navigate” 属性可以省略。
如果要后退到上一页面或多级页面,则需要指定 open-type 属性和 delta 属性,其中:
示例代码如下:
<navigator open-type="navigateBack" delta="1">上一级navigator>
调用 wx.switchTab(Object object) 方法,可以跳转到 tabBar 页面。其中 Object 参数对象的属性列表如下:
示例代码如下:
<button bindtap="gotoMessage">跳转到消息页面button>
// 跳转消息页面
gotoMessage(){
wx.switchTab({
url: '/pages/message/message',
})
},
调用 wx.navigateTo(Object object) 方法,可以跳转到非 tabBar 的页面。其中 Object 参数对象的属性列表
如下:
示例代码如下:
<button bindtap="gotoInfo">跳转到info页面button>
// 跳转info页面
gotoInfo(){
wx.navigateTo({
url: '/pages/info/info',
})
},
调用 wx.navigateBack(Object object) 方法,可以返回上一页面或多级页面。其中 Object 参数对象可选的属性列表如下:
示例代码如下:
<button bindtap="gotoHome">编程式上一级button>
gotoHome(){
wx.navigateBack();
},
navigator 组件的 url 属性用来指定将要跳转到的页面的路径。同时,路径的后面还可以携带参数:
代码示例如下:
<navigator url="/pages/info/info?name=zs&age=22">跳转info页面navigator>
调用 wx.navigateTo(Object object) 方法跳转页面时,也可以携带参数,代码示例如下:
<button bindtap="gotoInfo2">跳转info页面button>
gotoInfo2(){
wx.navigateTo({
url: '/pages/info/info?name=zs&age=22',
})
},
通过声明式导航传参或编程式导航传参所携带的参数,可以直接在 onLoad 事件中直接获取到,示例代码如下:
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
console.log(options);
},
下拉刷新是移动端的专有名词,指的是通过手指在屏幕上的下拉滑动操作,从而重新加载页面数据的行为。
启用下拉刷新有两种方式:
在实际开发中,推荐使用第 2 种方式,为需要的页面单独开启下拉刷新的效果。
在全局或页面的 .json 配置文件中,通过 backgroundColor 和backgroundTextStyle 来配置下拉刷新窗口的样式,其中:
在页面的 .js 文件中,通过 onPullDownRefresh() 函数即可监听当前页面的下拉刷新事件。
<view>count的值为:{{count}}view>
<button bindtap="addCount">+1button>
data: {
count: 0
},
// +1
addCount(){
this.setData({
count: this.data.count + 1
})
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
this.setData({
count: 0
});
},
当处理完下拉刷新后,下拉刷新的 loading 效果会一直显示,不会主动消失,所以需要手动隐藏下拉刷新的loading 效果。此时,调用 wx.stopPullDownRefresh() 可以停止当前页面的下拉刷新。
示例代码如下:
onPullDownRefresh() {
this.setData({
count: 0
});
// 关闭刷新
wx.stopPullDownRefresh();
},
上拉触底是移动端的专有名词,通过手指在屏幕上的上拉滑动操作,从而加载更多数据的行为。
在页面的 .js 文件中,通过 onReachBottom() 函数即可监听当前页面的上拉触底事件。示例代码如下:
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
console.log("触动了上啦事件");
},
上拉触底距离指的是触发上拉触底事件时,滚动条距离页面底部的距离。
可以在全局或页面的 .json 配置文件中,通过 onReachBottomDistance 属性来配置上拉触底的距离。
小程序默认的触底距离是 50px,在实际开发中,可以根据自己的需求修改这个默认值。
/**
* 页面的初始数据
*/
data: {
// 颜色数组
colorList: []
},
// 随机获取颜色
getColor(){
wx.request({
url: 'https://www.escook.cn/api/color',
method: 'GET',
success: ({data:res})=>{
this.setData({
colorList: [...this.data.colorList,...res.data]
})
console.log(res);
}
})
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
this.getColor();
},
<view wx:for="{{colorList}}" wx:key="index" class="num-item" style="background-color: rgba({{item}});">{{item}}view>
.num-item{
border: 1rpx solid #efefef;
/* 圆角 */
border-radius: 8rpx;
/* 行高 */
line-height: 200rpx;
margin: 15rpx;
text-align: center;
/* 文本添加阴影 */
text-shadow: 0rpx 0rpx 5rpx #fff;
/* 用于在元素的框架上添加阴影效果 */
box-shadow: 1rpx 1rpx 6rpx #aaa;
}
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
this.getColor();
},
// 随机获取颜色
getColor(){
// 展示loading效果
wx.showLoading({
title: '数据加载中...',
})
wx.request({
url: 'https://www.escook.cn/api/color',
method: 'GET',
success: ({data:res})=>{
this.setData({
colorList: [...this.data.colorList,...res.data]
})
console.log(res);
},
// 关闭提示
complete:()=>{
// 关闭loading效果
wx.hideLoading()
}
})
},
每次修改代码时刷新都会回到首页,然后点击到修改的页面查看效果,很麻烦。
可以设置一下几种模式。
生命周期(Life Cycle)是指一个对象从创建 -> 运行 -> 销毁的整个阶段,强调的是一个时间段。例如:
我们可以把每个小程序运行的过程,也概括为生命周期:
在小程序中,生命周期分为两类,分别是:
其中,页面的生命周期范围较小,应用程序的生命周期范围较大,如图所示:
生命周期函数:是由小程序框架提供的内置函数,会伴随着生命周期,自动按次序执行。
生命周期函数的作用:允许程序员在特定的时间点,执行某些特定的操作。例如,页面刚加载的时候,可以在onLoad 生命周期函数中初始化页面的数据。
注意:生命周期强调的是时间段,生命周期函数强调的是时间点。
小程序中的生命周期函数分为两类,分别是:
小程序的应用生命周期函数需要在 app.js 中进行声明,示例代码如下:
// 小程序初始化完成时,执行此函数,全局只触发一次。可以做一些初始化的工作。
onLaunch() {}
// 小程序启动,或从后台进入前台显示时触发。
onShow:function(options){},
// 小程序从前台进入后台时触发。
onHide:function(){}
小程序的页面生命周期函数需要在页面的 .js 文件中进行声明,示例代码如下:
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {},
/**
* 生命周期函数--监听页面显示
*/
onShow() {},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {},
WXS(WeiXin Script)是小程序独有的一套脚本语言,结合 WXML,可以构建出页面的结构。
wxml 中无法调用在页面的 .js 中定义的函数,但是,wxml 中可以调用 wxs 中定义的函数。因此,小程序中wxs 的典型应用场景就是“过滤器”。
虽然 wxs 的语法类似于 JavaScript,但是 wxs 和 JavaScript 是完全不同的两种语言:
wxs 代码可以编写在 wxml 文件中的 < wxs > 标签内,就像 Javascript 代码可以编写在 html 文件中的 < script > 标签内一样。
wxml 文件中的每个 < wxs >< /wxs > 标签,必须提供 module 属性,用来指定当前 wxs 的模块名称,方便在wxml 中访问模块中的成员:
<view>{{w1.toUpper(username)}}view>
<wxs module="w1">
// 将文本转化为大写 me->ME
module.exports.toUpper = function(str){
return str.toUpperCase();
}
wxs>
/**
* 页面的初始数据
*/
data: {
username: 'me'
},
wxs 代码还可以编写在以 .wxs 为后缀名的文件内,就像 javascript 代码可以编写在以 .js 为后缀名的文件中一样。示例代码如下:
tools.wxs文件
function toLower(str){
return str.toLowerCase();
}
module.exports = {
toLower: toLower
}
在 wxml 中引入外联的 wxs 脚本时,必须为 < wxs > 标签添加 module 和 src 属性,其中:
示例代码如下:
<view>{{w2.toLower(country)}}view>
<wxs src="../../utils/tools.wxs" module="w2">wxs>
data: {
country: 'BELIEF'
},
为了降低 wxs(WeiXin Script)的学习成本, wxs 语言在设计时借大量鉴了 JavaScript 的语法。但是本质上,wxs 和 JavaScript 是完全不同的两种语言!
wxs 典型的应用场景就是“过滤器”,经常配合 Mustache 语法进行使用,例如:
<view>{{w2.toLower(country)}}view>
但是,在 wxs 中定义的函数不能作为组件的事件回调函数。例如,下面的用法是错误的:
<button bindtap="w2.toLower">button>
隔离性指的是 wxs 的运行环境和其他 JavaScript 代码是隔离的。体现在如下两方面:
以分页的形式,加载指定分类下商铺列表的数据:
如果下面的公式成立,则证明没有下一页数据了:
跳转页面并传参
<view class="grid-list">
<navigator class="grid-item" wx:for="{{gridList}}"
wx:key="id"
url="/pages/shoplist/shoplist?id={{item.id}}&title={{item.name}}">
<image src="{{item.icon}}">image>
<text>{{item.name}}text>
navigator>
view>
/**
* 页面的初始数据
*/
data: {
// 定义参数
query: {}
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
//接收页面参数
this.setData({
query: options
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
// 设置页面标题
wx.setNavigationBarTitle({
title: this.data.query.title
})
},
请求数据
data: {
// 定义参数
query: {},
// 商品数据
shopList: [],
page: 1,
pageSize: 10,
total: 0
},
onLoad(options) {
//接收页面参数
this.setData({
query: options
}),
//请求商品数据接口
wx.request({
url: `https://www.escook.cn/categories/${this.data.query.id}/shops`,
method: 'GET',
data:{
_page: this.data.page,
_limit: this.data.pageSize
},
success: (res)=>{
console.log(res);
this.setData({
shopList: [...this.data.shopList,...res.data],
total: res.header['X-Total-Count'] - 0,
})
}
})
},
展示数据
<view class="shop-item" wx:for="{{shopList}}" wx:key="{{id}}">
<view class="thumb">
<image src="{{item.images[0]}}"/>
view>
<view class="info">
<text class="shop-title">{{item.name}}text>
<text>电话:{{item.phone}}text>
<text>地址:{{item.address}}text>
<text>营业时间:{{item.businessHours}}text>
view>
view>
.shop-item{
display: flex;
/* 内边距 */
padding: 15rpx;
/* 边框 */
border: 1rpx solid #efefef;
/* 圆角 */
border-radius: 8rpx;
/* 外边距 */
margin: 15rpx;
/* 背影 */
box-shadow: 1rpx 1rpx 1rpx #ddd;
}
.thumb image{
width: 250rpx;
height: 250rpx;
display: block;
/* 图片外边距 */
margin-right: 15rpx;
}
.info{
display: flex;
/* 纵向对齐 */
flex-direction: column;
justify-content: space-around;
/* 字体大小 */
font-size: 24rpx;
}
.shop-title{
/* 标题加粗 */
font-weight: bold;
}
设置数据加载样式
/**
* 生命周期函数--监听页面显示
*/
onShow() {
wx.showLoading({
title: '数据加载中...',
})
},
getShopList(){
// 请求改为true
this.setData({
isLoading: true
}),
//请求商品数据接口
wx.request({
url: `https://www.escook.cn/categories/${this.data.query.id}/shops`,
method: 'GET',
data:{
_page: this.data.page,
_limit: this.data.pageSize
},
success: (res)=>{
console.log(res);
this.setData({
shopList: [...this.data.shopList,...res.data],
total: res.header['X-Total-Count'] - 0,
})
},
complete: ()=>{
// 关闭加载效果
wx.hideLoading();
// 加载完改为false
this.setData({
isLoading: false
})
}
})
},
设置节流,防止连续多次加载形成叠加
data: {
//节流标识
isLoading: false
},
getShopList(){
// 请求改为true
this.setData({
isLoading: true
}),
}
complete: ()=>{
// 关闭加载效果
wx.hideLoading();
// 加载完改为false
this.setData({
isLoading: false
})
}
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
// 页码 +1
this.setData({
page: this.data.page + 1
})
// 如果还在请求中
if(this.data.isLoading){
return;
}
this.getShopList()
},
页码值 * 每页显示多少条数据 >= 总数据条数
onReachBottom() {
// 判断是否已加载全部数据
if(this.data.page * this.data.pageSize >= this.data.total){
// 当前页 * 每页条数 >= 总条数,已加载全部数据
return wx.showToast({
title: '数据加载完毕!!!',
//不显示图标
icon: 'none'
})
}
}
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
this.setData({
page: 1,
shopList: [],
total: 0
}),
//重新发起请求
this.getShopList();
},
getShopList(cb){
complete: ()=>{
// 关闭加载效果
wx.hideLoading();
// 加载完改为false
this.setData({
isLoading: false
});
//关闭刷新效果,只在下拉刷新的请求时才执行
cb && cb()
}
})
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
this.setData({
page: 1,
shopList: [],
total: 0
}),
//重新发起请求
this.getShopList(()=>{
// 关闭刷新效果
wx.stopPullDownRefresh();
});
},
tools.wxs代码
function splitPhone(str){
if(str.length !== 11){
return str;
}
var arr = str.split("")
arr.splice(3,0,'-')
arr.splice(8,0,'-')
return arr.join('')
}
// 开放显示
module.exports = {
splitPhone: splitPhone
}
结束!!!!
成功和失败不过是空洞的回声,重要的是改变自己,承认自己的虚伪与虚荣。---罗翔老是