Files
element-plus/docs/examples/autocomplete/custom-header-footer.vue
jiaxiang b208a7e90c docs(style): fix class name repeat (#22739)
* docs: [Watermark] rename class name

* Update docs/examples/watermark/custom.vue

Co-authored-by: btea <2356281422@qq.com>

* chore: fix

* style: update

* Update docs/examples/autocomplete/custom-header-footer.vue

Co-authored-by: rzzf <cszhjh@gmail.com>

* fix(docs): update

* Update docs/examples/cascader/custom-header-footer.vue

* Update docs/examples/cascader/custom-header-footer.vue

---------

Co-authored-by: btea <2356281422@qq.com>
Co-authored-by: rzzf <cszhjh@gmail.com>
2025-11-10 11:39:07 +08:00

107 lines
2.6 KiB
Vue

<template>
<div class="autocomplete-custom-header-footer">
<div>
<p>Custom header content</p>
<el-autocomplete
v-model="headerSlotState"
:fetch-suggestions="querySearchAsync"
placeholder="Please input"
@select="handleSelect"
>
<template #header>header content</template>
</el-autocomplete>
</div>
<div>
<p>Custom footer content</p>
<el-autocomplete
ref="footerAutocompleteRef"
v-model="footerSlotstate"
:fetch-suggestions="querySearchAsync"
placeholder="Please input"
@select="handleSelect"
>
<template #footer>
<el-button link size="small" @click="handleClear"> Clear </el-button>
</template>
</el-autocomplete>
</div>
</div>
</template>
<script lang="ts" setup>
import { onMounted, ref } from 'vue'
const headerSlotState = ref('')
const footerSlotstate = ref('')
interface LinkItem {
value: string
link: string
}
const links = ref<LinkItem[]>([])
const loadAll = () => {
return [
{ value: 'vue', link: 'https://github.com/vuejs/vue' },
{ value: 'element', link: 'https://github.com/ElemeFE/element' },
{ value: 'cooking', link: 'https://github.com/ElemeFE/cooking' },
{ value: 'mint-ui', link: 'https://github.com/ElemeFE/mint-ui' },
{ value: 'vuex', link: 'https://github.com/vuejs/vuex' },
{ value: 'vue-router', link: 'https://github.com/vuejs/vue-router' },
{ value: 'babel', link: 'https://github.com/babel/babel' },
]
}
let timeout: ReturnType<typeof setTimeout>
const querySearchAsync = (queryString: string, cb: (arg: any) => void) => {
const results = queryString
? links.value.filter(createFilter(queryString))
: links.value
clearTimeout(timeout)
timeout = setTimeout(() => {
cb(results)
}, 3000 * Math.random())
}
const createFilter = (queryString: string) => {
return (restaurant: LinkItem) => {
return (
restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0
)
}
}
const handleSelect = (item: Record<string, any>) => {
console.log(item)
}
onMounted(() => {
links.value = loadAll()
})
const footerAutocompleteRef = ref()
const handleClear = () => {
footerSlotstate.value = ''
footerAutocompleteRef.value.getData()
}
</script>
<style scoped>
.autocomplete-custom-header-footer {
display: flex;
}
.autocomplete-custom-header-footer > div {
flex: 1;
text-align: center;
}
.autocomplete-custom-header-footer > div > :deep(.el-autocomplete) {
width: 50%;
}
.autocomplete-custom-header-footer > div:not(:last-child) {
border-right: 1px solid var(--el-border-color);
}
</style>