• template增强特性
    • class与style绑定
    • 内联事件绑定
    • 动态组件
    • 双向绑定
      • wx:model对应的属性和事件
  • Refs

    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>