支付宝小程序AXML、

303 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情

AXML

数据绑定

AXML 中的动态数据与对应的 Pagedata 内容绑定
数据绑定使用 [Mustache] 语法将变量用两对大括号 {{}} 封装,可在多种语法场景下使用

image.png

image.png

组件属性

组件属性使用双引号“”封装

image.png

image.png

控制属性

控制属性需使用双引号 "" 封装

image.png

image.png

关键字

关键字需使用双引号封装 ""

  • true:Boolean 类型的 true,代表真值。
  • false:Boolean 类型的 false,代表假值

image.png
注意: 不要直接写 checked="false",计算结果是一个字符串,转成布尔值类型后代表真值。

运算

可用两对大括号 {{}} 封装简单的运算。支持如下几种方式:

三元运算

image.png

算术运算

image.png

image.png
页面输出:

image.png

逻辑判断

image.png

字符串运算

image.png

image.png

数据路径运算

image.png

image.png

组合
  • 数组

image.png

image.png

image.png

  • 对象

image.png

image.png
最终组合成的对象是 {foo: 1, bar: 2}
也可用解构运算符 ... 来将一个对象展开:

image.png

image.png
最终组合成的对象是 {a: 1, b: 2, c: 3, d: 4, e: 5}

image.png
最终组合成的对象是 {foo: 'my-foo', bar:'my-bar'}

注意: 上面的方式可以随意组合,但是变量名相同时,后边的变量会覆盖前面的变量,例如:

image.png

image.png
最终组合成的对象是{a:5,b:3,c:6}

Q:跳转页面时,如何清除 data 数据中的数据?

A:无法清除,可以在跳转时覆盖之前的 data 值。

条件渲染

image.png

image.png a:if在框架中使用a:if=“{{condition}}”来判断是否需要渲染该代码块。

image.png
也可以使用 a:elifa:else 添加一个 else 块。

image.png

block a:if

image.png 因为 a:if 是控制属性,需要在标签中使用。如果要一次性判断多个组件标签,可以使用 <block/> 标签包装多个组件,并使用 a:if 来控制属性。(可以把多个组件标签包在一起)

image.png
说明<block/> 并不是一个组件,只是一个包装元素,不会在页面中做任何渲染,只接受控制属性。

对比 a:if 与 hidden
  • a:if 中的模板可能包含数据绑定,所以当 a:if 的条件值切换时,框架有局部渲染的过程,用于确保条件块在切换时销毁或重新渲染。此外, a:if 在初始渲染条件为 false 时,不触发任何渲染动作,当条件第一次变成 true 时才开始局部渲染。
  • hidden 控制显示与隐藏,组件始终会被渲染。 一般来说,a:if 有更高的切换消耗而 hidden 有更高的初始渲染消耗。因此,在需要频繁切换的情景下,用 hidden 更好。如果在运行时条件改变不多则 a:if 较好。

列表渲染

image.png

image.png a:for:在组件上使用 a:for 属性可以绑定一个数组,即可使用数组中各项的数据重复渲染该组件。
数组当前项的下标变量名默认为 index,数组当前项的变量名默认为 item

image.png

image.png
使用a:for-item可以指定数组当前元素的变量名。使用a:for-index可以指定数组当前下标的变量名

image.png
a:for 支持嵌套。 以下是九九乘法表的嵌套示例代码。

image.png

block a:for

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

image.png

a:key

如果列表项位置会动态改变或者有新项目添加到列表中,同时希望列表项保持特征和状态(例如 <input/> 中的输入内容,<switch/> 的选中状态),需要使用 a:key 来指定列表项的唯一标识。
a:key 的值以两种形式来提供:

  • 字符串:代表列表项某个属性,属性值需要是列表中唯一的字符串或数字,例如 ID,并且不能动态改变。
  • 保留关键字 *this,代表列表项本身,并且它是唯一的字符串或者数字,例如当数据改变触发重新渲染时,会校正带有 key 的组件,框架会确保数据重新被排序,而不是重新创建,这可以使组件保持自身状态,提高列表渲染效率。
    注意
  • 如不提供 a:key,则会提示 warning。
  • 如果明确知道列表是静态,或者不用关注其顺序,则可以忽略。 下面是示例代码:

image.png

image.png

key

key 是比 a:key 更通用的写法,里面可以填充任意表达式和字符串。
注意: key 不能设置在 block 上。

image.png

image.png

模板(封装一个模块功能)

AXML 提供模板 template,可以在模板中定义代码片段,然后在不同地方调用。 建议使用 template 方式引入模板片段,因为 template 会指定其作用域,只使用 data 传入的数据,如果 templatedata 没有改变,该片段 UI 不会重新渲染。
使用 name 属性申明模板名,然后在 <template /> 内定义代码片段。

image.png

使用模板

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

image.png

image.png
is 属性可以使用 Mustache 语法,来动态决定具体渲染哪个模板。

image.png
示例代码:

image.png

模板作用域

模板有其作用域,只能使用 data 传入的数据。除了直接由 data 传入数据外,也可以通过 onXX 事件绑定页面逻辑进行函数处理。如下代码所示:
在其他页面调用是先通过import引入文件,放在顶层 image.png

image.png

引用

AXML 提供两种文件引用方式 importinclude

import

import 可以加载已经定义好的 template
例如,在 item.axml 中定义了一个叫 itemtemplate

image.png
import 有作用域的概念,只会 import 目标文件中定义的 template,而不会 import 目标文件 import 的 template。

例如,C import B,B import A,在 C 中可以使用 B 定义的 template,在 B 中可以使用 A 定义的 template,但是 C 不能使用 A 中定义的 template。

image.png

image.png

image.png

include

include 可以将目标文件除 <template/> 外整个代码引入,相当于是拷贝到 include位置

image.png

image.png

引入路径

模板引入路径支持相对路径、绝对路径,也支持从 node_modules 目录载入第三方模块。

image.png