小程序多个echars_小程序界面与逻辑

主要内容数据绑定、渲染、界面层数据渲染和事件处理。

ee7c8937c7dce223382175d365ca2a74.png

一、数据绑定

1.1 渲染层和逻辑层

小程序宿主环境

我们称微信客户端给小程序所提供的环境为宿主环境。小程序借助宿主环境提供的能力,可以完成许多普通网页无法完成的功能。

小程序开发框架的目标是通过尽可能简单、高效的方式让开发者可以在微信中开发具有原生 APP 体验的服务。

整个小程序框架系统分为两部分:逻辑层(App Service)和 视图层(View)

逻辑层与渲染层分离

ae045fe6d40c958255b58c140f820ead.png

首先,我们来简单了解下小程序的运行环境。小程序的运行环境分成渲染层和逻辑层,其中 WXML 模板和 WXSS 样式工作在渲染层,JS 脚本工作在逻辑层。

小程序的渲染层和逻辑层分别由2个线程管理:渲染层的界面使用了WebView 进行渲染;逻辑层采用JsCore线程运行JS脚本。一个小程序存在多个界面,所以渲染层存在多个 WebView线程,这两个线程的通信会经由微信客户端(下文中也会采用Native来代指微信客户端)做中转,逻辑层发送网络请求也经由Native转发,小程序的通信模型下图所示。

1.2 逻辑文件介绍app.js pages.js

app.js 小程序逻辑

每个小程序都需要在 app.js 中调用 App 方法注册小程序实例,绑定生命周期回调函数、错误监听和页面不存在监听函数等

生命周期回调函数:小程序从创建到销毁的整个过程,自动创建的一些函数

包含内容:

  1. 全局变量 globalData:{}
  2. 生命周期函数
  3. 定义事件函数

pages.js 页面逻辑

对于小程序中的每个页面,都需要在页面对应的 js 文件中进行注册,指定页面的初始数据、生命周期回调、事件处理函数等

  1. data界面视图的数据内容

2.自己的生命周期函数

3.自定义事件的函数

1.3 逻辑层javascript

我们先看下小程序的javascript和普通页面的javascript区别

小程序javascript的三个特点:

1.小程序不是运行在浏览器中,没有BOM和DOM

console.log(window) ->undefined

console.log(document) ->undefined

2.小程序的js有一些额外的成员

App()方法 用于定义应用程序实例对象

Page()方法 用于定义页面对象

getApp()方法 用于获取全局的应用程序对象

wx 对象 提供核心API

// xxx.jsconst appInstance = getApp()

console.log(appInstance.globalData) // I am global data

3.小程序的js支持Commonjs规范

module.exports={} 导出

var data=require(./data.js) 引入

模块化

可以将一些公共的代码抽离成为一个单独的 js 文件,作为一个模块。模块通过 module.exports 对外暴露接口。

在需要使用这些模块的文件中,使用 require 将公共代码引入

在 JavaScript 文件中声明的变量和函数只在该文件中有效 不同的文件中可以声明相同名字的变量和函数,不会互相影响

1.4 界面层数据绑定

1.4.1 数据绑定

WXML 中的动态数据均来自对应 Page 的 data。

界面

逻辑

data

简单绑定

数据绑定使用 Mustache 语法(双大括号)将变量包起来,可以作用于:

内容

组件属性(需要在双引号之内)

{{}}语法用途

表达式 获取变量 绑定class属性

特殊地方:

1.4.2 列表渲染

wx:for

在组件上使用 wx:for 控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件。

默认数组的当前项的下标变量名默认为 index,数组当前项的变量名默认为 item

使用 wx:for-item 可以指定数组当前元素的变量名,

使用 wx:for-index 可以指定数组当前下标的变量名:

类似 block wx:if,也可以将 wx:for 用在<block/>标签上,以渲染一个包含多节点的结构块。例如:

1.4.3 条件渲染

wx:if

在框架中,使用 wx:if="" 来判断是否需要渲染该代码块:

