• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

vue 组件上使用v-model以实现双向绑定

武飞扬头像
咕咚咕咚咚
帮助1

默认情况

 v-model 实际上就是 $emit('input') 以及 props:value 的组合语法糖,只要组件中满足这两个条件,就可以在组件中使用 v-model

父组件调用子组件,通过v-model绑定属性值,在子组件中默认接收props为modelValue ,子组件中触发更新需要通过emit 触发update:modelValue自定义事件。

  1.  
    // 父组件调用子组件
  2.  
    <SubInput
  3.  
    v-model="formState.title0"
  4.  
    />
  5.  
    // 子组件
  6.  
    <input :value="modelValue" @input="($event: any) => $emit('update:modelValue', $event.target.value)" />
  7.  
     
  8.  
    props: {
  9.  
    modelValue: { type: String, require: true }
  10.  
    },
  11.  
    emit: ['update:modelValue'],

传参

默认情况下,v-model 在组件上都是使用 modelValue 作为 prop,并以 update:modelValue 作为对应的事件。我们可以通过给 v-model 指定一个参数来更改这些名字:

在这个例子中,子组件应声明一个 title prop,并通过触发 update:title 事件更新父组件值:

  1.  
    // 父组件调用子组件
  2.  
    <SubInput v-model:title1="formState.title1" />
  3.  
     
  4.  
    // 子组件
  5.  
    <input :value="title1" @input="($event: any) => $emit('update:title1', $event.target.value)" />
  6.  
     
  7.  
    props: {
  8.  
    title1: { type: String, require: true },
  9.  
    },
  10.  
    emit: [ 'update:title1'],

v-model 修饰符

组件的 v-model 上所添加的修饰符,可以通过 modelModifiers prop 在组件内访问到。在下面的组件中,我们声明了 modelModifiers 这个 prop,它的默认值是一个空对象。

对于又有参数又有修饰符的 v-model 绑定,生成的 prop 名将是 arg "Modifiers"

  1.  
    // 父组件调用子组件
  2.  
    <SubInput
  3.  
    v-model.capitalize="formState.title0"
  4.  
    v-model:title2.capitalize="formState.title2"
  5.  
    />
  6.  
    // 子组件
  7.  
    <input :value="title2" @input="handleTitle2" />
  8.  
     
  9.  
    props: {
  10.  
    modelModifiers: { default: () => ({}) },
  11.  
    title2Modifiers: { default: () => ({capitalize: false}) },
  12.  
    },
  13.  
    // 对于传递了capitalize修饰符的输入进行自动转换首字母大写的处理
  14.  
    const handleTitle2 = (e: any) => {
  15.  
    let value = e.target.value;
  16.  
    if (props.title2Modifiers.capitalize) {
  17.  
    value = value.charAt(0).toUpperCase() value.slice(1)
  18.  
    }
  19.  
    emit('update:title2', value)
  20.  
    }
  21.  
    onMounted(() => {
  22.  
    // 无参数有修饰符生成的prop名:modelModifiers
  23.  
    console.log('modelModifiers: ' , props.modelModifiers)
  24.  
    // 有参数且有修饰符生成的 prop名:arg "Modifiers"
  25.  
    console.log('title2Modifiers: ', props.title2Modifiers)
  26.  
    })
学新通

使用一个可写的,同时具有 getter 和 setter 的 computed 属性

  1.  
    // 父组件
  2.  
    <SubSelect v-model="formState.province" />
  3.  
    // 子组件
  4.  
    <template>
  5.  
    <a-divider orientation="right">使用一个可写的,同时具有 getter 和 setter 的 computed 属性</a-divider>
  6.  
    <div>省份:</div>
  7.  
    <a-select
  8.  
    v-model:value="value"
  9.  
    show-search
  10.  
    allowClear
  11.  
    placeholder="input"
  12.  
    :style="{ width: '200px' }"
  13.  
    :options="provinces"
  14.  
    :filter-option="filterOption"
  15.  
    ></a-select>
  16.  
    </template>
  17.  
     
  18.  
    <script lang="ts">
  19.  
    import { defineComponent, computed } from 'vue';
  20.  
    import { provinces } from '@/utils/consts';
  21.  
    export default defineComponent({
  22.  
    props: {
  23.  
    modelValue: { type: String, require: true },
  24.  
    },
  25.  
    emit: ['update:modelValue'],
  26.  
    setup(props, { emit }) {
  27.  
    const value = computed({
  28.  
    get() {
  29.  
    return props.modelValue;
  30.  
    },
  31.  
    set(value) {
  32.  
    emit('update:modelValue', value);
  33.  
    },
  34.  
    });
  35.  
     
  36.  
    const filterOption = (input: string, option: any) => {
  37.  
    return option.value.toLowerCase().indexOf(input.toLowerCase()) >= 0;
  38.  
    };
  39.  
    return {
  40.  
    filterOption,
  41.  
    value,
  42.  
    provinces
  43.  
    };
  44.  
    },
  45.  
    });
  46.  
    </script>
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfjbbga
系列文章
更多 icon
同类精品
更多 icon
继续加载