99 onBeforeMount ,
1010 Teleport ,
1111 withModifiers ,
12+ onMounted ,
13+ nextTick ,
1214} from 'vue' ;
1315import type { SetupContext } from 'vue' ;
1416import useSelect from './use-select' ;
@@ -27,7 +29,7 @@ import { FlexibleOverlay } from '../../overlay';
2729export 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 }
0 commit comments