因为 wx:if 是一个控制属性,需要将它添加到一个标签上。如果要一次性判断多个组件标签,可以使用一个 <block/> 标签将多个组件包装起来,并在上边使用 wx:if 控制属性。

注意: <block/> 并不是一个组件,它仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性。

wx:if vs hidden

因为 wx:if 之中的模板也可能包含数据绑定,所以当 wx:if 的条件值切换时,框架有一个局部渲染的过程,因为它会确保条件块在切换时销毁或重新渲染。

同时 wx:if 也是惰性的,如果在初始渲染条件为 false,框架什么也不做,在条件第一次变成真的时候才开始局部渲染。

相比之下,hidden 就简单的多,组件始终会被渲染,只是简单的控制显示与隐藏。

一般来说,wx:if 有更高的切换消耗而 hidden 有更高的初始渲染消耗。因此,如果需要频繁切换的情景下,用 hidden 更好,如果在运行时条件不大可能改变则 wx:if 较好。

二、事件处理

2.1 什么是事件

  • 事件是视图层到逻辑层的通讯方式。
  • 事件可以将用户的行为反馈到逻辑层进行处理。
  • 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数。
  • 事件对象可以携带额外信息,如 id, dataset, touches

事件的使用方式

在组件中绑定一个事件处理函数。

如bindtap,当用户点击该组件的时候会在该页面对应的Page中找到相应的事件处理函数。

<view id="tapTest" data-hi="WeChat" bindtap="tapName"> Click me! </view>

在相应的Page定义中写上相应的事件处理函数,参数是event。

2.2 事件冒泡

2.2.1 事件分类

事件分为冒泡事件和非冒泡事件:

冒泡事件:当一个组件上的事件被触发后,该事件会向父节点传递。

非冒泡事件:当一个组件上的事件被触发后,该事件不会向父节点传递。

2.2.2 绑定并阻止事件冒泡

除 bind 外,也可以用 catch 来绑定事件。与 bind 不同, catch 会阻止事件向上冒泡

例如在下边这个例子中,点击 inner view 会先后调用handleTap3和handleTap2(因为tap事件会冒泡到 middle view,而 middle view 阻止了 tap 事件冒泡,不再向父节点传递),点击 middle view 会触发handleTap2,点击 outer view 会触发handleTap1。

2.3 事件传参

dataset

在组件节点中可以附加一些自定义数据。这样,在事件中可以获取这些自定义的节点数据,用于事件的逻辑处理。

在 WXML 中,这些自定义数据以 data- 开头,多个单词由连字符 - 连接。这种写法中,连字符写法会转换成驼峰写法,而大写字符会自动转成小写字符。如:

  • data-element-type ,最终会呈现为 event.currentTarget.dataset.elementType ;
  • data-elementType ,最终会呈现为 event.currentTarget.dataset.elementtype 。

示例:

c1c09df1c4cd345ad592b869dbbbe97b.png

2.4单数数据流

实现数据同步修改

index.wxml

2755de16aea5e73f897f31ff0f743b02.png

3e22c4e5eb97b67f2d358bedaf3c11ff.png

模板使用

WXML提供模板(template),可以在模板中定义代码片段,然后在不同的地方调用。

3.1 定义模板

使用 name 属性,作为模板的名字。然后在<template/>内定义代码片段,如:

f6858c08d11a70699709269413e5bd8c.png

3.2 使用模板

使用 is 属性,声明需要的使用的模板,然后将模板所需要的 data 传入,如:

1493cdcc4b2befbaa8d816471cb9c9db.png

is 属性可以使用 Mustache 语法,来动态决定具体需要渲染哪个模板:

13347b254c3125ea43a014486fc48de6.png

三、网易云精选案例

效果图:

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

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

相关文章

LeetCode 1876. 长度为三且各字符不同的子字符串

文章目录1. 题目2. 解题1. 题目 如果一个字符串不含有任何重复字符&#xff0c;我们称这个字符串为 好 字符串。 给你一个字符串 s &#xff0c;请你返回 s 中长度为 3 的 好子字符串 的数量。 注意&#xff0c;如果相同的好子字符串出现多次&#xff0c;每一次都应该被记入…

