|
@@ -1,23 +1,25 @@
|
|
<template>
|
|
<template>
|
|
<div class="w-100% flex costume-header__header">
|
|
<div class="w-100% flex costume-header__header">
|
|
<!-- 选择下拉框,自动填充剩余空间,这种实现是因为 Select 不支持 suffix -->
|
|
<!-- 选择下拉框,自动填充剩余空间,这种实现是因为 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 }}
|
|
|
|
|
|
+ <slot name="select">
|
|
|
|
+ <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>
|
|
</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>
|
|
|
|
|
|
+ <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>
|
|
<slot class="costume-header__header_right"></slot>
|
|
<slot class="costume-header__header_right"></slot>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</template>
|
|
@@ -27,7 +29,7 @@
|
|
import { SwapOutlined, CaretDownOutlined, CaretUpOutlined } from '@ant-design/icons-vue';
|
|
import { SwapOutlined, CaretDownOutlined, CaretUpOutlined } from '@ant-design/icons-vue';
|
|
|
|
|
|
const props = defineProps<{
|
|
const props = defineProps<{
|
|
- api: () => Promise<{ label: any; key: any }[]>;
|
|
|
|
|
|
+ api?: () => Promise<{ label: any; key: any }[]>;
|
|
}>();
|
|
}>();
|
|
const emit = defineEmits(['change']);
|
|
const emit = defineEmits(['change']);
|
|
|
|
|
|
@@ -48,6 +50,7 @@
|
|
|
|
|
|
onMounted(() => {
|
|
onMounted(() => {
|
|
// 获取数据
|
|
// 获取数据
|
|
|
|
+ if (!props.api) return;
|
|
props.api().then((opts) => {
|
|
props.api().then((opts) => {
|
|
options.value = opts;
|
|
options.value = opts;
|
|
selectHandler({ key: opts[0]?.key, item: { title: opts[0]?.label } });
|
|
selectHandler({ key: opts[0]?.key, item: { title: opts[0]?.label } });
|
|
@@ -58,7 +61,7 @@
|
|
</script>
|
|
</script>
|
|
<style scoped>
|
|
<style scoped>
|
|
.costume-header__header {
|
|
.costume-header__header {
|
|
- /* height: 30px; */
|
|
|
|
|
|
+ height: 30px;
|
|
background-image: linear-gradient(90deg, #3df6ff44, transparent 20%, transparent 80%, #3df6ff44);
|
|
background-image: linear-gradient(90deg, #3df6ff44, transparent 20%, transparent 80%, #3df6ff44);
|
|
}
|
|
}
|
|
.costume-header__header_left {
|
|
.costume-header__header_left {
|