如何设置vuejs中选择组件的默认选项为空值?

vlf7wbxs  于 2023-03-09  发布在  Vue.js
关注(0)|答案(1)|浏览(591)

v-model有一个select。最初是null。在option中,我也指定了null作为默认值-一切正常,默认值被替换。但是当我把这个select放到一个单独的组件中时,由于某种原因它停止使用null,默认选项没有被替换。链接到文档:https://vuejs.org/guide/components/v-model.html
父组件中的调用:
Parent.vue

<filter-trashed-select v-model="filters.trashed.fieldValue"/>

FilterTrashedSelect.vue

<template>
    <div class="reference__filter-select-wrapper">
        <select class="form-select" :value="modelValue" @input="$emit('update:modelValue', $event.target.value)">
            <option :value="null">{{ $t('Only active') }}</option>
            <option value="only">{{ $t('Only hidden') }}</option>
            <option value="with">{{ $t('All') }}</option>
        </select>
    </div>
</template>

<script>
export default {
    name: "FilterTrashedSelect",
    props: ['modelValue'],
    emits: ['update:modelValue']
}
</script>

1.我尝试显式替换空值

<template>
    <div class="reference__filter-select-wrapper">
        <select class="form-select" :value="null" @input="$emit('update:modelValue', $event.target.value)">
            <option :value="null">{{ $t('Only active') }}</option>
            <option value="only">{{ $t('Only hidden') }}</option>
            <option value="with">{{ $t('All') }}</option>
        </select>
    </div>
</template>

<script>
export default {
    name: "FilterTrashedSelect",
    props: ['modelValue'],
    emits: ['update:modelValue']
}
</script>

1.我尝试在调用时使用v-model的扩展版本
Parent.vue

<filter-trashed-select :modelValue="filters.trashed.fieldValue"
  @update:modelValue="newValue => filters.trashed.fieldValue= newValue"/>

1.但如果您将此select从组件中取出,并在Parent.vue中显式使用它,那么一切都将正常工作
使用Vue SFC Playground上的问题简化示例。
在组件中,你需要使用v模型,但是你不能在属性上使用它,要做到这一点,在数据中创建一个变量。

<template>
  <select v-model="test" @change="$emit('update:modelValue', $event.target.value)">
    <option :value="null">null</option>
    <option value="1">1</option>
  </select>
</template>
<script>
export default {
  props: ["modelValue"],
  emits: ["update:modelValue"],
  data() {
    return {
      test: this.modelValue
    }
  }
};
</script>
ogq8wdun

ogq8wdun1#

我建议你选择其他的东西作为默认值null。Null不是一个值,不应该被当作值。Null是没有值。
如果您在选择选项中使用null作为值,那么Vue将使用选项的文本作为值。检查下面的游戏,如果您选择了第一个选项,showValue()将如何打印“Only active”。
有趣的是,:value="modelValue"v-model="modelValue"的行为是不同的。检查一下这两个选择对选择第一个选项的React。目前我还没有对此的解释。
最好的解决方案是为prop使用某个default值,并对其进行验证以设置默认值。

<option value="active">Only active</option>

以及

props: {
  modelValue: {
    type: String,
    default: 'active',
    validator: function (value) {
        return ['active', 'only', 'with'].includes(value)
    }
  }
}

null仍然不好通过,因为它甚至不引起验证发生。这里我也不知道为什么会这样。最好使用undefined而不是null,因为undefined引起验证发生。
查看以下Vue SFCPlayground了解详情。
一个一个二个一个一个一个三个一个一个一个一个一个四个一个

相关问题