• 微信小程序学习笔记


    1. 生命周期和相关函数

    Page({
        data: {},
        // Page 实例的生命周期函数
        onLoad: (option) => {  // 页面初次加载时候触发,只会触发一次
            console.log(option.id) // 1
        },
        onReady: () => {},  // 页面初次渲染完毕,只会触发一次(页面已经准备妥当,在逻辑层可以和视图层进行交互了)
        onShow: () => {}, // 从别的页面进入到当前页面时调用
        onHide: () => {}, // wx.navigateTo 切换到其他页面或者底部tab切换时触发
        onUnload: () => {}, // 使用 wx.redirectTo 或者 wx.navigateBack 返回其他页面时候触发,当前页面会被销毁
        // 页面用户行为
        onPullDownRefresh: () => {},  // 需要在app.json的window选项中或页面配置中开启enablePullDownRefresh
        onReachBottom: () => {}, // 可以在app.json的window选项中或页面配置中设置触发距离onReachBottomDistance
        onShareAppMessage: () => {
            // 此事件需要 return 一个 Object,用于自定义转发内容
            return {
                title: 'xxx',
                path: '/yyy',
            }
        },
        onPageScroll: (obj) => {
            console.log(obj.scrollTop) // 页面在垂直方向已滚动的距离(单位px)
        },
        // 其他自定义函数
        getData: () => {
            this.formatDate() // 用 this.func 来访问实例中的函数
        },
        formatDate: () => {},
    })

    2. this.setDate

    this.setDate({
        key: value
    }, callback)
    key 的值非常灵活,可以以数据路径的形式给出(字符串形式),示例:
    data: {
        myInfo: {
            name: 'wangxi',
            age: '26'
        },
        user: [{
            nickName: 'Tony'
            gender: 'male'
        }]
    
    }
    this.setData({
        'userInfo.name': 'Raychan'
        'user[0].gender': 'female'
    })

    setDate会更新 this.data 中对应的值(同步的过程)
    并且把数据从逻辑层传递给渲染层,从而达到更新页面的目的(异步的过程)
    回调函数在setDate 对界面渲染完成后触发

    不要直接修改 this.data (注意和 vue 中修改数据的方式加以区别)

    综上,下面的代码是可以获取到到对应的data值的(和 React 中的 setState 不同)

    data: {
        name: 'wangxi'
    }
    
    this.setData({
        name: 'Raychan'
    })
    
    console.log(this.data.name) // Raychan

    3. 路由

    getCurrentPages() // 获取当前页面栈的实例

    4. 模块化

    // 公共代码导出
    module.export.funcName = funcName
    // 引用
    var name = require('funcName')

    5. 模板

    // define
    <template name='tpl'></template>
    // usage
    <template is='tpl'></template>

    6. 运行机制
    小程序没有重启的概念
    当小程序进入后台,客户端会维持一段时间的运行状态,超过一定时间后(目前是5分钟)会被微信主动销毁
    当短时间内(5s)连续收到两次以上收到系统内存告警,会进行小程序的销毁

    7. 请求API

    wx.request({
        url: 'test.php',
        data: {},
        header: { 'content-type': 'application/json' },
        success: function(res) {
             // 收到https服务成功后返回
             console.log(res.data)
        },
        fail: function() {
             // 发生网络错误等情况触发
        },
        complete: function() {
             // 成功或者失败后触发
        }
    })

    8. 获取系统信息

    wx.getSystemInfoSync()

    9. 页面交互反馈

    // view 容器和 button 组件提供了 hover-class 属性,触摸时会在该组件上加上对一个的样式
    <view hover-class="clsName"></view>
    // 在耗时操作时加上 loading 属性
    <button loading="{{loading}}" bindtap="tap"></button>
    
    data: { loading: false }
    tap: () => {
        this.setData({
            loading: true
        })
        // ajax etc...
    }

    10. 显示隐藏 toast

    wx.showToast({
        title: 'xxx',
        icon: 'success',
        duration: 1500, // 1.5 秒后消失
    })
    
    wx.hideToast()

    11. modal

    wx.showModal({
        title: '标题',
        content: '告知当前状态,信息和解决方法',
        confirmText: '主操作',
        cancelText: '次要操作',
        success: function(res) {
            if (res.confirm) {
                console.log('用户点击主操作')
            } else if (res.cancel) {
                  console.log('用户点击次要操作')
            }
         }
    })

    12. HTTP 请求

    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.hideLoading()
            hasClick = false
          }
        })
      }
    })

    13. 排查异常的方法
    在使用wx.request接口我们会经常遇到无法发起请求或者服务器无法收到请求的情况,我们罗列排查这个问题的一般方法:

    1. 检查手机网络状态以及wifi连接点是否工作正常。
    2. 检查小程序是否为开发版或者体验版,因为开发版和体验版的小程序不会校验域名。
    3. 检查对应请求的HTTPS证书是否有效,同时TLS的版本必须支持1.2及以上版本,可以在开发者工具的console面板输入showRequestInfo()查看相关信息。
    4. 域名不要使用IP地址或者localhost,并且不能带端口号,同时域名需要经过ICP备案。
    5. 检查app.json配置的超时时间配置是否太短,超时时间太短会导致还没收到回报就触发fail回调。
    6. 检查发出去的请求是否302到其他域名的接口,这种302的情况会被视为请求别的域名接口导致无法发起请求。

    14. 缓存

    • wx.getStorage()
    • wx.getStorageSync()
    • wx.setStorage()
    • wx.setStorageSync()
    wx.getStorage({
        key: 'key1',
        success: res => {
            console.log(res)
        },
        fail: (err) => {
            console.log(err)
        }
    })
    
    try {
        const value = wx.getStorageSync('key2')
    } catch (e) {
        console.log(e)
    }
    
    // 写缓存
    wx.setStorage({
        key: 'key1',
        data: 'value1'
        success: res => {
            console.log(res)
        },
        fail: (err) => {
            console.log(err)
        }
    })

    利用本地缓存提前渲染界面

    Page({
      onLoad: function() {
        var that = this
        var list =wx.getStorageSync("list")
        if (list) { // 本地如果有缓存列表,提前渲染
          that.setData({ list })
        }
        wx.request({
          url: 'https://test.com/getproductlist',
          success: function (res) {
            if (res.statusCode === 200) {
              list = res.data.list
              that.setData({ list }) // 再次渲染列表
              wx.setStorageSync("list", list) // 覆盖缓存数据
            }
          }
        })
      }
    })
  • 相关阅读:
    Oracle根据【日期】组,其他条件根据PIVOT行转列。使每个日期条件关联的其他数据只有一行。
    ORACLE数据库,数据量大,转移数据到备份表语句
    C#解析"a=1&b=2&c=3"字符串,微信支付返回字符串,替换<br>为&
    dataTable的数据,调试的时候点放大镜就看到了啊啊啊!
    Debug和Release 老程序啊 调试之前 区分一下啊
    FastReport.NET
    grpc 实现微服务生态笔记
    金木水火土
    shell 指令分析nginx 日志qps
    idea中使用tomcat 方式启动spring boot项目
  • 原文地址:https://www.cnblogs.com/wx1993/p/9415429.html
Copyright © 2020-2023  润新知