template增强特性

对于模板部分,我们提供了class与style的绑定,wx:model指令,动态组件等特性

class与style绑定

类似vue的class绑定

例子:

  1. <template>
  2. <view wx:class="{{ {active: isActive} }}">
  3. 这是一段测试文字
  4. </view>
  5. </template>
  6. <script>
  7. import {createComponent} from '@mpxjs/core'
  8. createComponent({
  9. properties: {
  10. isActive: Boolean
  11. }
  12. })
  13. </script>
  14. <style lang="stylus">
  15. .active
  16. background-color blue
  17. </style>

当该组件接受一个参数isActive为true时,就会为view加上class:active。

例子:父组件

  1. <template>
  2. <view>
  3. <!--直接将for中的item/index传入wx:style和wx:class中无法正常运行-->
  4. <view wx:for="{{list}}" wx:style="{{item.style}}">{{item.name}}</view>
  5. <!--将item/index传入包装组件中,再在包装组件内使用wx:style和wx:class进行样式和类名绑定-->
  6. <wrap wx:for="{{list}}" item="{{item}}"></wrap>
  7. </view>
  8. </template>
  9. <script>
  10. import {createComponent} from '@mpxjs/core'
  11. createComponent({
  12. data:{
  13. list:[
  14. {
  15. name: 'red',
  16. style: {
  17. color: 'red'
  18. }
  19. },
  20. {
  21. name: 'blue',
  22. style: {
  23. color: 'blue'
  24. }
  25. }
  26. ]
  27. }
  28. })
  29. </script>

子组件

  1. <template>
  2. <view wx:style="{{item.style}}">{{item.name}}</view>
  3. </template>
  4. <script>
  5. import {createComponent} from '@mpxjs/core'
  6. createComponent({
  7. properties: {
  8. item: Object
  9. }
  10. })
  11. </script>

内联事件绑定

对于事件处理在模板上的绑定,原生小程序只能通过事件信息结合手工拿取data里的信息,我们希望能和vue的事件绑定一样更灵活地传参

例子:

<template>
  <view>
    <view bindtap="handleTap1(1)">Click me!</view>
    <view bindtap="handleTap2(testVal, $event)">Click me!</view>
  </view>
</template>

<script>
  import {createComponent} from '@mpxjs/core'
  createComponent({
    data: {
      testVal: '123'
    },
    methods: {
      handleTap1 (val) {
        console.log(val) // 1
      },
      handleTap2 (val, event) {
        console.log(val) // '123'
        console.log(event) // 微信原生事件
      }
    }
  })
</script>

注意:由于微信的限制,如果事件名使用横线链接分割(如: ‘value-change’),将不可以使用该feature。以及在wx:for中,若遍历的是对象数组,内联传入的item并非是对象的引用,若想修改对象,请用index到原数组中获取。

动态组件

通过使用保留的 <component> 组件,并对其 is 特性进行动态绑定,你可以在同一个挂载点动态切换多个组件:

<template>
  <!--动态组件,此处的componentName为json中注册的usingComponents的key值-->
  <component is="{{componentName}}"></component>
</template>

<script>
  import {createComponent} from '@mpxjs/core'
  createComponent({
    data: {
      componentName: 'test'
    },
    ready () {
      setTimeout(() => {
        this.componentName = 'list'
      }, 3000)
    }
  })
</script>

<script type="application/json">
  {
    "usingComponents": {
      "list": "../components/list",
      "test": "../components/test"
    }
  }
</script>

双向绑定

除了小程序原生指令之外,mpx 基于input事件提供了一个指令 wx:model, 用于双向绑定。

例子:

<template>
  <view>
    <input wx:model="{{val}}"/>
    <input wx:model="{{test.val}}"/>
    <input wx:model="{{test['val']}}"/>
  </view>
</template>

<script>
  import {createComponent} from '@mpxjs/core'
  createComponent({
    data: {
      val: 'test',
      test: {
        val: 'xxx'
      }
    }
  })
</script>

wx:model并不会影响相关的事件处理函数,比如像下面这样:

<input wx:model="{{inputValue}}" bindinput="handleInput"/>

wx:model对应的属性和事件

wx:model默认监听input事件使用value属性传值,如果我们希望改变默认行为,可以使用wx:model-propwx:model-event来定义wx:model对应的属性和事件:

父组件

<template>
  <customCheck wx:model="{{checked}}" wx:model-prop="checkedProp" wx:model-event="checkedChange"></customCheck>
</template>

<script>
  import {createPage} from '@mpxjs/core'
  createPage({
    data: {
      checked: true
    }
  })
</script>

子组件(customCheck)

<template>
  <view bindtap="handleTap">{{checkedProp}}</view>
</template>

<script>
  import {createComponent} from '@mpxjs/core'
  createComponent({
    properties: {
      checkedProp: Boolean
    },
    methods: {
      handleTap () {
        // 这里第二个参数为自定义事件的detail,需要以下面的形式传递值以保持与原生组件对齐
        this.triggerEvent('checkedChange', {
          value: !this.checkedProp
        })
      }
    }
  })
</script>

如示例,当子组件被点击时,父组件的checked数据会发生变化

注意:由于微信的限制,如果事件名使用横线链接分割(如: ‘checked-change’),将不可以使用该feature。

Refs

提供了 wx:ref="xxx" 来更方便获取 WXML 节点信息的对象。在JS里只需要通过this.$refs.xxx 即可获取节点。

示例:

<template>
  <view wx:ref="tref">
    123
  </view>
</template>

<script>
import {createComponent} from '@mpxjs/core'
  createComponent({
    onReady () {
      this.$refs.tref.fields({size: true}, function (res) {
        console.log(res)
      }).exec()
    }
  })
</script>