微信小程序-宿主环境-开发文档学习笔记

查看更多学习笔记:GitHub:LoveEmiliaForever
微信小程序开发指南
微信小程序开发文档

渲染层和逻辑层

WXML 模板和 WXSS 样式工作在渲染层,JS 脚本工作在逻辑层

  1. 渲染层和数据相关。
  2. 逻辑层负责产生、处理数据。
  3. 逻辑层通过 Page 实例的 setData 方法传递数据到渲染层。

通信模型

在这里插入图片描述

数据驱动

如果有某种“方法”可以让状态和视图绑定在一起(状态变更时,视图也能自动变更),那我们就可以省去手动修改视图的工作,这个方法就是数据驱动

WXML结构实际上等价于一棵Dom树,通过一个JS对象也可以来表达Dom树的结构

在这里插入图片描述

WXML可以先转成JS对象,然后再渲染出真正的Dom树

在这里插入图片描述

通过setData把msg数据从“Hello World”变成“Goodbye”,产生的JS对象对应的节点就会发生变化
此时可以对比前后两个JS对象得到变化的部分,然后把这个差异应用到原来的Dom树上
从而达到更新UI的目的,这就是数据驱动的原理

在这里插入图片描述

双线程下的界面渲染

在渲染层,宿主环境会把WXML转化成对应的JS对象
逻辑层发生数据变更时,通过宿主环境提供的setData方法把数据从逻辑层传递到渲染层
经过对比前后差异,把差异应用在原来的Dom树上

在这里插入图片描述

程序与页面

从逻辑组成来说,一个小程序是由多个页面组成的程序
了解程序和页面的概念以及它们的生命周期是非常重要的

程序

小程序指的是产品层面的程序,而程序指的是代码层面的程序实例
为了避免误解,下文采用App来代替代码层面的程序概念

程序构造器App()

App() 构造器必须写在项目根目录的app.js里,App实例是单例对象,在其他JS脚本中可以使用宿主环境提供的 getApp() 来获取程序实例
App构造器接受一个Object参数

App({onLaunch: function(options) {},onShow: function(options) {},onHide: function() {},onError: function(msg) {},globalData: 'I am global data'
})

在这里插入图片描述

程序的生命周期和打开场景

初次进入小程序的时候,微信客户端初始化好宿主环境,同时从网络下载或者从本地缓存中拿到小程序的代码包,把它注入到宿主环境,初始化完毕后,微信客户端就会给App实例派发onLaunch事件,App构造器参数所定义的onLaunch方法会被调用

可以看到,App的生命周期是由微信客户端根据用户操作主动触发的。为了避免程序上的混乱,我们不应该从其他代码里主动调用App实例的生命周期函数

在微信客户端中打开小程序有很多途径,微信客户端会把打开方式带给onLaunchonShow的调用参数options
点击查看所有的途径参数(场景值)

onLaunch,onShow参数
在这里插入图片描述

支持返回 referrerInfo.appId 的场景
在这里插入图片描述

小程序全局数据

JS脚本是运行在JsCore的线程里,小程序的每个页面各自有一个WebView线程进行渲染
小程序切换页面时,小程序逻辑层的JS脚本运行上下文依旧在同一个JsCore线程中
App实例是单例的,因此不同页面直接可以通过App实例下的属性来共享数据

要特别留意一点,所有页面的脚本逻辑都跑在同一个JsCore线程,页面使用setTimeout或者setInterval的定时器,然后跳转到其他页面时,这些定时器并没有被清除,需要开发者自己在页面离开的时候进行清理

页面

一个小程序可以有很多页面,每个页面承载不同的功能,页面之间可以互相跳转

文件构成和路径

一个页面是分三部分组成:界面、配置和逻辑
一个页面的文件需要放置在同一个目录下,其中WXML文件和JS文件是必须存在的,JSON和WXSS文件是可选的
页面路径需要在小程序代码根目录app.json中的pages字段声明,否则这个页面不会被注册到宿主环境中,默认pages字段的第一个页面路径为小程序的首页

页面构造器Page()

宿主环境提供了 Page() 构造器用来注册一个小程序页面,Page()在页面脚本page.js中调用
Page构造器接受一个Object参数
在这里插入图片描述

