框架视图层(二)

wxml

数据绑定
1.简单绑定。Mustache 语法双括号包裹变量,组件属性、控制属性、关键字变量绑定需要在双引号之内
2.运算。在{{}}中进行运算,三元、算术运算、逻辑判断、字符串运算、数据路径运算。
3.组合。组成新的对象和数组

      数组
      <view wx:for="{{[zero, 1, 2, 3, 4]}}"> {{item}} </view>
          Page({
              data: {
                  zero: 0
              }
           })
      对象
    
    1.<template is="objectCombine" data="{{for: a, bar: b}}"></template>
        Page({
            data: {
              a: 1,
              b: 2
            }
      })
    2....三点展开语法
    <template is="objectCombine" data="{{...obj1, ...obj2, e: 5}}"></template>
        Page({
          data: {
            obj1: {
                a: 1,
                b: 2
            },
            obj2: {
              c: 3,
              d: 4
            }
        }
    })
    3.同名变量覆盖、依靠键值直接获取
    <template is="objectCombine" data="{{...obj1, ...obj2, a, c: 6}}"></template>
          Page({
            data: {
              obj1: {
                  a: 1,
                  b: 2
              },
            obj2: {
                b: 3,
                c: 4
            },
            a: 5
        }
      })
      最终data = {a: 5, b: 3, c: 6}

花括号和引号中出现空格,将会解析生字符串

列表渲染

  • 默认当前项下标index,数组当前项的变量名为item,可以使用wx:for-item,wx:for-index 指定,此循环语法可以额嵌套
<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:for="{{[1, 2, 3]}}">
  <view> {{index}}: </view>
  <view> {{item}} </view>
</block>
  • wx:key unique唯一字符串,保证动态改变或者追加时,每个组件的状态都不改变。*this代表循环中的item,必须唯一
页面  wxml
<switch wx:for="{{objectArray}}" wx:key="unique" style="display: block;"> {{item.id}} </switch>
<button bindtap="switch"> Switch </button>
<button bindtap="addToFront"> Add to the front </button>

<switch wx:for="{{numberArray}}" wx:key="*this" style="display: block;"> {{item}} </switch>
<button bindtap="addNumberToFront"> Add to the front </button>

js wxjs
Page({
  data: {
    objectArray: [
      {id: 5, unique: 'unique_5'},
      {id: 4, unique: 'unique_4'},
      {id: 3, unique: 'unique_3'},
      {id: 2, unique: 'unique_2'},
      {id: 1, unique: 'unique_1'},
      {id: 0, unique: 'unique_0'},
    ],
    numberArray: [1, 2, 3, 4]
  },
  switch: function(e) {
    const length = this.data.objectArray.length
    for (let i = 0; i < length; ++i) {
      const x = Math.floor(Math.random() * length)
      const y = Math.floor(Math.random() * length)
      const temp = this.data.objectArray[x]
      this.data.objectArray[x] = this.data.objectArray[y]
      this.data.objectArray[y] = temp
    }
    this.setData({
      objectArray: this.data.objectArray
    })
  },
  addToFront: function(e) {
    const length = this.data.objectArray.length
    this.data.objectArray = [{id: length, unique: 'unique_' + length}].concat(this.data.objectArray)
    this.setData({
      objectArray: this.data.objectArray
    })
  },
  addNumberToFront: function(e){
    this.data.numberArray = [ this.data.numberArray.length + 1 ].concat(this.data.numberArray)
    this.setData({
      numberArray: this.data.numberArray
    })
  }
})

注意

1.wx:for 参数为字符串,将默认为字符串数组
<view wx:for="array">  === <view wx:for="{{['a','r','r','a','y']}}">
2.花括号和引号之间有空格,将被解析为字符串
<view wx:for="{{[1,2,3]}} "> === <view wx:for="{{[1,2,3] + ' '}}" >

条件渲染

  • wx:if
基础语法
<view wx:if="{{length > 5}}"> 1 </view>
<view wx:elif="{{length > 2}}"> 2 </view>
<view wx:else> 3 </view>
  • block wx:if
