# Select
Select - Dropdown/Select component
<KSelect label="Pick Something:" :items="[{
label: 'test',
value: 'test'
}, {
label: 'Test 1',
value: 'test1'
}, {
label: 'TEST 2',
value: 'test2'
}]"
/>
# Props
# items
An array of items containing a label and value. May also specify that a certain item is selected
by default.
<KSelect :items="[{
label: 'test',
value: 'test',
selected: true
}, {
label: 'Test 1',
value: 'test1'
}, {
label: 'TEST 2',
value: 'test2'
}]"
/>
# label
The label for the select.
<KSelect label="Cool label" :items="[{
label: 'test',
value: 'test',
selected: true
}, {
label: 'Test 1',
value: 'test1'
}]"
/>
# labelAttributes
Use the labelAttributes prop to configure the KLabel's props if using the label prop.
<KSelect
label="Name"
:label-attributes="{
help: 'I use the KLabel `help` prop',
'data-testid': 'test'
}"
:items="[{
label: 'test',
value: 'test'
}, {
label: 'Test 1',
value: 'test1'
}]"
/>
# appearance
There are three styles of selects, select and dropdown (default) which are filterable, and lastly button which is not.
The dropdown appearance style has a selected item object. You can deselect the item by clicking
the Clear icon.
<KSelect :items="[{
label: 'test',
value: 'test',
selected: true
}, {
label: 'Test 1',
value: 'test1'
}]"
/>
The select style displays the selected item in the textbox and also displays a chevron. There is no
way to clear the selection once it is made.
<KSelect appearance='select' :items="[{
label: 'test',
value: 'test',
selected: true
}, {
label: 'Test 1',
value: 'test1'
}]"
/>
The button style triggers the dropdown on click and you cannot filter the entries.
<KSelect appearance='button' :items="[{
label: 'test',
value: 'test'
}, {
label: 'Test 1',
value: 'test1'
}]"
/>
# buttonText
You can configure the button text when an item is selected, if appearance is type button.
<KSelect
appearance='button'
width="225"
@selected="item => handleItemSelect(item)"
:buttonText="`Show ${mySelect} per page`"
:items="items"
/>
<script>
export default {
data() {
return {
mySelect: '',
items: [{
label: '25',
value: '25'
}, {
label: '50',
value: '50'
}]
}
},
methods: {
handleItemSelect (item) {
this.mySelect = item.label
}
}
}
</script>
# width
You can pass a width string for dropdown. By default the width is 200px. This is the width
of the input, dropdown, and selected item.
<KSelect width="100" :items="[{
label: 'test',
value: 'test',
selected: true
}, {
label: 'Test 1',
value: 'test1'
}]"
/>
# positionFixed
Use fixed positioning of the popover to avoid content being clipped by parental boundaries - defaults to false. See KPop docs for more information.
# filterFunc
Use this prop to override the default filter function if you want to do something like filter on an attribute other than label. Your filter function
should take as parameter a JSON object containing the items to filter on (items) and the query string (query) and return the filtered items. See Slots for an example.
myCustomFilter ({ items, query }) {
return items.filter(anItem => anItem.label.includes(query))
}
# v-model
KSelect works as regular inputs do using v-model for data binding:
<Komponent :data="{myVal: 'test'}" v-slot="{ data }">
<div>
<KLabel>Value:</KLabel> {{ data.myVal }}
<KSelect width="100" v-model="data.myVal" :items="[{
label: 'test',
value: 'test'
}, {
label: 'Test 1',
value: 'test1'
}]"
/>
</div>
</Komponent>
# Attribute Binding
You can pass any input attribute and it will get properly bound to the element.
<KSelect disabled placeholder="type something" :items="[{ label: 'test', value: 'test' }]" />
# Slots
You can use the item-template slot to customize the look and feel of your items. Use slots to gain access to the item data.
<KSelect :items="myItems" width="500" :filterFunc="customFilter">
<template v-slot:item-template="{ item }">
<div class="select-item-label">{{item.label}}</div>
<div class="select-item-desc">{{item.description}}</div>
</template>
</KSelect>
<script>
export default {
data() {
return {
myItems: this.getItems(5),
}
},
methods: {
getItems(count) {
let myItems = []
for (let i = 0; i < count; i++) {
myItems.push({
label: "Item " + i,
value: "item_" + i,
description: "The item's description for number " + i
})
}
return myItems
},
customFilter (items, queryStr) {
return items.filter(item => {
return item.label.toLowerCase().includes(queryStr.toLowerCase()) ||
item.description.toLowerCase().includes(queryStr.toLowerCase())
})
}
}
}
</script>
# Events
| Event | returns |
|---|---|
selected | selectedItem Object |
input | selectedItem Object or null |
change | selectedItem Object or null |