Skip to content

Commit ec41e5e

Browse files
committed
fix: 用浮层替换dropdown
1 parent c1bed54 commit ec41e5e

File tree

6 files changed

+71
-48
lines changed

6 files changed

+71
-48
lines changed

devui/editable-select/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import type { App } from 'vue'
22
import EditableSelect from './src/editable-select'
33
import EditableSelectOption from './src/components/option'
4-
import EditableSelectDropdown from './src/components/dropdown'
4+
55
EditableSelect.install = function (app: App): void {
66
app.component(EditableSelect.name, EditableSelect)
77
app.component(EditableSelectOption.name, EditableSelectOption)
8-
app.component(EditableSelectDropdown.name, EditableSelectDropdown)
8+
99
}
1010

11-
export { EditableSelect, EditableSelectOption, EditableSelectDropdown }
11+
export { EditableSelect, EditableSelectOption }
1212

1313
export default {
1414
title: 'EditableSelect 可输入下拉选择框',

devui/editable-select/src/components/dropdown/index.tsx

Lines changed: 0 additions & 28 deletions
This file was deleted.

devui/editable-select/src/components/option/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ import { defineComponent } from 'vue';
33
export default defineComponent({
44
name: 'DEditableSelectOption',
55
setup(props, ctx) {
6+
const defaultSlot = ctx.slots.default && ctx.slots.default();
67
return () => {
7-
const defaultSlot = ctx.slots.default && ctx.slots.default();
88
return <li class="devui-dropdown-item">{defaultSlot}</li>;
99
};
1010
},

devui/editable-select/src/editable-select-types.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,19 @@ export const editableSelectProps = {
44
/* test: {
55
type: Object as PropType<{ xxx: xxx }>
66
} */
7+
width: {
8+
type: Number,
9+
default: 450
10+
},
11+
appendToBody: {
12+
type: Boolean,
13+
default: true,
14+
},
15+
maxHeight: {
16+
type: Number,
17+
default: 300
18+
}
19+
720
} as const
821

922
export type EditableSelectProps = ExtractPropTypes<typeof editableSelectProps>

devui/editable-select/src/editable-select.tsx

Lines changed: 52 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,70 @@
11
import './editable-select.scss';
22

3-
import { defineComponent, Transition } from 'vue';
3+
import { defineComponent, ref, reactive, renderSlot } from 'vue';
44
import {
55
editableSelectProps,
66
EditableSelectProps,
77
} from './editable-select-types';
88
import { Icon } from '../../icon';
9-
import Dropdown from './components/dropdown';
9+
1010
export default defineComponent({
1111
name: 'DEditableSelect',
1212
props: editableSelectProps,
1313
emits: [],
1414
setup(props: EditableSelectProps, ctx) {
15-
return () => {
16-
const defaultSlot = ctx.slots.default && ctx.slots.default();
15+
const origin = ref(null);
16+
const visible = ref(false);
17+
const position = reactive({
18+
originX: 'left',
19+
originY: 'bottom',
20+
overlayX: 'left',
21+
overlayY: 'top',
22+
});
1723

24+
const toggleMenu = () => {
25+
visible.value = !visible.value;
26+
};
27+
28+
return () => {
1829
return (
19-
<div class="devui-form-group devui-has-feedback devui-select-open">
20-
<input type="text" class="devui-form-control devui-dropdown-origin" />
21-
<span class="devui-form-control-feedback">
22-
<span class="devui-select-chevron-icon">
23-
<Icon name="select-arrow" />
30+
<>
31+
<div
32+
class="devui-form-group devui-has-feedback devui-select-open"
33+
onClick={toggleMenu}
34+
ref={origin}
35+
>
36+
<input
37+
type="text"
38+
class="devui-form-control devui-dropdown-origin"
39+
/>
40+
<span class="devui-form-control-feedback">
41+
<span class="devui-select-chevron-icon">
42+
<Icon name="select-arrow" />
43+
</span>
2444
</span>
25-
</span>
26-
<Transition name="fade">
27-
<Dropdown>{defaultSlot}</Dropdown>
28-
</Transition>
29-
</div>
45+
</div>
46+
<d-flexible-overlay
47+
origin={origin}
48+
v-model={[visible.value, 'visible']}
49+
position={position}
50+
>
51+
<div
52+
class="devui-dropdown-wrap"
53+
style={{ width: props.width + 'px' }}
54+
>
55+
<div class="devui-dropdown-menu">
56+
<ul
57+
class="devui-list-unstyled scroll-height"
58+
style={{
59+
maxHeight: props.maxHeight + 'px',
60+
}}
61+
>
62+
{renderSlot(ctx.slots, 'default')}
63+
</ul>
64+
</div>
65+
</div>
66+
</d-flexible-overlay>
67+
</>
3068
);
3169
};
3270
},

sites/.vitepress/config/sidebar.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const sidebar = {
1212
{ text: 'Search 搜索框', link: '/components/search/', status: '已完成' },
1313
{ text: 'Status 状态', link: '/components/status/', status: '已完成' },
1414
{ text: 'Sticky 便贴', link: '/components/sticky/' },
15-
{ text: 'Overlay 浮层', link: '/components/overlay/'}
15+
{ text: 'Overlay 浮层', link: '/components/overlay/' }
1616
]
1717
},
1818
{
@@ -53,7 +53,7 @@ const sidebar = {
5353
{ text: 'Checkbox 复选框', link: '/components/checkbox/', status: '已完成' },
5454
{ text: 'DatePicker 日期选择器', link: '/components/date-picker/', status: '开发中' },
5555
{ text: 'DatePickerPro 日期选择器', link: '/components/date-picker-pro/' },
56-
{ text: 'EditableSelect 可编辑下拉框', link: '/components/editable-select/' },
56+
{ text: 'EditableSelect 可编辑下拉框', link: '/components/editable-select/', status: '开发中' },
5757
{ text: 'Form 表单', link: '/components/form/' },
5858
{ text: 'Input 文本框', link: '/components/input/', status: '已完成' },
5959
{ text: 'InputNumber 数字输入框', link: '/components/input-number/' },

0 commit comments

Comments
 (0)