|
@@ -1,50 +1,62 @@
|
|
|
<template>
|
|
|
<div class="w-100% flex costume-header__header">
|
|
|
- <!-- 选择下拉框,自动填充剩余空间 -->
|
|
|
- <Select
|
|
|
- v-model:value="value"
|
|
|
- class="flex-grow-1 costume-header__header_left"
|
|
|
- :bordered="false"
|
|
|
- :options="options"
|
|
|
- placeholder="请选择"
|
|
|
- @change="$emit('change', $event)"
|
|
|
- />
|
|
|
+ <!-- 选择下拉框,自动填充剩余空间,这种实现是因为 Select 不支持 suffix -->
|
|
|
+ <Dropdown class="flex-grow-1 costume-header__header_left" :trigger="['click']" :bordered="false" @open-change="visible = $event">
|
|
|
+ <div class="w-100% flex flex-items-center" @click.prevent>
|
|
|
+ <SwapOutlined class="w-30px" />
|
|
|
+ <div class="flex-grow-1">
|
|
|
+ {{ selectedLabel }}
|
|
|
+ </div>
|
|
|
+ <CaretUpOutlined class="w-30px" v-if="visible" />
|
|
|
+ <CaretDownOutlined class="w-30px" v-else />
|
|
|
+ </div>
|
|
|
+ <template #overlay>
|
|
|
+ <Menu :selected-keys="[selectedKey]" @click="selectHandler">
|
|
|
+ <MenuItem v-for="item in options" :key="item.key" :title="item.label">
|
|
|
+ {{ item.label }}
|
|
|
+ </MenuItem>
|
|
|
+ </Menu>
|
|
|
+ </template>
|
|
|
+ </Dropdown>
|
|
|
<slot class="costume-header__header_right"></slot>
|
|
|
</div>
|
|
|
</template>
|
|
|
<script lang="ts" setup>
|
|
|
import { onMounted, ref } from 'vue';
|
|
|
- import { Select } from 'ant-design-vue';
|
|
|
- const props = withDefaults(
|
|
|
- defineProps<{
|
|
|
- api: Promise<Record<string, unknown>[]>;
|
|
|
- labelKey?: string;
|
|
|
- valueKey?: string;
|
|
|
- }>(),
|
|
|
- {
|
|
|
- labelKey: 'label',
|
|
|
- valueKey: 'value',
|
|
|
- }
|
|
|
- );
|
|
|
- defineEmits(['change']);
|
|
|
+ import { Dropdown, Menu, MenuItem } from 'ant-design-vue';
|
|
|
+ import { SwapOutlined, CaretDownOutlined, CaretUpOutlined } from '@ant-design/icons-vue';
|
|
|
|
|
|
- const value = ref();
|
|
|
- const options = ref([]);
|
|
|
+ const props = defineProps<{
|
|
|
+ api: () => Promise<{ label: any; key: any }[]>;
|
|
|
+ }>();
|
|
|
+ const emit = defineEmits(['change']);
|
|
|
+
|
|
|
+ // 下拉框是否可见
|
|
|
+ const visible = ref(false);
|
|
|
+ // 选中的选项
|
|
|
+ const selectedKey = ref('');
|
|
|
+ const selectedLabel = ref('');
|
|
|
+ const options = ref<{ label: any; key: any }[]>([]);
|
|
|
+
|
|
|
+ // 选择了某一项
|
|
|
+ function selectHandler({ key, item }) {
|
|
|
+ selectedKey.value = key;
|
|
|
+ selectedLabel.value = item.title;
|
|
|
+ emit('change', key);
|
|
|
+ }
|
|
|
|
|
|
onMounted(() => {
|
|
|
+ // 获取数据
|
|
|
props.api().then((opts) => {
|
|
|
- options.value = opts.map((o) => {
|
|
|
- return {
|
|
|
- label: o[props.labelKey],
|
|
|
- value: o[props.valueKey],
|
|
|
- };
|
|
|
- });
|
|
|
- value.value = options.value[0]?.value;
|
|
|
+ options.value = opts;
|
|
|
+ selectedKey.value = opts[0]?.key;
|
|
|
+ selectedLabel.value = opts[0]?.label;
|
|
|
});
|
|
|
});
|
|
|
</script>
|
|
|
<style scoped>
|
|
|
.costume-header__header {
|
|
|
+ /* height: 30px; */
|
|
|
background-image: linear-gradient(90deg, #3df6ff44, transparent 20%, transparent 80%, #3df6ff44);
|
|
|
}
|
|
|
.costume-header__header_left {
|