页面的生命周期和打开参数

  • 页面初次加载的时候,微信客户端就会给Page实例派发onLoad事件,onLoad在页面没被销毁之前只会触发1次
  • 页面显示之后,Page构造器参数所定义的onShow方法会被调用,从别的页面返回到当前页面时,当前页的onShow方法都会被调用
  • 页面初次渲染完成时,Page构造器参数所定义的onReady方法会被调用,onReady在页面没被销毁前只会触发1次
  • 页面不可见时,Page构造器参数所定义的onHide方法会被调用,这种情况会在使用wx.navigateTo切换到其他页面、底部tab切换时触发
  • 当前页面使用wx.redirectTowx.navigateBack返回到其他页时,当前页面会被微信客户端销毁回收,此时Page构造器参数所定义的onUnload方法会被调用

onLoad早于 onShow,onShow早于onReady
Page的生命周期是由微信客户端根据用户操作主动触发的。为了避免程序上的混乱,我们不应该在其他代码中主动调用Page实例的生命周期函数

页面的打开参数query
页面Page构造器里onLoad的option可以拿到当前页面的打开参数,其类型是一个Object,其键值对与页面URL上query键值对一一对应
微信小程序的页面链接和URL一样,同时也要用UrlEncode

页面的数据

data参数是页面第一次渲染时从逻辑层传递到渲染层的数据
Page实例的原型中有setData函数,我们可以在Page实例下的方法调用this.setData把数据传递给渲染层,从而达到更新界面的目的
setData传递数据实际是一个异步的过程,所以setData的第二个参数是一个callback回调,在这次setData对界面渲染完毕后触发
data中的key还可以非常灵活,以数据路径的形式给出this.setData({"d[1].text": 'Goodbye'}),注意此时key要用双引号

  • 直接修改 Page实例的this.data 而不调用 this.setData 是无法改变页面的状态的,还会造成数据不一致
  • 由于setData是需要两个线程的一些通信消耗,为了提高性能,每次设置的数据不应超过1024kB
  • 不要把data中的任意一项的value设为undefined,否则可能会有引起一些不可预料的bug

页面的用户行为

  • 下拉刷新 onPullDownRefresh
    • 监听用户下拉刷新事件,需要在app.json的window选项中或页面配置page.json中设置enablePullDownRefresh为true
    • 当处理完数据刷新后,wx.stopPullDownRefresh可以停止当前页面的下拉刷新
  • 上拉触底 onReachBottom
    • 监听用户上拉触底事件,可以在app.json的window选项中或页面配置page.json中设置触发距离onReachBottomDistance
    • 在触发距离内滑动期间,本事件只会被触发一次
  • 页面滚动 onPageScroll
    • 监听用户滑动页面事件,参数为 Object,包含 scrollTop 字段,表示页面在垂直方向已滚动的距离(单位px)
  • 用户转发 onShareAppMessage
    • 只有定义了此事件处理函数,右上角菜单才会显示“转发”按钮
    • 此事件需要return一个Object,包含title和path两个字段,用于自定义转发内容

页面跳转和路由

一个小程序拥有多个页面,我们可以通过wx.navigateTo推入一个新的页面
页面以栈的形式表示,称为页面栈,以列表形式书写(前底后顶)
小程序宿主环境限制了这个页面栈的最大层级为10层

  • wx.navigateTo({ url: 'pageD' }) 可以往当前页面栈多推入(进入)一个 pageD
  • wx.navigateBack() 可以推出(退出)当前页面栈的最顶上页面
  • wx.redirectTo({ url: 'pageE' }) 是替换当前页变成pageE

小程序提供了原生的Tabbar支持,我们可以在app.json声明tabBar字段来定义Tabbar页

  "tabBar": {"list": [{ "text": "Tab1", "pagePath": "pageA" },{ "text": "Tab1", "pagePath": "pageF" },{ "text": "Tab1", "pagePath": "pageG" }]}
  • 使用wx.switchTab({ url: 'pageF' }),此时原来的页面栈会被清空(除了已经声明为Tabbar页外的其他页面会被销毁),然后会切到pageF所在的tab页面
  • wx.navigateTowx.redirectTo只能打开非TabBar页面,wx.switchTab只能打开Tabbar页面
  • 使用 wx. reLaunch({ url: 'pageH' }) 重启小程序,并且打开pageH

在这里插入图片描述

A和B是Tab页面,C由A进,D由C进:[A[C[D]], B]
Tabbar页面初始化之后不会被销毁
在这里插入图片描述

