微信小程序—WXML语法:数据绑定、列表渲染、条件渲染、模板、引用等

news/2024/7/20 1:21:17 标签: 微信小程序, 小程序, javascript

数据绑定

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

内容绑定

javascript"><!--wxml-->
<view> {{message}} </view>

// page.js
Page({
  data: {
    message: 'Hello MINA!'
  }
})
//如果在函数中要取data的值的话,用this.data.message
// 如果要改变data中的值的话,要用this.setData({message:"新值"}),否则页面不会更新

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

javascript">Page({
  data: {
    id: 0
  }
})
<view id="item-{{id}}"> </view>

控制属性(需要在双引号之内)

javascript">Page({
  data: {
    condition: true
  }
})
<view wx:if="{{condition}}"> </view>

关键字(需要在双引号之内)

javascript"><checkbox checked="{{false}}"> </checkbox>

不要直接写 checked=“false”,其计算结果是一个字符串,转成 boolean 类型后代表真值

运算

可以在 {{}} 内进行简单的运算,支持的有如下几种方式:

三元运算
javascript"><view hidden="{{flag ? true : false}}"> Hidden </view>
算数运算
javascript"><view> {{a + b}} + {{c}} + d </view>
Page({
  data: {
    a: 1,
    b: 2,
    c: 3
  }
})

view中的内容为 3 + 3 + d。

逻辑判断
javascript"><view wx:if="{{length > 5}}"> </view>
字符串运算
javascript"><view>{{"hello" + name}}</view>
Page({
  data:{
    name: 'MINA'
  }
})
数据路径运算
javascript"><view>{{object.key}} {{array[0]}}</view>
Page({
  data: {
    object: {
      key: 'Hello '
    },
    array: ['MINA']
  }
})
组合

也可以在 Mustache 内直接进行组合,构成新的对象或者数组。

数组
javascript"><view wx:for="{{[zero, 1, 2, 3, 4]}}"> {{item}} </view>
Page({
  data: {
    zero: 0
  }
})

最终组合成数组[0, 1, 2, 3, 4]。

对象
javascript"><template is="objectCombine" data="{{for: a, bar: b}}"></template>
Page({
  data: {
    a: 1,
    b: 2
  }
})
javascript">最终组合成的对象是 {for: 1, bar: 2}
也可以用扩展运算符 … 来将一个对象展开
javascript"><template is="objectCombine" data="{{...obj1, ...obj2, e: 5}}"></template>
Page({
  data: {
    obj1: {
      a: 1,
      b: 2
    },
    obj2: {
      c: 3,
      d: 4
    }
  }
})

最终组合成的对象是 {a: 1, b: 2, c: 3, d: 4, e: 5}
如果对象的 key 和 value 相同,也可以间接地表达。

javascript"><template is="objectCombine" data="{{foo, bar}}"></template>
Page({
  data: {
    foo: 'my-foo',
    bar: 'my-bar'
  }
})

最终组合成的对象是 {foo: ‘my-foo’, bar:‘my-bar’}。
注意:上述方式可以随意组合,但是如有存在变量名相同的情况,后边的会覆盖前面,如:

javascript"><template is="objectCombine" data="{{...obj1, ...obj2, a, c: 6}}"></template>
Page({
  data: {
    obj1: {
      a: 1,
      b: 2
    },
    obj2: {
      b: 3,
      c: 4
    },
    a: 5
  }
})

最终组合成的对象是 {a: 5, b: 3, c: 6}。
注意: 花括号和引号之间如果有空格,将最终被解析成为字符串

javascript"><view wx:for="{{[1,2,3]}} ">
  {{item}}
</view>

等同于

javascript"><view wx:for="{{[1,2,3] + ' '}}">
  {{item}}
</view>

列表渲染

wx:for

在组件上使用 wx:for 控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件。 默认数组的当前项的下标变量名默认为
index,数组当前项的变量名默认为 item
如果要给当前项变量名设置名称的话用wx:for-item=“名称”

javascript">// page.js
Page({
  data: {
    array: [1, 2, 3, 4, 5]
  }
})
<!--wxml-->
<view wx:for="{{array}}"> {{item}} </view>
//注意此处是双大括号语法,与vue不同
javascript"><view wx:for="{{array}}">
  {{index}}: {{item.message}}
</view>
Page({
  data: {
    array: [{
      message: 'foo',
    }, {
      message: 'bar'
    }]
  }
})

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

javascript"><view wx:for="{{array}}" wx:for-index="idx" wx:for-item="itemName">
  {{idx}}: {{itemName.message}}
</view>

0:foo
1:bar
wx:for 也可以嵌套,下边是一个九九乘法表

javascript"><view wx:for="{{[1, 2, 3, 4, 5, 6, 7, 8, 9]}}" wx:for-item="i">
  <view wx:for="{{[1, 2, 3, 4, 5, 6, 7, 8, 9]}}" wx:for-item="j">
    <view wx:if="{{i <= j}}">
      {{i}} * {{j}} = {{i * j}}
    </view>
  </view>
</view>

block wx:for

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

javascript"><block wx:for="{{[1, 2, 3]}}">
  <view> {{index}}: </view>
  <view> {{item}} </view>
</block>

wx:key

如果列表中项目的位置会动态改变或者有新的项目添加到列表中,并且希望列表中的项目保持自己的特征和状态(如 input 中的输入内容,switch 的选中状态),需要使用 wx:key 来指定列表中项目的唯一的标识符。

wx:key 的值以两种形式提供

字符串,代表在 for 循环的 array 中 item 的某个 property,该 property 的值需要是列表中唯一的字符串或数字,且不能动态改变。
保留关键字 *this 代表在 for 循环中的 item 本身,这种表示需要
item 本身是一个唯一的字符串或者数字。
当数据改变触发渲染层重新渲染的时候,会校正带有 key 的组件,框架会确保他们被重新排序,而不是重新创建,以确保使组件保持自身的状态,并且提高列表渲染时的效率。
如不提供 wx:key,会报一个 warning, 如果明确知道该列表是静态,或者不必关注其顺序,可以选择忽略。
注意事项 当 wx:for 的值为字符串时,会将字符串解析成字符串数组

javascript"><view wx:for="array">
  {{item}}
</view>

等同于

javascript"><view wx:for="{{['a','r','r','a','y']}}">
  {{item}}
</view>

注意: 花括号和引号之间如果有空格,将最终被解析成为字符串

javascript"><view wx:for="{{[1,2,3]}} ">
  {{item}}
</view>

等同于

javascript"><view wx:for="{{[1,2,3] + ' '}}" >
  {{item}}
</view>

条件渲染

javascript">// page.js
Page({
  data: {
    view: 'MINA'
  }
})
<!--wxml-->
<view wx:if="{{view == 'WEBVIEW'}}"> WEBVIEW </view>
<view wx:elif="{{view == 'APP'}}"> APP </view>
<view wx:else="{{view == 'MINA'}}"> MINA </view>

wx:if

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

javascript"><view wx:if="{{condition}}"> True </view>

也可以用 wx:elif 和 wx:else 来添加一个 else 块:

javascript"><view wx:if="{{length > 5}}"> 1 </view>
<view wx:elif="{{length > 2}}"> 2 </view>
<view wx:else> 3 </view>

1
2
3

block wx:if

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

javascript"><block wx:if="{{true}}">
  <view> view1 </view>
  <view> view2 </view>
</block>
javascript">注意: <block/> 并不是一个组件,它仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性。

wx:if vs hidden

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

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

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

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

模板

定义模板

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

javascript"><!--
  index: int
  msg: string
  time: string
-->
<template name="msgItem">
  <view>
    <text> {{index}}: {{msg}} </text>
    <text> Time: {{time}} </text>
  </view>
</template>

使用模板

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

javascript">Page({
  data: {
    item: {
      index: 0,
      msg: 'this is a template',
      time: '2016-09-15'
    }
  }
})
<template is="msgItem" data="{{...item}}"/>

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

javascript"><template name="odd">
  <view> odd </view>
</template>
<template name="even">
  <view> even </view>
</template>

<block wx:for="{{[1, 2, 3, 4, 5]}}">
  <template is="{{item % 2 == 0 ? 'even' : 'odd'}}"/>
</block>

模板的作用域

