美文网首页
2018-05-15

2018-05-15

作者: 颦无语 | 来源:发表于2018-05-15 16:47 被阅读0次

    视图层

    1. wx:for在组件上控制属性绑定一个数组,既可以通过数组中各项的数据重复渲染该组件。默认数组当前项的下表变量名默认为index,数组当前项的变量名默认为item。
      <view wx:for="{{array}}">
      {{index}}:{{item.message}}
      </view>

    Page({
    data: {
    array: [{
    message: 'foo', //获取的第一个值是foo
    }, {
    message: 'bar' //获取的第二个值是bar
    }]
    }
    })

    使用 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}}={{ij}}
    </view>
    </view>
    </view>
    3.条件渲染
    wx:if
    在框架中,使用 wx:if="{{condition}}" 来判断是否需要渲染该代码块:
    <view wx:if="{{condition}}"> True </view>
    也可以用 wx:elif 和 wx:else 来添加一个 else 块:
    <view wx:if="{{length > 5}}"> 1 </view>
    <view wx:elif="{{length > 2}}"> 2 </view>
    <view wx:else> 3 </view>

    block wx:if
    因为 wx:if 是一个控制属性,需要将它添加到一个标签上。如果要一次性判断多个组件标签,可以使用一个 <block/> 标签将多个组件包装起来,并在上边使用 wx:if 控制属性。
    <block wx:if="{{true}}">
    <view> view1 </view>
    <view> view2 </view>
    </block>
    注意: <block/> 并不是一个组件,它仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性

    WXML提供模板(template),可以在模板中定义代码片段,然后在不同的地方调用。
    使用 name 属性,作为模板的名字。然后在<template/>内定义代码片段,如:

    <template name="msgItem">
    <view>
    <text> {{index}}: {{msg}} </text>
    <text> Time: {{time}} </text>
    </view>
    </template>

    使用模板
    使用 is 属性,声明需要的使用的模板,然后将模板所需要的 data 传入,如:
    <template is="msgItem" data="{{...item}}"/>
    Page({
    data: {
    item: {
    index: 0,
    msg: 'this is a template',
    time: '2016-09-15'
    }
    }
    })
    is 属性可以使用 Mustache 语法,来动态决定具体需要渲染哪个模板:
    <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>

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

    事件的使用方式
    在组件中绑定一个事件处理函数。
    如bindtap,当用户点击该组件的时候会在该页面对应的Page中找到相应的事件处理函数。
    <view id="tapTest" data-hi="WeChat" bindtap="tapName"> Click me! </view>
    在相应的Page定义中写上相应的事件处理函数,参数是event。
    Page({
    tapName: function(event) {
    console.log(event)
    }
    })

    事件绑定和冒泡

    事件绑定的写法同组件的属性,以 key、value 的形式。

    • key 以bindcatch开头,然后跟上事件的类型,如bindtapcatchtouchstart。自基础库版本 1.5.0 起,bindcatch后可以紧跟一个冒号,其含义不变,如bind:tap、、catch:touchstart
    • value 是一个字符串,需要在对应的 Page 中定义同名的函数。不然当触发事件的时候会报错。

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

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

    <view id="outer" bindtap="handleTap1">
      outer view
      <view id="middle" catchtap="handleTap2">
        middle view
        <view id="inner" bindtap="handleTap3">
          inner view
        </view>
      </view>
    </view>
    
    

    此处难理解:
    事件的捕获阶段
    自基础库版本 1.5.0 起,触摸类事件支持捕获阶段。捕获阶段位于冒泡阶段之前,且在捕获阶段中,事件到达节点的顺序与冒泡阶段恰好相反。需要在捕获阶段监听事件时,可以采用capture-bindcapture-catch关键字,后者将中断捕获阶段和取消冒泡阶段。

    在下面的代码中,点击 inner view 会先后调用handleTap2handleTap4handleTap3handleTap1

    <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>
    
    

    引用
    WXML 提供两种文件引用方式import和include。
    import
    import可以在该文件中使用目标文件定义的template,如:
    在 item.wxml 中定义了一个叫item的template:

    <template name="item">
    <text>{{text}}</text>
    </template>
    在 index.wxml 中引用了 item.wxml,就可以使用item模板:
    <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。

    <template name="A">
    <text> A template </text>
    </template>

    <import src="a.wxml"/>
    <template name="B">
    <text> B template </text>
    </template>

    <import src="b.wxml"/>
    <template is="A"/>
    <template is="B"/>
    include
    include 可以将目标文件除了 <template/> <wxs/> 外的整个代码引入,相当于是拷贝到 include 位置,如:

    <include src="header.wxml"/>
    <view> body </view>
    <include src="footer.wxml"/>

    <view> header </view>

    <view> footer </view>

    相关文章

      网友评论

          本文标题:2018-05-15

          本文链接:https://www.haomeiwen.com/subject/njoedftx.html