Skip to content

Commit 077d03a

Browse files
feat(select): select组件增加下拉框滚动到底部事件 (DevCloudFE#1719)
* feat(select): select组件增加下拉框滚动到底部事件 * feat(select): demo补充 --------- Co-authored-by: GreatZP <greatzp@greatzp.cn>
1 parent b0e1d77 commit 077d03a

File tree

2 files changed

+34
-4
lines changed

2 files changed

+34
-4
lines changed

packages/devui-vue/devui/select/src/select.tsx

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import {
99
onBeforeMount,
1010
Teleport,
1111
withModifiers,
12+
onMounted,
13+
nextTick,
1214
} from 'vue';
1315
import type { SetupContext } from 'vue';
1416
import useSelect from './use-select';
@@ -27,7 +29,7 @@ import { FlexibleOverlay } from '../../overlay';
2729
export default defineComponent({
2830
name: 'DSelect',
2931
props: selectProps,
30-
emits: ['toggle-change', 'value-change', 'update:modelValue', 'focus', 'blur', 'remove-tag', 'clear'],
32+
emits: ['toggle-change', 'value-change', 'update:modelValue', 'focus', 'blur', 'remove-tag', 'clear', 'load-more'],
3133
setup(props: SelectProps, ctx: SetupContext) {
3234
const app = getCurrentInstance();
3335
const t = createI18nTranslate('DSelect', app);
@@ -57,6 +59,7 @@ export default defineComponent({
5759
toggleChange,
5860
isShowCreateOption,
5961
} = useSelect(props, selectRef, ctx, focus, blur, isSelectFocus, t);
62+
const dropdownContainer = ref();
6063
const { originRef, dropdownWidth } = useSelectMenuSize(selectRef, dropdownRef, isOpen);
6164

6265
const scrollbarNs = useNamespace('scrollbar');
@@ -77,6 +80,20 @@ export default defineComponent({
7780
isRender.value = true;
7881
});
7982

83+
const scrollToBottom = () => {
84+
const compareHeight = dropdownContainer.value.scrollHeight - dropdownContainer.value.clientHeight;
85+
const scrollTop = dropdownContainer.value.scrollTop;
86+
if (scrollTop === compareHeight) {
87+
ctx.emit('load-more');
88+
}
89+
};
90+
91+
onMounted(() => {
92+
nextTick(() => {
93+
dropdownContainer.value.addEventListener('scroll', scrollToBottom);
94+
});
95+
});
96+
8097
provide(
8198
SELECT_TOKEN,
8299
reactive({
@@ -119,7 +136,11 @@ export default defineComponent({
119136
'z-index': isOpen.value ? 'var(--devui-z-index-dropdown, 1052)' : -1,
120137
}}>
121138
<div class={dropdownCls} style={{ width: `${dropdownWidth.value}px`, visibility: isOpen.value ? 'visible' : 'hidden' }}>
122-
<ul class={listCls} v-show={!isLoading.value} style={{ padding: isShowEmptyText.value ? '0' : '12px' }}>
139+
<ul
140+
class={listCls}
141+
v-show={!isLoading.value}
142+
style={{ padding: isShowEmptyText.value ? '0' : '12px' }}
143+
ref={dropdownContainer}>
123144
{isShowCreateOption.value && (
124145
<Option value={filterQuery.value} name={filterQuery.value} create>
125146
{props.multiple ? <Checkbox modelValue={false} label={filterQuery.value} /> : filterQuery.value}

packages/devui-vue/docs/components/select/index.md

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ export default defineComponent({
199199
<template>
200200
<div>
201201
<d-button @click.stop="toggleChange" @pointerup.stop="() => {}" class="mb-2">展开 / 隐藏</d-button>
202-
<d-select ref="demoSelect" v-model="toggleValue" :options="options"></d-select>
202+
<d-select ref="demoSelect" v-model="toggleValue" :options="options" @load-more="loadMore"></d-select>
203203
</div>
204204
</template>
205205
@@ -210,18 +210,26 @@ export default defineComponent({
210210
setup() {
211211
const toggleValue = ref('');
212212
const visitable = ref(false);
213-
const items = new Array(6).fill(0).map((item, i) => `Option ${i + 1}`);
213+
const items = new Array(12).fill(0).map((item, i) => `Option ${i + 1}`);
214214
const options = reactive(items);
215+
const newItems = new Array(2).fill(0).map((item, i) => `Option new`);
215216
const demoSelect = ref(null);
216217
const toggleChange = () => {
217218
visitable.value = !visitable.value;
218219
demoSelect.value.toggleChange(visitable.value);
219220
};
221+
const loadMore = () => {
222+
if(options.length <= 20) {
223+
options.push(...newItems);
224+
console.log('load more');
225+
}
226+
};
220227
return {
221228
toggleValue,
222229
options,
223230
demoSelect,
224231
toggleChange,
232+
loadMore,
225233
};
226234
},
227235
});
@@ -530,6 +538,7 @@ export default defineComponent({
530538
| blur | `Function(e: FocusEvent)` | 可选,失去焦点时触发 |
531539
| clear | `Function()` | 可选, 通过右侧删除图标清空所有选项时触发 |
532540
| remove-tag | `Function(value)` | 可选,多选时删除单个 tag 时触发,参数为当前 tag 的值 |
541+
| load-more | `Function()` | 可选,下拉框有滚动条时滚动到底部触发 |[下拉列表显隐方法](#下拉列表显隐方法)|
533542

534543
### Select 插槽
535544

0 commit comments

Comments
 (0)