小程序day03

目标

小程序day03_第1张图片

页面导航

小程序day03_第2张图片

声明式导航

1.导航到tabBar页面

小程序day03_第3张图片

2.导航到非tabbar页面

小程序day03_第4张图片

3.后退导航 

小程序day03_第5张图片

编程式导航

1.导航到tabBar页面

小程序day03_第6张图片

小程序day03_第7张图片 2.导航到非tabBar页面

小程序day03_第8张图片

小程序day03_第9张图片 3.后退导航

小程序day03_第10张图片

小程序day03_第11张图片

导航传参

1.声明式导航传参

小程序day03_第12张图片

2.编程式导航传参

小程序day03_第13张图片

3.在onLoad中接收导航参数

小程序day03_第14张图片

页面事件

下拉刷新

小程序day03_第15张图片 小程序day03_第16张图片

小程序day03_第17张图片 小程序day03_第18张图片

这个可以获取完数据之后再停止效果. 

小程序day03_第19张图片 上拉触底

小程序day03_第20张图片 小程序day03_第21张图片

上拉触底案例

小程序day03_第22张图片

小程序day03_第23张图片 小程序day03_第24张图片

可以看见的是得到新数据之后是将新数据和旧数据拼接在一起再渲染在页面上的.

小程序day03_第25张图片

小程序day03_第26张图片

小程序day03_第27张图片

小程序day03_第28张图片 小程序day03_第29张图片

生命周期

小程序day03_第30张图片

小程序day03_第31张图片 小程序day03_第32张图片

小程序day03_第33张图片 小程序day03_第34张图片

小程序day03_第35张图片

WXS脚本

小程序day03_第36张图片

小程序day03_第37张图片 小程序day03_第38张图片

 小程序day03_第39张图片

小程序day03_第40张图片 与js比较小程序day03_第41张图片

小程序day03_第42张图片 小程序day03_第43张图片

小程序day03_第44张图片

案例-本地生活(列表页面)

实现效果

小程序day03_第45张图片

在app.json加上一个“pages/shoplist/shoplist”的路径创建新的页面。

 然后改造主页面的九宫格的每一个的view标签变成navigator标签,然后修改一下url并且传递两个参数。以下是实现效果图。

小程序day03_第46张图片

动态设置页面标题 

小程序day03_第47张图片

使用提供的api在固定的生命周期里面进行渲染. 

小程序day03_第48张图片 在shoplist的生命周期函数里面,接收传过来的数据只能是onLoad(),所以要先在data里面复制一份,再在onReady里面使用。小程序day03_第49张图片

获取并渲染商铺列表数据

获取数据

小程序day03_第50张图片

 在js文件里面定义这样一个函数,在onLoad里面调用,函数里要对data的数据进行合并更新。

  getShopList(){
    wx.showLoading({
      title: '数据加载中...',
    })
    wx.request({
      url: `https://applet-base-api-t.itheima.net/categories/${this.data.query.id}/shops`, 
      method: 'GET',
      data:{
        _page:this.data.page,
        _limit:this.data.pageSize
      },success:(res)=>{
        this.setData({
          shopList:[...this.data.shopList,...res.data],
          total:res.header['X-Total-Count']-0
        })
      },complete:()=>{
        wx.hideLoading()
      }
    })
  },

UI渲染






{{item.name}}
电话:{{item.phone}}
地址:{{item.address}}
营业时间:{{item.businessHours}}

/* pages/shoplist/shoplist.wxss */
.shop-item{
  display:flex;
  padding: 15rpx ;
  border: 1rpx solid #efefef;
  margin: 15rpx;
  border-radius: 8rpx; 
  box-shadow: 1rpx 1rpx 15rpx #ddd;
}
.thumb image{
  width: 250rpx;
  height: 250rpx;
  display: flex;
  margin-right: 15rpx;
}
.info{
  display: flex;
  flex-direction: column;
  justify-content: space-around;
  font-size: 24rpx;
}
.shop-title{
  font-weight: bold;

}

效果如图

有边距,有布局,有圆角,有阴影,有加粗。

小程序day03_第51张图片

初步实现上拉加载效果

这里先是设置上拉触底的距离,然后页码值要在上拉加载后加1,然后再调用分页查询获取新数据.

