v-model

    提供对表单组件及自定义组件 v-model 支持,默认不开启,需在配置项中,配置 v-model 支持

    1.指令为 v-model,而不是像基础指令一样为 model,这样是以防止与原生或用户属性冲突;

    2.想要 让所有指令保证统一 推荐开启 v- 指令支持, 详见;

    !>
    1.不支持在 radiocheckbox 上直接使用 v-model, 搭配 radio-group, checkbox-group 才能使用。

    2.radio-group, checkbox-group 使用 v-model 时,初始值需要根据场景情况手动处理。

    3.如果用了 v-model 建议不要再监听多个对应的事件类型

    示例:

    1. // input
    2. <input v-model="input1"/>
    3. // picker
    4. <picker
    5. v-model="timeVal"
    6. mode="time">
    7. <view class="picker">
    8. 当前选择: {{timeVal}}
    9. </view>
    10. </picker>
    11. // switch
    12. <switch name="switch1" v-model="switchVal"></switch>
    13. // checkbox-group
    14. <checkbox-group v-model="checkboxVal">
    15. <label for="item in items">
    16. <checkbox :value="item.name"/>
    17. {{item.value}}
    18. </label>
    19. </checkbox-group>
    20. // radio-group
    21. <radio-group v-model="radioVal">
    22. <label for="item in items">
    23. <radio :value="item.name"/>
    24. {{item.value}}
    25. </label>
    26. </radio-group>
    27. // 自定义组件
    28. <model-component v-model="componentVal" />

    以 一个 model-component 自定义组件为例:

    1. <template>
    2. <view>
    3. 自定义组件内部props: {{value}}
    4. </view>
    5. 自定义组件内部data: {{valueInner}}
    6. </view>
    7. <input v-model="valueInner" @input="change"/>
    8. </view>
    9. </template>
    10. <script>
    11. export default {
    12. data: {
    13. valueInner: ''
    14. },
    15. props: {
    16. value: String
    17. },
    18. mounted() {
    19. // 不要直接在内部变更 外部传入的 `props` 值
    20. this.valueInner = this.value;
    21. },
    22. methods: {
    23. change(event) {
    24. this.$emit('change', event.detail.value);
    25. }
    26. }
    27. }
    28. </script>
    29. <style lang="stylus">
    30. // ...
    31. </style>

    现在在这个组件上使用 v-model

    在小程序中,自定义组件还可以通过配置构建配置项 component.template.modelMap 来进行支持定制化配置

    配置项说明:

    • modelMap: Object 自定义组件 v-model 配置项
    • modelMap.default: Object 变更 自定义组件的 v-model 默认配置项
      • modelMap.default.event: string 必填 事件类型
      • modelMap.default.prop: string 必填 对应 props 的属性名
      • modelMap.default.detailProp: string 选填 event.detail 上的属性名,如果是 event.detail 则不填
    • modelMap.xxx: Object 变更 特定组件的 v-model 特殊配置项 xxx 表示组件具体标签名
      • modelMap.xxx.event: string 必填 事件类型
      • modelMap.xxx.prop: string 必填 对应 props 的属性名
      • modelMap.xxx.detailProp: string 选填 event.detail 上的属性名,如果是 event.detail 本身 则不填
    • 想进行 v-model 绑定的 props 值并非 value
    • 对应的事件类型并非 change
    • 想获取的 并非 event.detail 本身 而是里面的某一属性值

    sp-model-component 组件

    1. <template>
    2. <view class="sp-model-component-wrap">
    3. <view if="show">
    4. <text>content</text>
    5. </view>
    6. </view>
    7. </template>
    8. <script>
    9. export default {
    10. props: {
    11. show: Boolean
    12. },
    13. methods: {
    14. close(event) {
    15. this.$emit('spchange', {
    16. show: false
    17. });
    18. }
    19. }
    20. }
    21. </script>
    22. <style lang="stylus">
    23. // ...
    24. </style>

    直接写是不生效的

    1. // 不生效
    2. <sp-model-component v-model="componentVal" />

    分析可知 对应的取值

    • 属性名: show
    • 事件类型:spchange
    • 事件 event.detail上的属性名:为 show 的值

    因此在 x.config.js 加上如下配置, 可使 v-model 写法生效

    1. // 生效
    2. <sp-model-component v-model="componentVal" />
    1. {
    2. template: {
    3. modelMap: {
    4. 'slider': {
    5. // 必填 事件类型, 此处 change 还是 changing,可根据自身场景进行配置
    6. event: 'change',
    7. // 必填 对应 props 的属性名
    8. prop: 'value',
    9. // 选填 `event.detail` 上的属性名,如果是 event.detail 本身, 则不填
    10. detailProp: 'value'
    11. }
    12. }
    13. }