123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- <script lang="ts" setup>
- import { useSettingsStore } from '@/store/modules/settings'
- import { getList } from '@/api/search'
- const vFocus: any = {
- mounted(el: HTMLElement) {
- el.querySelector('input')?.focus()
- },
- }
- const settingsStore = useSettingsStore()
- const { theme } = storeToRefs(settingsStore)
- let timer: any = null
- const state = reactive({
- dialogVisible: false,
- queryForm: {
- searchWord: '',
- },
- restaurants: [],
- })
- const loadAll = async () => {
- const {
- data: { list },
- } = await getList()
- state.restaurants = list
- }
- onMounted(() => {
- if (theme.value.showSearch) loadAll()
- })
- const openDialog = () => {
- state.queryForm.searchWord = ''
- state.dialogVisible = true
- }
- const querySearchAsync = (queryString: any, cb: any) => {
- const restaurants = state.restaurants
- const results = queryString
- ? restaurants.filter(createFilter(queryString))
- : restaurants
- clearTimeout(timer)
- timer = setTimeout(() => {
- cb(results)
- }, 500)
- }
- const createFilter = (queryString: string) => (state: any) =>
- state.value.includes(queryString.toLowerCase())
- const handleSelect = (item: any) => {
- if (item.url) {
- window.open(item.url)
- } else {
- window.open(`https://www.baidu.com/s?wd=${item.value}`)
- }
- }
- </script>
- <template>
- <span v-if="theme.showSearch">
- <vab-icon icon="search-line" @click="openDialog" />
- <el-dialog v-model="state.dialogVisible" :width="'40%'">
- <el-autocomplete
- v-model="state.queryForm.searchWord"
- v-focus
- :fetch-suggestions="querySearchAsync"
- select-when-unmatched
- @select="handleSelect"
- >
- <template #prefix><vab-icon icon="search-line" /></template>
- </el-autocomplete>
- </el-dialog>
- </span>
- </template>
- <style lang="scss" scoped>
- :deep() {
- .el-dialog {
- &__header {
- display: none;
- border: 0 !important;
- }
- &__body {
- padding: 0;
- border: 0 !important;
- }
- &__footer {
- display: none;
- }
- }
- .el-autocomplete {
- width: 100%;
- transition: none;
- .el-input__inner {
- width: 100%;
- height: 60px;
- padding-left: $base-padding;
- line-height: 60px;
- }
- }
- }
- </style>
|