微信小程序-场景功能-开发文档学习笔记

news2025/1/14 18:03:34

界面常见的交互反馈

查看更多学习笔记:GitHub:LoveEmiliaForever
微信小程序开发指南
微信小程序开发文档
用户和小程序上进行交互的时候,某些操作可能比较耗时,我们应该予以及时的反馈以舒缓用户等待的不良情绪(良好的使用体验)

触摸反馈

通常页面会摆放一些button按钮或者view区域,用户触摸按钮之后会触发下一步的操作,这种情况下,我们要对触摸这个行为给予用户一些响应
小程序的view容器组件和button组件提供了hover-class属性,触摸时会往该组件加上对应的class改变组件的样式

.hover{
  background-color: gray;
}
<button hover-class="hover"> 点击button </button>
<view hover-class="hover"> 点击view</view>

有时候在点击button按钮处理更耗时的操作时,我们也会使用button组件的loading属性,在按钮的文字前边出现一个Loading(一直转的圈圈)

<button loading="{{loading}}" bindtap="tap">操作</button>
Page({
  data: { loading: false },
  tap: function() {
    // 把按钮的loading状态显示出来
    this.setData({
      loading: true
    })
    // 接着做耗时的操作
  }
})

Toast和模态对话框

弹出式提示Toast用在显示提示消息的场景上,Toast提示默认1.5秒后自动消失

