BRAGA96
@BRAGA96

Как получить выбранное значение того же типа в компоненте Select Vue?

Есть обертка-компонент для select:
<template>
  <select v-on="listeners" :value="value">
    <option v-for="(option, index) of list" :key="index" :value="option">{{ option }}</option>
  </select>
</template>

<script>
export default {
  name: "x-select",

  props: {
    value: {
      type: [Number, String, Boolean],
      required: false,
      default: ""
    },

    list: {
      type: Array,
      required: false,
      default: () => []
    }
  },

  computed: {
    listeners() {
      return {
        ...this.$listeners,
        input: ({ target: { value } }) => this.$emit("input", value)
      };
    }
  }
};
</script>


Данный компонент берет значение для $emit из event.target.value. В этом свойстве значение всегда будет c типом string. Что если мне нужно получать значение того типа, которое я туда положил, то есть из массива list? Так, например, работает нативный select, если не использовать его в виде компонента, как добиться такого эффекта, от куда брать значение для $emit?

Как я использую компонент:
<template>
  <x-select v-model="selected" :list="list" />
</template>

<script>
export default {
  name: "app",

  data: () => ({
    list: [1, true, "124.5", false, 15.7],
    selected: 1
  })
};
</script>

В этом коде после первого выбора selected свойство всегда будет иметь тип string. Я конечно могу использовать дерективы v-model.number, чтобы переобразовать в числа, но с boolean значениями это не поможет. А что если мне приходят числа в типе number и string и я не хочу менять их тип?

Вот как работает нативный select и здесь все хорошо с типами:
<template>
  <select v-model="selected">
    <option v-for="(option, index) of list" :key="index" :value="option">
        {{ option }}
    </option>
  </select>
</template>

<script>
export default {
  name: "app",

  data: () => ({
    list: [1, true, "124.5", false, 15.7],
    selected: 1
  })
};
</script>

В этом коде в свойстве selected будет именно то значение, которое есть в массив list с тем же самым типом. Подскажите как добиться такого результата? Неужели самому парсить?

Песочница:
1. Компонент обертка
2. Нативный select
  • Вопрос задан
  • 293 просмотра
Решения вопроса 1
0xD34F
@0xD34F Куратор тега Vue.js
Используйте в качестве значений option'ов не сами значения, а их индексы внутри массива list. Эмитить надо будет, соответственно, list[target.value].

https://jsfiddle.net/krnLyf2q/

Или сделайте внутри компонента computed свойство с сеттером (в котором будет выполняться $emit), и используйте его в v-model.

https://jsfiddle.net/krnLyf2q/1/
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы