双向绑定

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

例子:

  1. <template>
  2. <view>
  3. <input wx:model="{{val}}"/>
  4. <input wx:model="{{test.val}}"/>
  5. <input wx:model="{{test['val']}}"/>
  6. </view>
  7. </template>
  8. <script>
  9. import {createComponent} from '@mpxjs/core'
  10. createComponent({
  11. data: {
  12. val: 'test',
  13. test: {
  14. val: 'xxx'
  15. }
  16. }
  17. })
  18. </script>

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

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

wx:model对应的属性和事件

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

父组件

  1. <template>
  2. <customCheck wx:model="{{checked}}" wx:model-prop="checkedProp" wx:model-event="checkedChange"></customCheck>
  3. </template>
  4. <script>
  5. import {createPage} from '@mpxjs/core'
  6. createPage({
  7. data: {
  8. checked: true
  9. }
  10. })
  11. </script>

子组件(customCheck)

  1. <template>
  2. <view bindtap="handleTap">{{checkedProp}}</view>
  3. </template>
  4. <script>
  5. import {createComponent} from '@mpxjs/core'
  6. createComponent({
  7. properties: {
  8. checkedProp: Boolean
  9. },
  10. methods: {
  11. handleTap () {
  12. // 这里第二个参数为自定义事件的detail,需要以下面的形式传递值以保持与原生组件对齐
  13. this.triggerEvent('checkedChange', {
  14. value: !this.checkedProp
  15. })
  16. }
  17. }
  18. })
  19. </script>

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

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

以及并不是所有的组件都会按微信的标准格式event.detail.value来传值,比如vant的input组件,值的抛出是用event.detail本身来传递的,这时我们可以使用 wx:model-value-path 来指定双向绑定时的取值路径。

例如:

  1. <vant-field wx:model-value-path="[]" wx:model="{{a}}"></vant-field>