模板拥有自己的作用域,只能使用 data 传入的数据以及模板定义文件中定义的 模块。

引用

WXML 提供两种文件引用方式import和include。

import

import可以在该文件中使用目标文件定义的template,如:

在 item.wxml 中定义了一个叫item的template:

javascript"><!-- item.wxml -->
<template name="item">
  <text>{{text}}</text>
</template>

在 index.wxml 中引用了 item.wxml,就可以使用item模板:

javascript"><import src="item.wxml"/>
<template is="item" data="{{text: 'forbar'}}"/>

import 的作用域

import 有作用域的概念,即只会 import 目标文件中定义的 template,而不会 import 目标文件 import 的 template。
如:C import B,B import
A,在C中可以使用B定义的template,在B中可以使用A定义的template,但是C不能使用A定义的template。

javascript"><!-- A.wxml -->
<template name="A">
  <text> A template </text>
</template>
<!-- B.wxml -->
<import src="a.wxml"/>
<template name="B">
  <text> B template </text>
</template>
<!-- C.wxml -->
<import src="b.wxml"/>
<template is="A"/>  <!-- Error! Can not use tempalte when not import A. -->
<template is="B"/>

####include

include 可以将目标文件除了 外的整个代码引入,相当于是拷贝到 include 位置,如:

javascript"><!-- index.wxml -->
<include src="header.wxml"/>
<view> body </view>
<include src="footer.wxml"/>
<!-- header.wxml -->
<view> header </view>
<!-- footer.wxml -->
<view> footer </view>

http://www.niftyadmin.cn/n/509573.html

相关文章

微信小程序——WXS 模块

WXS 模块 WXS 代码可以编写在 wxml 文件中的 标签内&#xff0c;或以 .wxs 为后缀名的文件内。 模块 每一个 .wxs 文件和 标签都是一个单独的模块。 每个模块都有自己独立的作用域。即在一个模块里面定义的变量与函数&#xff0c;默认为私有的&#xff0c;对其他模块不可见。 一…

微信小程序--组件复用(创建自定义组件)

组件所需文件如下&#xff1a; 创建自定义组件 // my-component.wxml <view class"inner">{{innerText}} </view> <slot></slot>接收组件参数 //my-component.js Component({properties: {// 这里定义了innerText属性&#xff0c;属性值可…

微信小程序—— <slot>插糟

匿名插糟 <!-- 组件模板 --> <view class"wrapper"><view>这里是组件的内部节点</view><slot></slot> </view><!-- 引用组件的页面模板 --> <view><component-tag-name><!-- 这部分内容将被放置在组…

微信小程序——组件间的样式

组件样式隔离 默认情况下&#xff0c;自定义组件&#xff08;子组件&#xff09;的样式只受自身组件wxss样式影响 在组件内设置自定义组件的字体颜色为红色 字体颜色没有改变 想要改变的话再要自定义组件的js文件内加上 options: {addGlobalClass: true,},外部样式类 /* 组…

微信小程序----组件事件通信

组件间通信与事件 组件间的基本通信方式有以下几种。 WXML 数据绑定&#xff1a;用于父组件向子组件的指定属性设置数据&#xff0c;仅能设置 JSON 兼容数据&#xff08;自基础库版本 2.0.9 开始&#xff0c;还可以在数据中包含函数&#xff09;。 事件&#xff1a;用于子组件…

微信小程序behaviors

behaviors类似于vue中的混入“mixins” // my-component.js var myBehavior require(my-behavior) Component({behaviors: [myBehavior],})// my-behavior.jsmodule.exports Behavior({behaviors: [],properties: { },data: myBehaviorData: my-behavior-data},created: fu…

微信小程序触底加载

data: {page:1 // 声明页数},//触底onReachBottom: function () {this.setData({//改变页码page: this.data.page1,})this.getGoods()},getGoods(){request1({ url: "接口地址",data: { page:this.data.page,pageSize:20 }}).then(result > {this.setData({// 与之…

安卓软键盘盖住输入框bug

修改之前 修改之后 if (!this.terminal.android) {var oh document.documentElement.clientHeight || document.body.clientHeight; // 获取变化之前的可视区域的高度window.addEventListener(resize, function() {var rh document.documentElement.clientHeight || documen…