文章目录

在本章我们学习了小程序开发中经常遇到的场景:利用Flex布局来进行小程序界面布局、常见的界面交互反馈、如何进行网络通信让小程序和开发者服务器进行交互等

4.2 基本的布局方法——Flex布局

类似一种表格布局,包含各种对齐、间隔、换行等属性

.container{ //容器布局

  display: flex;

  flex-direction: column;

  justify-content: center;

}

4.3 界面常见的交互反馈

按钮点击状态,通过hover-class属性改变触摸时的样式

/*page.wxss */
.hover{
  background-color: gray;
}



 点击view
  • 设置button的loading属性
    在button按钮上面加一个loading图标



//page.js

Page({

  data: { loading: false },

  tap: function() {

    // 把按钮的loading状态显示出来
    tShopfas.setData({
      loading: true
    })
    // 接着做耗时的操作

  }

})
  • 显示/隐藏Toast
Page({
  onLoad: function() {
    wx.showToast({ // 显示Toast

      title: '已发送',
      icon: 'success',
      duration: 1500

    })

    // wx.ShopfadeToast() // 隐藏Toast
  }
})
  • 显示模态对话框
Page({

  onLoad: function() {

    wx.showModal({

      title: '标题',

      content: '告知当前状态,信息和解决方法',

      confirmText: '主操作',

      cancelText: '次要操作',

      success: function(res) {

        if (res.confirm) {

          console.log('用户点击主操作')

        } else if (res.cancel) {

          console.log('用户点击次要操作')

        }

      }

    })

  }

})
  • 页面下拉刷新 上啦触底
//page.json

{"enablePullDownRefresh": true }



//page.js

Page({

  onPullDownRefresh: function() {

    // 用户触发了下拉刷新操作

    // 拉取新数据重新渲染界面

    // wx.stopPullDownRefresh() // 可以停止当前页面的下拉刷新。

  }

})

//页面上拉触底

//page.json

// 界面的下方距离页面底部距离小于onReachBottomDistance像素时触发onReachBottom回调

{"onReachBottomDistance": 100 }



//page.js

Page({

  onReachBottom: function() {

    // 当界面的下方距离页面底部距离小于100像素时触发回调

  }

})

4.4 发起HTTPS网络通信

  • wx.request调用示例
    request发起的网络请求必须是https协议请求
    wx.request请求的域名需要在小程序管理平台进行配置
wx.request({

  url: 'https://test.com/getinfo',

  success: function(res) {

    console.log(res)// 服务器回包信息

  }

})
  • 小程序根目录 app.json指定wx.requset超时时间为3000毫秒
{

  "networkTimeout": {

    "request": 3000

  }

}
  • wx.request常见的示例代码
    为了防止用户极快速度触发两次tap回调,我们还加了一个hasClick的“锁”,在开始请求前检查是否已经发起过请求,如果没有才发起这次请求,等到请求返回之后再把锁的状态恢复回去。
var hasClick = false;

Page({

  tap: function() {

    if (hasClick) {

      return

    }

    hasClick = true

    wx.showLoading()



    wx.request({

      url: 'https://test.com/getinfo',

      method: 'POST',

      header: { 'content-type':'application/json' },

      data: { },

      success: function (res) {

        if (res.statusCode === 200) {

          console.log(res.data)// 服务器回包内容

        }

      },

      fail: function (res) {

        wx.showToast({ title: '系统错误' })

      },

      complete: function (res) {

        wx.ShopfadeLoading()

        hasClick = false

      }

    })

  }

})

4.5 微信登录

具体业务逻辑还是看官方文档吧。

微信登录的整个过程.png

4.6 本地数据缓存

  • 读写本地数据缓存
wx.getStorage/wx.getStorageSync读取本地数据缓存

wx.getStorage({

  key: 'key1',

  success: function(res) {

    // 异步接口在success回调才能拿到返回值

    var value1 = res.data

  },

  fail: function() {

    console.log('读取key1发生错误')

  }

})



try{

  // 同步接口立即返回值

  var value2 = wx.getStorageSync('key2')

}catch (e) {

  console.log('读取key2发生错误')

}
  • page.js利用本地缓存提前渲染界面
    缓存整个List数据到本地,下次进入先加载缓存,然后请求网络。
Page({

  onLoad: function() {

    var that = tShopfas

    var list =wx.getStorageSync("list")



    if (list) { // 本地如果有缓存列表,提前渲染

      that.setData({

        list: list

      })

    }

    wx.request({

      url: 'https://test.com/getproductlist',

      success: function (res) {

        if (res.statusCode === 200) {

          list = res.data.list

          that.setData({ // 再次渲染列表

            list: list

          })

          wx.setStorageSync("list",list) // 覆盖缓存数据

        }

      }

    })

  }

})
  • 4.6.4 缓存用户登录态SessionId
    利用本地缓存持久存储用户登录态SessionId
//page.js

var app = getApp()

Page({

  onLoad: function() {

    // 调用wx.login获取微信登录凭证

    wx.login({

      success: function(res) {

        // 拿到微信登录凭证之后去自己服务器换取自己的登录凭证

        wx.request({

          url: 'https://test.com/login',

          data: { code: res.code },

          success: function(res) {

            var data = res.data

            // 把 SessionId 和过期时间放在内存中的全局对象和本地缓存里边

            app.globalData.sessionId =data.sessionId

            wx.setStorageSync('SESSIONID',data.sessionId)



            // 假设登录态保持1天

            var expiredTime = +new Date() +1*24*60*60*1000

            app.globalData.expiredTime =expiredTime

            wx.setStorageSync('EXPIREDTIME',expiredTime)

          }

        })

      }

    })

  }

})
  • 利用本地缓存恢复用户登录态SessionId
//app.js
App({
  onLaunch: function(options) {
    var sessionId =wx.getStorageSync('SESSIONID')
    var expiredTime =wx.getStorageSync('EXPIREDTIME')
    var now = +new Date()

    if (now - expiredTime 
  • 4.7.1 利用微信扫码能力
    利用wx.scanCode获取二维码的数据
//page.js

Page({

  // 点击“扫码订餐”的按钮,触发tapScan回调

  tapScan: function() {

    // 调用wx.login获取微信登录凭证

    wx.scanCode({

      success: function(res) {

        var num = res.result // 获取到的num就是餐桌的编号

      }

    })

  }

})
  • 利用wx.getNetworkType获取网络状态
//page.js
Page({

  // 点击“预览文档”的按钮,触发tap回调

  tap: function() {

    wx.getNetworkType({

      success: function(res) {

        // networkType字段的有效值:

        // wifi/2g/3g/4g/unknown(Android下不常见的网络类型)/none(无网络)

        if (res.networkType == 'wifi') {

          // 从网络上下载pdf文档

          wx.downloadFile({

            url:'http://test.com/somefile.pdf',

            success: function (res) {

              // 下载成功之后进行预览文档

              wx.openDocument({

                filePath: res.tempFilePath

              })

            }

          })

        } else {

          wx.showToast({ title: '当前为非Wifi环境' })

        }

      }

    })

  }

})

<以上资讯仅供参考,如果您需解决具体问题,建议您关注作者;如果有软件产品开发需求,可在线咨询加速度产品经理获取方案和报价>

****更多行业产品开发方案,请关注jsudo加速度 https://www.jsudo.com***

【加速度jsudo(www.jsudo.com)】是国内知名企业数字化建设提供商,为企业提供电商平台搭建(多种模式电商平台搭建:B2B/B2B2C/B2C/O2O/新零售等)、智慧园区建设、数字化营销、人才外包等服务,点击这里查看了解更多行业解决方案。