Привет! Супер-классная либа в целом! Только мало кастомизации. Собственно issue по этому поводу.
Feature Request
Мой запрос в том, чтобы расширить функционал <it-select>
. На данный момент этот компонент использовать очень неудобно из-за того, как он работает с моделью и опциями.
Допустим, у меня есть список с такой сигнатурой:
interface Item {
id: number;
text: string;
}
let items: Item[];
И я хочу дать пользователю выбрать одну опцию из этого списка. Хочу, чтобы пользователю были видны значения из text
, а я у себя изнутри бы использовал id
.
export default {
setup() {
const items: Item[] = [
{ id: 1, text: 'One' },
{ id: 2, text: 'Two' },
{ id: 3, text: 'Three' }
];
const value = ref<number | null>(null);
return { items, value }
}
}
И для того, чтобы такая логика могла быть реализована с <it-select>
, ему нужны дополнительные пропсы:
<template>
<it-select
v-model="value"
:options="items"
option-value="id"
option-label="text"
/>
</template>
optionValue
- строка (по умолчанию value
, например). По ней из опций брать то, что является значением опции. То есть то, что окажется в modelValue
, если опция будет выбрана.
optionLabel
- строка (по умолчанию label
, например). По ней брать из опции то, что отображается пользователю, видимый текст опции.
Если в options
лежит не список объектов, а просто массив значений (строки, или числа, etc), то и отображать, и использовать в качестве значений сами элементы массива.
index
index
- параметр, с помощью которого уже сейчас можно доставать значения изнутри опций. Но это бесполезно в случае, когда нужно показывать какой-то другой текст, соответствующий значениям. И совсем сложно что-то такое делать, когда у разных опций соответствующий им текст может быть одинаков.
Кастомизация через слот
Также было бы очень удобно, если бы компонент предоставлял кастомное отображение опций через слот:
<template>
<it-select
v-model="value"
:options="items"
option-value="id"
>
<template #item="{ item }">
{{ item.id }} - {{ item.text }}
</template>
</it-select>
</template>
Данный функционал я почерпнул из другой UI-библиотеки - Vuetify. Можно посмотреть, как там это у них в селекте работает.