可以看到,这些页面的运作就是和栈一样的进入退出

组件和API

组件

一个小程序页面可以分解成多个部分组成,组件就是小程序页面的基本组成单元
小程序的宿主环境提供了一系列基础组件
用起来和Vue的组件、HTML标签差不多

全部组件的文档

API

宿主环境提供了丰富的API,可以很方便调起微信提供的能力
wx对象实际上就是小程序的宿主环境所提供的全局对象,几乎所有小程序的API都挂载在wx对象底下

  1. wx.on* 开头的 API 是监听某个事件发生的API接口,接受一个 Callback 函数作为参数
  2. 如未特殊约定,多数 API 接口为异步接口 ,都接受一个Object作为参数
  3. API的Object参数一般由successfailcomplete三个回调来接收接口调用结果
  4. wx.get* 开头的API是获取宿主环境数据的接口
  5. wx.set* 开头的API是写入数据到宿主环境的接口
wx.request({url: 'test.php',data: {},header: { 'content-type': 'application/json' },success: function(res) {// 接口调用成功触发console.log(res.data)},fail: function() {// 接口调用失败触发},complete: function() {// 接口调用结束触发// 成功或者失败后触发}
})

有部分API会拉起微信的原生界面,此时会触发Page的onHide方法,当用户从原生界面返回到小程序时,会触发Page的onShow方法
API文档

事件

把这种用户在渲染层的行为反馈以及组件的部分状态反馈抽象为渲染层传递给逻辑层的事件
在这里插入图片描述

<!-- page.wxml -->
<view id="tapTest" data-hi="WeChat" bindtap="tapName"> Click me! </view>
// page.jsPage({tapName: function(event) {console.log(event)}
})

事件是通过bindtap这个属性绑定在组件上的,同时在当前页面的Page构造器中定义对应的事件处理函数tapName
用户点击该view区域时,达到触发条件生成事件tap,该事件处理函数tapName会被执行,同时还会收到一个事件对象event

事件类型和事件对象

常见事件类型
在这里插入图片描述

事件对象event
在这里插入图片描述

currentTarget为当前事件所绑定的组件,而target则是触发该事件的源头组件

target和currentTarget的event对象属性
在这里插入图片描述

touch和changedTouches的event对象属性
在这里插入图片描述

事件绑定与冒泡捕获

bind或者catch开头,然后跟上事件的类型,如bindtapcatchtouchstart,也可以是如bind:tapcatch:touchstart,bind和catch前还可以加上capture-来表示捕获阶段
然后加上="FuncName",FuncName是对应的页面Page构造器中定义同名的函数

bind和capture-bind的含义分别代表事件的冒泡阶段和捕获阶段
在这里插入图片描述

bind事件绑定不会阻止冒泡事件向上冒泡,catch事件绑定可以阻止冒泡事件向上冒泡

兼容

小程序的宿主环境一直在迭代更新,为了让你的小程序在不同环境下都能提供相应的服务,我们需要来了解一下在小程序中如何实现兼容办法
我们可能需要针对不同手机进行程序上的兼容,此时可以使用 wx.getSystemInfo 或者 wx.getSystemInfoSync 来获取手机品牌、操作系统版本号、微信版本号以及小程序基础库版本号等