Page({
  onLoad: function() {
    wx.showToast({ // 显示Toast
      title: '已发送',
      icon: 'success',
      duration: 1500
    })
    // wx.hideToast() // 隐藏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构造器onPullDownRefresh回调会被触发,此时开发者重新拉取新数据进行渲染

//page.json
{"enablePullDownRefresh": true }
//page.js
Page({
  onPullDownRefresh: function() {
    // 用户触发了下拉刷新操作
    // 拉取新数据重新渲染界面
    // wx.stopPullDownRefresh() // 可以停止当前页面的下拉刷新。
  }
})

有时当滚动到底部时,会再加载一些数据渲染出来
这个交互操作叫为上拉触底,宿主环境提供了上拉的配置和操作触发的回调

//page.json
// 界面的下方距离页面底部距离小于onReachBottomDistance像素时触发onReachBottom回调
{"onReachBottomDistance": 100 }
//page.js
Page({
  onReachBottom: function() {
    // 当界面的下方距离页面底部距离小于100像素时触发回调
  }
})

当然我们有些时候并不想整个页面进行滚动,而是页面中某一小块区域需要可滚动,此时就要用到宿主环境所提供的scroll-view可滚动视图组件
可以通过组件的scroll-xscroll-y属性决定滚动区域是否可以横向或者纵向滚动,scroll-view组件也提供了丰富的滚动回调触发事件

发起HTTPS网络通信

小程序经常需要往服务器传递数据或者从服务器拉取信息,这个时候可以使用wx.request这个API

wx.request({
  url: 'https://test.com/getinfo',
  success: function(res) {
    console.log(res)// 服务器回包信息
  }
})

在这里插入图片描述

服务器接口

url参数是当前发起请求的服务器接口地址,小程序宿主环境要求request发起的网络请求必须是https协议请求,因此开发者服务器必须提供HTTPS服务的接口
wx.request请求的域名需要在小程序管理平台进行配置

请求参数

通过wx.request这个API,有两种方法把数据传递到服务器:通过url上的参数以及通过data参数
url:'https://test.com/getinfo?id=1&version=1.0.0'或者是data: { id:1, version:'1.0.0' }

header参数设置content-type头部为application/json,小程序发起的请求的包体内容就是data参数对应的JSON字符串

收到回包

小程序端收到回包后会触发success回调,同时回调会带上一个Object信息(属性如下)
在这里插入图片描述

只要成功收到服务器返回,无论HTTP状态码是多少都会进入success回调

使用技巧

设置超时时间
默认的request超时时间是60秒,可以通过app.json指定超时时间大小

{
  "networkTimeout": {"request": 3000}
}

微信登录

在这里插入图片描述

获取微信登录凭证code

上述微信登录的流程中并不是通过wx.login直接获取微信用户的id
如果以id为信息直接发送请求获取数据,那么可以通过伪造请求获取服务器的信息
wx.login生成一个带有时效性的凭证称为微信登录凭证code,其有效时间仅为5分钟

发送code到开发者服务器

在wx.login的success回调中拿到微信登录凭证,紧接着会通过wx.request把code传到开发者服务器,为了后续可以换取微信用户身份id

Page({
  tapLogin: function() {
    wx.login({
      success: function(res) {
        if (res.code) {
          wx.request({
            url: 'https://test.com/login',
            data: {
              username: 'zhangsan', // 用户输入的账号
              password: 'pwd123456', // 用户输入的密码
              code: res.code
            },
            success: function(res) {
              // 登录成功
              if (res.statusCode === 200) {
               console.log(res.data.sessionId)// 服务器回包内容
              }
            }
          })
        } else {
          console.log('获取用户登录态失败!' + res.errMsg)
        }
      }
    });
  }
})

到微信服务器换取微信用户身份id

后台拿到了前边wx.login()所生成的微信登录凭证code,此时就可以拿这个code到微信服务器换取微信用户身份
微信服务器为了确保拿code过来换取身份信息的人就是刚刚对应的小程序开发者,到微信服务器的请求要同时带上AppIdAppSecret
AppId和AppSecret是微信鉴别开发者身份的重要信息,AppId是公开信息,但是AppSecret是开发者的隐私数据不应该泄露
code在成功换取一次信息之后会立即失效

微信服务器提供的接口地址是:
https://api.weixin.qq.com/sns/jscode2session?appid=<AppId>&secret=<AppSecret>&js_code=<code>&grant_type=authorization_code
接口会返回以下字段:
在这里插入图片描述

  • openid就是前文一直提到的微信用户id,可以用这个id来区分不同的微信用户
  • 开发者可以用session_key请求微信服务器其他接口来获取一些其他信息(不要泄露)

绑定微信用户身份id和业务用户身份

微信会建议开发者把这两个信息的对应关系存起来,我们把这个对应关系称之为“绑定”
有了这个绑定信息,小程序在下次需要用户登录的时候就可以不需要输入账号密码
这样静默授权的登录方式显得非常便捷

业务登录凭证SessionId

开发者服务器和开发者的小程序应该也有会话密钥,在本书中我们就把它称之为SessionId
用户登录成功之后,开发者服务器需要生成会话密钥SessionId,在服务端保持SessionId对应的用户身份信息,同时把SessionId返回给小程序
小程序后续发起的请求中携带上SessionId,开发者服务器就可以通过服务器端的Session信息查询到当前登录用户的身份
这样我们就不需要每次都重新获取code,省去了很多通信消耗

本地数据缓存

本地数据缓存是小程序存储在当前设备上硬盘上的数据
我们可以利用本地数据缓存来存储用户在小程序上产生的操作
我们还可以利用本地缓存一些服务端非实时的数据提高小程序获取数据的速度

读写本地数据缓存

  • 通过wx.getStorage/wx.getStorageSync读取本地缓存
  • 通过wx.setStorage/wx.setStorageSync写数据到缓存
  • Sync后缀的接口表示是同步接口

wx.getStorage的使用

wx.getStorage({
  key: 'key1',
  success: function(res) {
    // 异步接口在success回调才能拿到返回值
    var value1 = res.data
  },
  fail: function() {
    console.log('读取key1发生错误')
  }
})

在这里插入图片描述

wx.setStorage的使用

wx.setStorage({
  key:"key",
  data:"value1"
  success: function() {
    console.log('写入value1成功')
  },
  fail: function() {
    console.log('写入value1发生错误')
  }
})

在这里插入图片描述

缓存限制和隔离

小程序宿主环境会管理不同小程序的数据缓存,不同小程序的本地缓存空间是分开的,每个小程序的缓存空间上限为10MB
考虑到同一个设备可以登录不同微信用户,宿主环境还对不同用户的缓存进行了隔离,避免用户间的数据隐私泄露
用户的关键信息不建议只存在本地缓存,应该把数据放到服务器端进行持久化存储

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

  • 我们在拉取信息数据后把数据存在本地缓存里
  • 在onLoad发起请求前,先检查是否有缓存过数据
  • 如果有的话直接渲染用户界面
  • 然后等到wx.request的success回调之后再覆盖本地缓存重新渲染新的用户界面

一般在对数据实时性/一致性要求不高的页面采用这个方法来做提前渲染,用以优化小程序体验

缓存用户登录态SessionId

通常用户在没有主动退出登录前,用户的登录态会一直保持一段时间,就无需用户频繁地输入账号密码
如果我们把SessionId记录在Javascript中某个内存变量,当用户关闭小程序再进来小程序时,之前内存的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 <=1*24*60*60*1000) {
      this.globalData.sessionId = sessionId
      this.globalData.expiredTime = expiredTime
    }
  },
  globalData: {
    sessionId: null,
    expiredTime: 0
  }
})