**block是包装元素,不是组件,只能接受控制属性**
<block wx:if="{{true}}">
  <view> view1 </view>
  <view> view2 </view>
</block>

wx:if与hidden对比:判断条件切换频繁,使用hidden

模板(类似于layout)

  • 定义模板
使用name属性定义模板
<!--
  index: int
  msg: string
  time: string
-->
<template name="msgItem">
  <view>
    <text> {{index}}: {{msg}} </text>
    <text> Time: {{time}} </text>
  </view>
</template>
  • 使用模板
使用is属性将模板声明并且传入需要的数据
<template is="msgItem" data="{{...item}}"/>
is属性还可以判断使用哪些模板
<template is="{{item % 2 == 0 ? 'even' : 'odd'}}"/>

事件

  • 概念,同js事件绑定
  • 使用方式
<view id="tapTest" data-hi="WeChat" bindtap="tapName"> Click me! </view>

Page中存在同名处理函数
Page({
  tapName: function(event) {
    console.log(event)
  }
})
  • 详解(不在冒泡函数列表、无特殊说明都属于非冒泡)
    • 冒泡,当一个组件上的事件被触发后,该事件会向父节点传递。
    • 非冒泡,当一个组件上的事件被触发后,该事件不会向父节点传递。
  • 事件绑定、冒泡
    • 同组件属性key=value格式
    • key以bind、catch开头。直接连接或者使用bind:tag,catch阻止冒泡事件
    • value 对应page中的同名函数
<view id="outer" bindtap="handleTap1">
  outer view
  <view id="middle" catchtap="handleTap2">
    middle view
    <view id="inner" bindtap="handleTap3">
      inner view
    </view>
  </view>
</view>
  • 事件捕获
    • capture-bind、capture-catch 后者直接取消捕获和冒泡
在下面的代码中,点击 inner view 会先后调用handleTap2、handleTap4、handleTap3、handleTap1。
<view id="outer" bind:touchstart="handleTap1" capture-bind:touchstart="handleTap2">
  outer view
  <view id="inner" bind:touchstart="handleTap3" capture-bind:touchstart="handleTap4">
    inner view
  </view>
</view>

如果将上面代码中的第一个capture-bind改为capture-catch,将只触发handleTap2。
<view id="outer" bind:touchstart="handleTap1" capture-catch:touchstart="handleTap2">
  outer view
  <view id="inner" bind:touchstart="handleTap3" capture-bind:touchstart="handleTap4">
    inner view
  </view>
</view>
  • 事件对象(参数属性列表)

引用(文件载入)

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

C import B,B import A,在C中可以使用B定义的template,在B中可以使用A定义的template,但是C不能使用A定义的template。只可以直接使用。
<!-- 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 可以将目标文件除了 <template/> <wxs/> 外的整个代码引入,相当于是拷贝到 include 位置,如:

<!-- index.wxml -->
<include src="header.wxml"/>
<view> body </view>
<include src="footer.wxml"/>
<!-- header.wxml -->
<view> header </view>
<!-- footer.wxml -->
<view> footer </view>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容

  • WXML WXML(WeiXin Markup Language)是微信的一套标签语言,结合基础组件、事件系统,可...
    许剑锋阅读 6,789评论 3 51
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,651评论 18 139
  • 昨天看了一下微信小程序官方文档,总结一下自己学习的个人心得. 首先从官方文档给的框架说起,微信小程序官方文档给出了...
    Mr大大大阅读 47,157评论 9 68
  • 天蝎座 无论爱情,天蝎座总是斩钉截铁,经纬分明,毫无余地,就象分手这回事,何尝不是不要妄想当日恋爱时如何如胶似漆,...
    闷游瓶阅读 556评论 0 0
  • 夏天在渡口徘徊 夏风释放最后的热情 拥抱炙热大地,冒着青烟 我撕扯河面,寻找 去往秋天的渡船 河的对岸,无风也无雨...
    风影骑迹阅读 163评论 0 2