numpy维度交换_数据分析-gt;基本操作numpy(1)

1.Numpy介绍与安装Numpy是什么&#xff1f;Numpy(Numerical Python)是目前Python数值计算中最为重要的基础包。大多数计算包都提供了基于Numpy的科学函数功能&#xff0c;将Numpy的数组对象作为数据交换的通用语。Numpy特点提供高效多维数组提供了基于数组的便捷算术操作以及广…

C#学习记录3上——类的封装,继承,多态

OOP面向对象的三大特点&#xff1a;封装&#xff08;encapsulation&#xff09;&#xff0c;继承&#xff08;inheritance&#xff09;&#xff0c;多态&#xff08;encapsulation&#xff09; 和JAVA与C一样&#xff0c;C#也是OOP语言。并且&#xff0c;C#对数据的封装要比C更…

LeetCode 1878. 矩阵中最大的三个菱形和(模拟)

文章目录1. 题目2. 解题1. 题目 给你一个 m x n 的整数矩阵 grid 。 菱形和 指的是 grid 中一个正菱形 边界 上的元素之和。 本题中的菱形必须为正方形旋转45度&#xff0c;且四个角都在一个格子当中。 下图是四个可行的菱形&#xff0c;每个菱形和应该包含的格子都用了相应颜…

计算尖峰电流的目的_入门必看!负荷计算的目的、方法以及原则详解

感谢关注【易筑电气】&#xff0c;我们会定期为您推送最新的电气资讯和各类实用干货&#xff0c;欢迎有料的电气设计师加入我们的QQ交流群&#xff1a;571819142。想了解我们的线上讲师招募计划&#xff1f;添加QQ&#xff1a;3335847624 开启新世界~负荷计算目的和意义低压供配…

上下伸缩代码_CQRS之旅——旅程4(扩展和增强订单和注册限界上下文)

旅程4&#xff1a;扩展和增强订单和注册限界上下文进一步探索订单和注册的有界上下文。“我明白&#xff0c;如果一个人想看些新鲜的东西&#xff0c;旅行并不是没有意义的。”儒勒凡尔纳&#xff0c;环游世界80天对限界上下文的更改&#xff1a;前一章详细描述了订单和注册限界…

LeetCode 1879. 两个数组最小的异或值之和(状态压缩DP)

文章目录1. 题目2. 解题2.1 回溯2.2 状态压缩DP1. 题目 给你两个整数数组 nums1 和 nums2 &#xff0c;它们长度都为 n 。 两个数组的 异或值之和 为 (nums1[0] XOR nums2[0]) (nums1[1] XOR nums2[1]) ... (nums1[n - 1] XOR nums2[n - 1]) &#xff08;下标从 0 开始&am…

二叉排序树的后序遍历序列必然是递增的_剑指offer 33——二叉搜索树的后序遍历序列...

本题主要在于考察对二叉搜索树和后序遍历的理解。原题输入一个整数数组&#xff0c;判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true&#xff0c;否则返回 false。假设输入的数组的任意两个数字都互不相同。参考以下这颗二叉搜索树&#xff1a;5 / 2 6…

LeetCode 1880. 检查某单词是否等于两单词之和

文章目录1. 题目2. 解题1. 题目 字母的 字母值 取决于字母在字母表中的位置&#xff0c;从 0 开始 计数。即&#xff0c;a -> 0、b -> 1、c -> 2&#xff0c;以此类推。 对某个由小写字母组成的字符串 s 而言&#xff0c;其 数值 就等于将 s 中每个字母的 字母值 按…

查询去除空值_SQL数据处理(五):SQL多表查询

一. 表的加法加法(union)。合并两张数据表course和course1/去除重复行重合【select 课程号,课程名称 from course union select 课程号,课程名称 from course1;】 输出结果两个表合并的数据若要保留重复的行数据(union all)【select 课程号,课程名称 from course union all sel…

WPS Office文档未保存怎么恢复