设备能力

小程序的宿主环境提供了非常多的操作设备能力来帮助用户在特定场景下做高效的输入,例如:扫码、操控蓝牙等等能力
也有很多设备能力不是为了解决输入低效问题而设计的,它们更多的是解决用户侧一些体验问题,例如:获取设备网络状态调整屏幕亮度等等

利用微信扫码能力

  • 把复杂的信息编码成一个二维码
  • 利用宿主环境wx.scanCode这个API调起微信扫一扫
  • 扫码后,wx.scanCode的success回调会收到二维码对应的字符串信息
//page.js
Page({
  // 点击“扫码订餐”的按钮,触发tapScan回调
  tapScan: function() {
    // 调用wx.login获取微信登录凭证
    wx.scanCode({
      success: function(res) {
        var num = res.result // 获取到的num就是餐桌的编号
      }
    })
  }
})

获取网络状态

手机连接到互联网有几种方式:Wifi、2G、3G、4G、5G
每种方式的上传速度和下载速度差异很大,它们的计费方式的差异也很大
考虑到这样的情况,我们可以通过小程序提供的获取网络状态的能力,做一些更友好的体验提示

利用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环境' })
        }
      }
    })
  }
})

小程序宿主环境也提供了一个可以动态监听网络状态变化的接口wx.onNetworkStatusChange,让开发者可以及时根据网络状况去调整小程序的体验

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1470926.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Centos服务器部署前后端项目

目录 准备工作1. 准备传输软件2. 连接服务器 部署Mysql1.下载Mysql(Linux版本)2. 解压3. 修改配置4. 启动服务另一种方法Docker 部署后端1. 在项目根目录中创建Dockerfile文件写入2. 启动 部署前端1. 在项目根目录中创建Dockerfile文件写入2. 启动 准备工作 1. 准备传输软件 …

机器学习:SVM算法(Python)

