feat(Tabs): control selected index (#490)

This commit is contained in:
Benjamin Canac
2023-08-04 10:16:36 +02:00
parent ad0fe230ba
commit aaf09ad555
4 changed files with 165 additions and 5 deletions

View File

@@ -83,6 +83,78 @@ const items = [...]
```
::
::callout{icon="i-heroicons-exclamation-triangle"}
This will have no effect if you are using a `v-model` to control the selected index.
::
### Listen to changes :u-badge{label="Edge" class="ml-2 align-text-bottom !rounded-full" variant="subtle"}
You can listen to changes by using the `@change` event. The event will emit the index of the selected item.
::component-example
#default
:tabs-example-change{class="w-full"}
#code
```vue
<script setup>
const items = [...]
function onChange (index) {
const item = items[index]
alert(`${item.label} was clicked!`)
}
</script>
<template>
<UTabs :items="items" @change="onChange" />
</template>
```
::
### Control the selected index :u-badge{label="Edge" class="ml-2 align-text-bottom !rounded-full" variant="subtle"}
Use a `v-model` to control the selected index.
::component-example
#default
:tabs-example-v-model{class="w-full"}
#code
```vue
<script setup>
const items = [...]
const route = useRoute()
const router = useRouter()
const selected = computed({
get () {
const index = items.findIndex((item) => item.label === route.query.tab)
if (index === -1) {
return 0
}
return index
},
set (value) {
// Hash is specified here to prevent the page from scrolling to the top
router.replace({ query: { tab: items[value].label }, hash: '#control-the-selected-index' })
}
})
</script>
<template>
<UTabs v-model="selected" :items="items" />
</template>
```
::
::callout{icon="i-heroicons-information-circle"}
In this example, we are binding tabs to the route query. Refresh the page to see the selected tab change.
::
## Slots
You can use slots to customize the buttons and items content of the Accordion.