пользовательская форма vue 3 выберите не выдавать правильное значение модели

#javascript #vue.js

#язык JavaScript #vue.js

Вопрос:

Я создал компонент формы выбора:

 lt;templategt;  lt;div class="col"gt;  lt;div class="row mb-4"gt;  lt;label class="col-sm-4 col-form-label col-form-label-sm"gt;{{ label }}lt;/labelgt;  lt;div class="col-sm-8"gt;  lt;select  class="form-select form-select-sm"  :class="{'is-invalid': error}"  :disabled="disabled"  :value="modelValue"  @change="updateSelect"  gt;  lt;option  v-for="(option, index) in options"  :value="option.id ? option.id : (option.value ? option.value : option)"  :key="option.id ? option.id : index"  gt;  {{ option.name ? option.name : option }}  lt;/optiongt;  lt;/selectgt;  lt;div class="invalid-feedback" v-if="error"gt; {{ error }}lt;/divgt;  lt;/divgt;  lt;/divgt;  lt;/divgt; lt;/templategt;  lt;scriptgt;  export default {  name: "SelectForm",  props: {  label: {  type: String,  default: "",  },  modelValue: {  type: [String, Number, Boolean],  default: "",  },  error: {  type: String,  default: ""  },  disabled: {  type: Boolean,  default: false  },  options: {  type: Object  }  },  setup(props, { emit }) {  const updateSelect = (event) =gt; {  emit("update:modelValue", event.target.value)  }   return {  updateSelect  }  } } lt;/scriptgt;  lt;style scopedgt;  lt;/stylegt;   

Варианты могут быть для ex:

 ['Test 1', 'Test 2'] [{id: 1, name: 'Test 1'}] [{value: 'test1', name: 'Test 1'}]  

Итак, в основном компоненте у меня есть это:

 lt;select-form label="Status" :options="userStatuses" v-model="isActive"/gt;  

где объект userStatuses-это:

 const userStatuses = ref([  {name: 'Active', value: true},  {name: 'Inactive', value: false} ])  

Проблема в том, что при выборе значения «Активный» он устанавливает модель isActive как «истинную» (в виде строки — и мне нужно, чтобы она была логической) и для неактивного объекта = gt; (это то, что говорится в инструментах разработки Vue)

Я предполагаю, что проблема заключается в возврате значения модели

 emit("update:modelValue", event.target.value)  

Я не уверен, правильно ли я это сделал.

Кто-нибудь знает, как это решить ?

Ответ №1:

Я внес некоторые изменения в функцию updateSelect и привел значение, если оно логическое или числовое … и установите это значение при обновлении:

 const updateSelect = (event) =gt; {  let value = event.target.value;  if(value === 'true') { value = true }  if(value === 'false') { value = false }  if(!isNaN(parseInt(value))) { value = parseInt(value) }  emit("update:modelValue", value) }  

Ответ №2:

Эта строка, по-видимому, приводит к тому, что «Неактивный» возвращает объект, а «Активный» возвращает строку:

 :value="option.id ? option.id : (option.value ? option.value : option)"  

Поскольку {name: 'Inactive', value: false} у него нет id и есть ложь value , он установит весь объект опции в качестве значения опции.

Вы можете переписать его как:

 :value="typeof(option) === 'string' ? option : option.id || option.value"  

Таким образом, в этом случае вы всегда получите либо «истину», либо «ложь». Тем не менее, я считаю, что event.target.value для выбора будет возвращена строка в любом случае, поэтому вам также нужно будет изменить это:

 emit("update:modelValue", event.target.value)  

Для

 emit("update:modelValue", event.target.value === "true")  

Комментарии:

1. при смене в emit я получаю TypeError: event.target.value.equals is not a function

2. Черт, я перепутал синтаксис. Вместо этого вы должны использовать===. Извините за путаницу, я обновлю свой ответ