一、核函数 kernel_func.py import numpy as npdef linear():"""线性核函数:return:"""def _linear(x_i, x_j):return np.dot(x_i, x_j)return _lineardef poly(degree3, coef01.0):"""多项式核函数:param degree: 阶次:param …

曲线生成 | 图解B样条曲线生成原理(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 控制点计算之插值2 控制点计算之近似3 仿真实现3.1 ROS C实现3.2 Python实现3.3 Matlab实现 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细介绍全局规划(图搜索、采样法、智能算法等)&a…

正则表达式详细使用教程

正则是用于匹配字符串中字符组合的模式&#xff0c;在js中&#xff0c;正则也是对象。 定义正则的两种方式&#xff1a; 1.const 变量名new RegExp(/表达式/) <script>const req new RegExp(/a/)console.log(req.test("asd"))//true</script> 2.con…

Ansible 更换aliyun 镜像 并下载tree

目录 查看系统版本找到对应 的版本对当前镜像进行备份下载aliyuan更换成功安装扩展源更换源之后 的三个命令 这里安装一个aliyun 的镜像 本案例 仅供实验参考 生产环境中请谨慎使用 查看系统版本 先查看linux 的系统 版本 ansible slave -m shell -a uname -a找到对应 的版本…

SpringBoot 学习笔记

文章目录 一、IoC二、AOP三、bean3.1 bean 生命周期3.2 三种依赖注入方式3.3 bean 线程安全 四、SpringMVC五、常用注解5.1 Scope5.2 PostConstruct 和 PreDestroy5.3 Component 和 Bean5.4 Autowired 和 Resource 六、基于 ApplicationContextAware 实现工厂模式七、事务失效八…

Cubase学习:Cubase 12常用快捷键

按键盘上的上下箭头就可以让选中的音符向上或向下移动 数字0键: 停止 Ctrl+数字 0 键: 新建视图层 Alt+数字0 键: 重新设置视图层 小数点键: 播放指针回零点 数字1 键: 左定位指针 数字 2 键: 右定位指针 数字3 键--数字9键: 分别控制 3--9 的7个定位标志 Alt+数字1 键--数字9键…

BoomWorks使用wxWidgets+CodeBlocks+GCC开发的软件合集

♦️ 定时执行专家&#xff08;TimingExecutor&#xff09; V7.0 《定时执行专家》是一款制作精良、功能强大、毫秒精度、专业级的定时任务执行软件。软件具有 25 种【任务类型】、12 种【触发器】触发方式&#xff0c;并且全面支持界面化【Cron表达式】设置。软件采用多线程并…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 2月26日,星期一

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年2月26日 星期一 农历正月十七 1、 气象台&#xff1a;3月初之前南方大部将维持阴雨雪天气。 2、 据海关统计&#xff0c;京津冀协同发展十年成效显著&#xff0c;外贸总量跨两个万亿台阶。 3、 2024年研考初试成绩今天起…

C++入门全集(2):类与对象【上】

目录 一、前言 二、struct在C中的变化 三、类的定义 四、类的访问限定符 五、封装 六、类的实例化 七、类对象模型 7.1 如何计算类对象的大小 7.2 类对象的存储方式 八、this指针 8.1 this指针的用途 8.2 this指针的特性 一、前言 C语言是一种面向过程的语言&…

Folx Pro Mac中文p破解版如何使用?为您带来Folx Pro 详细使用教程!

​ Folx pro 5 中文版是mac上一款功能强大的老牌加速下载软件&#xff0c;新版本的Folx pro整体界面非常的简洁和漂亮&#xff0c;具有非常好用的分类管理功能&#xff0c;支持高速下载、定时下载、速度控制、iTunes集成等功能。Folx pro兼容主流的浏览器&#xff0c;不但可以下…

什么是媒体发稿?发稿媒体分类及发稿流程

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体发稿是一种企业推广和宣传的手段&#xff0c;通过媒体渠道传递企业信息和形象。 媒体发稿的含义在于&#xff0c;当企业有新闻、事件或其他消息需要对外公布时&#xff0c;可以选择…

氢氟酸在晶圆厂中的应用与防护

氢氟酸&#xff0c;这种剧毒液体竟然会被用在晶圆的生产中&#xff0c;这个可能让你匪夷所思。实际上&#xff0c;氢氟酸这种看似普通的清澈液体&#xff0c;实则在芯片生产中扮演了至关重要的角色。 氢氟酸的性质&#xff1f; 氢氟酸&#xff08;Hydrofluoric acid&#xff0c…

【VSCode】解决VSCode远程连接问题:远程主机可能不符合 glibc 和 libstdc++

今天用VSCode进行ssh连接时&#xff0c;提示“远程主机可能不符合 glibc 和 libstdc VSCode 服务器的先决条件”。查了一下发现这个问题主要是由于VSCode在一月份发布的最新版本v1.86中要求远程主机 glibc>2.28导致的&#xff0c;所以ssh连接Ubuntu 18.04的时候就会提示这个…

AI之T2I:Stable Diffusion 3的简介、安装和使用方法、案例应用之详细攻略

AI之T2I&#xff1a;Stable Diffusion 3的简介、安装和使用方法、案例应用之详细攻略 目录 Stable Diffusion 3的简介 1、效果测试 官方demo 网友提供 Stable Diffusion 3的安装和使用方法 1、安装 2、使用方法 Stable Diffusion 3的案例应用 1、基础案例 Stable Diff…

jmeter 测试数据库的详细方法

当前版本&#xff1a; jmeter 5.6.3mysql 5.7.39 简介 JMeter是一个功能强大的开源性能测试工具&#xff0c;它被广泛用于测试Web应用程序、Web服务、API、数据库以及其他类型的应用程序。支持测试数据库的性能和可靠性&#xff0c;可以模拟多个并发用户对数据库执行各种不同类…

react中修改state中的值无效?

// 初始化state state {personArr:[{name:张三,id:1},{name:李四,id:2},{name:王五,id:3}] }componentDidMount(){const newName 赵六const indexUpdate 1const newArr this.state.personArr.map((item,index)>{if(indexUpdate index){return {...item,name:newName}}e…

二阶低通滤波器(博途PLC SCL源代码)

在学习滤波器之前我们先了解下截止频率的准确定义,周期正弦信号经过传递函数后的输出信号,其幅值衰减-3dB时对应的频率。-3dB的含义是幅值衰减为原来的约0.707。更多滤波器信号处理相关内容请参看下面文章链接: 1、PLC一阶低通滤波器 https://rxxw-control.blog.csdn.net/…

174基于matlab的雷达数字信号处理

基于matlab的雷达数字信号处理。该程序具备对雷达目标回波的处理能力&#xff0c;能够从噪声中将目标检测出来&#xff0c;并提取目标的距离、速度、角度信息。有相应的试验文档。程序已调通&#xff0c;可直接运行。 174 雷达数字信号处理 目标检测出来 (xiaohongshu.com)

java数据结构与算法刷题-----LeetCode700. 二叉搜索树中的搜索

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 法一&#xff1a;递归2. 法二&#xff1a;迭代法 解题思路:时…