有时候用WPS Office时&#xff0c;文档还没保存&#xff0c;因为电脑卡死或者关机&#xff0c;再次打开时编辑的内容都不见了&#xff0c;这个时候可以利用WPS自带的备份功能来恢复文档&#xff0c;表格、幻灯片、文档都是可以的。 首先单击WPS左上角的按钮&#xff0c;选择&qu…

LeetCode 664. 奇怪的打印机(区间DP)

文章目录1. 题目2. 解题1. 题目 有台奇怪的打印机有以下两个特殊要求&#xff1a; 打印机每次只能打印由 同一个字符 组成的序列。每次可以在任意起始和结束位置打印新字符&#xff0c;并且会覆盖掉原来已有的字符。 给你一个字符串 s &#xff0c;你的任务是计算这个打印机…

程序闪退怎么运行_苹果应用程序崩溃闪退怎么办?如何解决苹果设备的软故障?...

你们在使用苹果设备的时候是不是经常遇到程序卡死&#xff0c;或者苹果设备假死的情况&#xff1f;如果您遇到程序崩溃闪退或报错的时候&#xff0c;请不要慌张&#xff0c;按照以下方法解决问题。苹果设备它是应用程序问题还是设备故障&#xff1f;首先&#xff0c;您必须弄清…

lxrun不是内部或外部命令_在Win10 安装 WSL的Linux子系统,解决cmd中执行lxrun时提示“不是内部或外部命令”...

Win10 安装Linux子系统原理就是安装一个&#xff08;Linux系统的&#xff09;应用程序。使用应用程序一般的使用Linux子系统&#xff0c;非常方便。第一步&#xff1a;启用开发者模式启用开发者模式&#xff0c;其实很简单&#xff0c;本人参考的是该文章&#xff1a;手把手教你…

LeetCode 1886. 判断矩阵经轮转后是否一致

文章目录1. 题目2. 解题1. 题目 给你两个大小为 n x n 的二进制矩阵 mat 和 target 。 现 以 90 度顺时针轮转 矩阵 mat 中的元素 若干次 &#xff0c;如果能够使 mat 与 target 一致&#xff0c;返回 true &#xff1b; 否则&#xff0c;返回 false 。 示例 1&#xff1a; …

ggplot2中显示坐标轴_qplot()——ggplot2的快速绘图

先前写过几篇用ggplot2进行基本绘图的文章&#xff0c;但对于初学者&#xff0c;或只需绘制简单图形时&#xff0c;这些命令显得繁琐&#xff0c;这里介绍ggplot2中的快速绘图函数qplot(). 此函数相对能较快速便捷地绘制图形。往期文章&#xff1a;张光耀&#xff1a;ggplot2数…

LeetCode 879. 盈利计划(动态规划)

文章目录1. 题目2. 解题1. 题目 集团里有 n 名员工&#xff0c;他们可以完成各种各样的工作创造利润。 第 i 种工作会产生 profit[i] 的利润&#xff0c;它要求 group[i] 名成员共同参与。如果成员参与了其中一项工作&#xff0c;就不能参与另一项工作。 工作的任何至少产生…

python 数字、字符串与 time时间/日期 的转换

获取当前时间戳 >>> import time >>> num time.time() # 当前时间戳, 7位浮点 >>> type(num) <class float> >>> num 1623302086.1892786数字 转 时间 >>> t time.localtime(num) # 数字 转 时间 >>> type(t…

Convert Windows 32bit dirver to Windows 64bit

Pre-condition: 1.source code(vc6.0WDK based) Development environment: 2.VS2013 3.WDK 8/8.1 Steps: 1.Create a new project. File->New->Visual C->Windows Driver 2.Copy .c and .h source code to project 3.Modify project property xxx属性页->配置属性-…

小程序 模糊查询_[轻应用小程序]如何使用信息查询功能?

本文内容结构如下图一、查询功能是什么&#xff1f;有什么作用&#xff1f;对于企业&#xff0c;会有一些和自身业务相关的数据&#xff0c;需要给到客户提供“查询信息”或“查询缴费”服务。查询信息&#xff1a;学校、培训机构&#xff1a;查询成绩。人力招聘&#xff1a;面…