双向绑定
除了小程序原生指令之外,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-prop
和wx: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。
以及并不是所有的组件都会按微信的标准格式event.detail.value来传值,比如vant的input组件,值的抛出是用event.detail本身来传递的,这时我们可以使用 wx:model-value-path
来指定双向绑定时的取值路径。
例如:
<vant-field wx:model-value-path="[]" wx:model="{{a}}"></vant-field>