<!--
|
* @Author: 秦少卫
|
* @Date: 2024-06-11 16:04:59
|
* @LastEditors: 秦少卫
|
* @LastEditTime: 2024-06-12 16:37:40
|
* @Description: 搜索组件
|
-->
|
|
<template>
|
<div class="search-box">
|
<Button
|
type="text"
|
class="back-btn"
|
@click="clear"
|
v-if="typeValue || searchKeyWord"
|
icon="ios-arrow-back"
|
></Button>
|
|
<Select class="select" v-model="typeValue" :disabled="loading" @on-change="change">
|
<Option v-for="item in typeList" :value="item.value" :key="item.value">
|
{{ item.label }}
|
</Option>
|
</Select>
|
<Input
|
class="input"
|
:placeholder="`在${typeText}中搜索`"
|
v-model="searchKeyWord"
|
:disabled="loading"
|
clearable
|
@on-change="inputChange"
|
@on-search="change"
|
search
|
/>
|
</div>
|
</template>
|
|
<script name="ImportJson" setup>
|
import { debounce } from 'lodash-es';
|
|
const props = defineProps({
|
typeListApi: {
|
type: Function,
|
Object: () => ({}),
|
},
|
});
|
const emit = defineEmits(['change']);
|
|
const loading = ref(false);
|
|
const typeValue = ref('');
|
const searchKeyWord = ref('');
|
const typeList = ref([]);
|
const typeText = computed(() => {
|
const info = typeList.value.find((item) => item.value === typeValue.value);
|
return info?.label || '全部';
|
});
|
|
onMounted(async () => {
|
loading.value = true;
|
|
try {
|
const res = await props.typeListApi();
|
const list = res.data.data.map((item) => {
|
return {
|
value: item.id,
|
label: item.attributes.name,
|
};
|
});
|
typeList.value = [
|
{
|
label: '全部',
|
value: '',
|
},
|
...list,
|
];
|
} catch (error) {
|
console.log(error);
|
}
|
|
loading.value = false;
|
});
|
|
const change = () => {
|
emit('change', { searchKeyWord: searchKeyWord.value, typeValue: typeValue.value });
|
};
|
|
// const getValue = () => {
|
// return { type: typeValue.value, searchKeyWord };
|
// };
|
const clear = () => {
|
typeValue.value = '';
|
searchKeyWord.value = '';
|
change();
|
};
|
|
const setType = (type) => {
|
typeValue.value = type;
|
};
|
|
const inputChange = debounce(change, 300);
|
|
defineExpose({
|
setType,
|
});
|
</script>
|
<style scoped lang="less">
|
.search-box {
|
padding-top: 10px;
|
display: flex;
|
|
.back-btn {
|
margin-right: 10px;
|
}
|
.input {
|
margin-left: 10px;
|
}
|
.select {
|
width: 100px;
|
}
|
}
|
</style>
|