然后是要用一个新字段实现节流效果。

小程序day03_第52张图片

// pages/shoplist/shoplist.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    query:{},
    shopList:[],
    page:1 ,
    pageSize:10,
    total:0,
    isLoading:false
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    this.setData({
      query:options
    })
    this.getShopList()
  }, 
  getShopList(){
    this.setData({
      isLoading:true
    })
    wx.showLoading({
      title: '数据加载中...',
    })
    wx.request({
      url: `https://applet-base-api-t.itheima.net/categories/${this.data.query.id}/shops`, 
      method: 'GET',
      data:{
        _page:this.data.page,
        _limit:this.data.pageSize
      },success:(res)=>{
        this.setData({
          shopList:[...this.data.shopList,...res.data],
          total:res.header['X-Total-Count']-0
        })
      },complete:()=>{
        wx.hideLoading()
        this.setData({
          isLoading:false
        })
      }
    })
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {  
    wx.setNavigationBarTitle({
      title: this.data.query.title
    })
  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {
    if(this.data.isLoading) return
    this.setData({
      page:this.data.page+1
    })
    this.getShopList()
  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})

判断数据是否加载完成

 按照上面加载数据的逻辑,一直上拉加载的话是会一直请求下一页的数据的。但是数据就那么多,也不可能一直加载. 再一直请求都是没有新数据。

小程序day03_第53张图片

没有消息时显示提示框提示没有新的消息。 

小程序day03_第54张图片 如果判断数据加载完了就不再请求并弹窗提示

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {
    if(this.data.page*this.data.pageSize>=this.data.total){
      //证明没有下一页数据
      return  wx.showToast({
        title: '数据加载完毕!',
        icon: 'none'
      })
    }
    if(this.data.isLoading) return
    this.setData({
      page:this.data.page+1
    })
    this.getShopList()
  },

开启下拉刷新

在配置文件里面进行开启,并配置背景色灰色和小圆点效果.

  "enablePullDownRefresh": true,
  "backgroundColor": "#efefef",
  "backgroundTextStyle": "dark"

效果图如下 

小程序day03_第55张图片

在下拉刷新时需要对关键数据进行重置。

小程序day03_第56张图片

 /**
   * 页面相关事件处理函数--监听用户下拉动作
   */ 
  onPullDownRefresh() {
    //重置关键数据
    this.setData({
      page:1,
      shopList: [],
      total:0
    })
    //重新发起数据请求
    this.getShopList()
  },

  然后需要在请求数据之后关闭下拉刷新窗口,但是只应该在下拉刷新的数据请求时才进行关闭,上拉加载时就不需要。 

        wx.stopPullDownRefresh()

这里采用传递回调函数的方式,有传回调函数的就调用回调函数关闭下拉刷新窗口.

数据请求改成如下格式.

使用短路运算判断是否有回调函数

  getShopList(cb){
    this.setData({
      isLoading:true
    })
    wx.showLoading({
      title: '数据加载中...',
    })
    wx.request({
      url: `https://applet-base-api-t.itheima.net/categories/${this.data.query.id}/shops`, 
      method: 'GET',
      data:{
        _page:this.data.page,
        _limit:this.data.pageSize
      },success:(res)=>{
        this.setData({
          shopList:[...this.data.shopList,...res.data],
          total:res.header['X-Total-Count']-0
        })
      },complete:()=>{
        wx.hideLoading()
        this.setData({
          isLoading:false
        })
        // wx.stopPullDownRefresh()
         cb&cb()
      }
    })
  },

然后在下拉刷新监听函数里面调用时用一个箭头函数进行关闭.

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */ 
  onPullDownRefresh() {
    //重置关键数据
    this.setData({
      page:1,
      shopList: [],
      total:0
    })
    //重新发起数据请求
    this.getShopList(()=>{
      wx.stopPullDownRefresh()
    })
  },

使用wxs处理手机号

处理完之后会使用减号进行分割

小程序day03_第57张图片






{{item.name}}
电话:{{tools.splitPhone( item.phone)}}
地址:{{item.address}}
营业时间:{{item.businessHours}}


 新建一个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
}

总结

小程序day03_第58张图片

你可能感兴趣的:(小程序,小程序)