wx.getSystemInfoSync(){brand: "iPhone",      // 手机品牌model: "iPhone 6",    // 手机型号platform: "ios",      // 客户端平台system: "iOS 9.3.4",  // 操作系统版本version: "6.5.23",    // 微信版本号SDKVersion: "1.7.0",  // 小程序基础库版本language: "zh_CN",    // 微信设置的语言pixelRatio: 2,        // 设备像素比screenWidth: 667,    // 屏幕宽度screenHeight: 375,     // 屏幕高度windowWidth: 667,    // 可使用窗口宽度windowHeight: 375,     // 可使用窗口高度fontSizeSetting: 16   // 用户字体大小设置}

随着宿主环境的更新,新版本的宿主环境会提供一些新的API,你可以通过判断此API是否存在来做程序上的兼容

if (wx.openBluetoothAdapter) {wx.openBluetoothAdapter()
} else {// 如果希望用户在最新版本的客户端上体验您的小程序,可以这样子提示wx.showModal({title: '提示',content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'})
}

小程序还提供了wx.canIUse这个API,用于判断接口或者组件在当前宿主环境是否可用
其参数格式为: ${API}.${method}.${param}.${options}或者${component}.${attribute}.${option}

  • ${API} 代表 API 名字
  • ${method} 代表调用方式,有效值为return, success, object, callback
  • ${param} 代表参数或者返回值
  • ${options} 代表参数的可选值
  • ${component} 代表组件名字
  • ${attribute} 代表组件属性
  • ${option} 代表组件属性的可选值

在不得已的情况下(小程序强依赖某个新的API或者组件时),还可以通过在小程序管理后台设置基础库最低版本设置来达到不向前兼容的目的

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

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

相关文章

09 Redis之分布式系统(数据分区算法 + 系统搭建与集群操作)

6 分布式系统 Redis 分布式系统&#xff0c;官方称为 Redis Cluster&#xff0c;Redis 集群&#xff0c;其是 Redis 3.0 开始推出的分布式解决方案。其可以很好地解决不同 Redis 节点存放不同数据&#xff0c;并将用户请求方便地路由到不同 Redis 的问题。 什么是分布式系统?…

unity发布webGL压缩方式的gzip,使用nginx作为web服务器时的配置文件

unity发布webGL压缩方式的gzip&#xff0c;使用nginx作为web服务器时的配置文件 Unity版本是&#xff1a;2021.3 nginx的版本是&#xff1a;nginx-1.25.4 Unity发布webgl时的测试 设置压缩方式是gzip nginx配置文件 worker_processes 1;events {worker_connections 102…

Open CASCADE学习|提取面的内外环线

在Open CASCADE中&#xff0c;区分内环和外环主要基于面的参数域内环线方向的定义。具体来说&#xff0c;在面的参数域内&#xff0c;沿着环线正方向前进时&#xff0c;如果左侧为面内、右侧为面外&#xff0c;那么该环线被视为外环&#xff1b;反之&#xff0c;如果左侧为面外…

k8s Pod基础(概念,容器功能及分类,镜像拉取和容器重启策略)

目录 pod概念 Kubernetes设计Pod概念和特殊组成结构的用意 Pod内部结构&#xff1a; 网络共享&#xff1a; 存储共享&#xff1a; pause容器主要功能 pod创建方式 pod使用方式 pod分类 pod的容器分类 基础容器&#xff08;infrastructure container&#xff09;&…

【文生视频】Diffusion Transformer:OpenAI Sora 原理、Stable Diffusion 3 同源技术

文生视频 Diffusion Transformer&#xff1a;Sora 核心架构、Stable Diffusion 3 同源技术 提出背景输入输出生成流程变换器的引入Diffusion Transformer (DiT)架构Diffusion Transformer (DiT)总结 OpenAI Sora 设计思路阶段1: 数据准备和预处理阶段2: 架构设计阶段3: 输入数据…

Spring定时任务--手动执行定时任务(替代@Scheduled)

原文网址&#xff1a;Spring定时任务--手动执行定时任务&#xff08;替代Scheduled&#xff09; 简介 本文介绍SpringBoot如何手动执行定时任务。 之前此文已经介绍过&#xff0c;直接用Scheduled即可使用Spring的定时任务&#xff0c;但有时需要手动去提交定时任务&#xf…

springboot项目打成含crud操作的sdk集成到springboot启动引擎项目

一 sdk配置操作 1.1 结构 sdk项目目录中只有基础的service类以及mybatis操作数据库的相关文件&#xff0c;service类中包含查询数据库的方法。 说明&#xff1a; 1.2 sdk的pom打包配置 作为公共项目打成jar供其他项目引用&#xff0c;注意被引入的项目不能使用默认的maven…

随机分布模型

目录 前言 一、离散型随机变量 1.1 0-1分布 1.2 二项分布 1.3 帕斯卡分布 1.4 几何分布 1.5 超几何分布 1.6 泊松分布 二、连续型随机变量 2.1 均匀分布 2.2 指数分布 2.3 高斯分布/正态分布 2.4 分布&#xff08;抽样分布&#xff09; 2.5 t分布&#xff08;抽样…

Vue | (六)使用Vue脚手架(下)| 尚硅谷Vue2.0+Vue3.0全套教程

文章目录 &#x1f4da;Vue 中的自定义事件&#x1f407;使用方法&#x1f407;案例练习&#x1f407;TodoList案例优化 &#x1f4da;全局事件总线&#x1f407;使用方法&#x1f407;案例练习&#x1f407;TodoList案例优化 &#x1f4da;消息订阅与发布&#x1f407;使用方法…

React18源码: Fiber树的初次创建过程图文详解

fiber树构造&#xff08;初次创建&#xff09; fiber树构造的2种情况&#xff1a; 1.初次创建 在React应用首次启动时&#xff0c;界面还没有渲染此时并不会进入对比过程&#xff0c;相当于直接构造一棵全新的树 2.对比更新 React应用启动后&#xff0c;界面已经渲染如果再次发…

微信小程序 --- 分包加载

分包加载 1. 什么是分包加载 什么是分包加载 ❓ 小程序的代码通常是由许多页面、组件以及资源等组成&#xff0c;随着小程序功能的增加&#xff0c;代码量也会逐渐增加&#xff0c;体积过大就会导致用户打开速度变慢&#xff0c;影响用户的使用体验。 分包加载是一种小程序…

遗传算法(Genetic Algorithm,GA)求解不闭合多旅行商问题(提供MATLAB代码)

一、遗传算法&#xff08;GA&#xff09;介绍 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;是一种模拟自然界生物进化过程的优化算法。它通过模拟生物的遗传、变异和选择等机制&#xff0c;来搜索问题的最优解。 遗传算法的基本思想是通过对候选解进行编…

stable diffusion学习笔记 手部修复

图片手部修复原理 某张图片在生成后&#xff0c;仅有手部表现不符合预期&#xff08;多指&#xff0c;畸形等&#xff09;。这种情况下我们通常使用【局部重绘】的方式对该图片的手部进行【图生图】操作&#xff0c;重新绘制手部区域。 但是仅采用重绘的方式也很难保证生成的…

笔记本如何录屏?很简单,我来告诉你

“最近遇到了一些工作上的问题&#xff0c;需要录制一些会议和讨论的内容&#xff0c;以便于后续的整理和回顾。但是&#xff0c;我没有使用过笔记本进行录屏&#xff0c;不知道该如何操作。大家有没有简单易懂的笔记本录屏指南&#xff0c;教教我&#xff01;” 在当今数字化…

选择VR全景行业,需要了解哪些内容?

近年来&#xff0c;随着虚拟现实、增强现实等技术的持续发展&#xff0c;VR全景消费市场得以稳步扩张。其次&#xff0c;元宇宙行业的高速发展&#xff0c;也在进一步拉动VR全景技术的持续进步&#xff0c;带动VR产业的高质量发展。作为一种战略性的新兴产业&#xff0c;国家和…

多重网格(Multigrid Method)-4

代数多重网格法简介&#xff08;Algebraic Multigrid&#xff09; 可以理解为对细网格上的方程&#xff0c;先使用光滑方法&#xff08;Gm&#xff09;进行迭代得到一个初始解&#xff0c;然后将这个初始解的残差乘限制算子转化到粗网格上得到粗网格的右端向量&#xff0c;再在…

流浪动物救助平台:Java开发的实践与思考

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

03_第三章 JavaScript(数据类型和运算符,流程控制和函数,JS的对象和JSON,事件的绑定,BOM编程,DOM编程,正则表达式)

文章目录 第三章 JavaScript一 JS简介1.1 JS起源JavaScript是一种基于对象的脚本语言&#xff0c;它不仅可以创建对象&#xff0c;也能使用现有的对象。但是面向对象的三大特性&#xff1a;『封装』、『继承』、『多态』中&#xff0c;JavaScript能够实现封装&#xff0c;可以模…

第十篇【传奇开心果系列】Python的文本和语音相互转换库技术点案例示例:Microsoft Azure开发语音翻译应用程序经典案例

传奇开心果博文系列 系列博文目录Python的文本和语音相互转换库技术点案例示例系列 博文目录前言一、雏形示例代码二、扩展思路介绍三、Azure多语种支持示例代码四、Azure实时对话模式示例代码五、Azure自定义翻译模型示例代码六、Azure语音合成示例代码七、Azure用户界面优化示…

多输入回归预测|WOA-CNN|鲸鱼算法优化的卷积神经网络回归预测(Matlab)

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分程序&#xff1a; 四、完整程序数据下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matalb平台编译…