1- import React , { useCallback , useMemo , useRef , forwardRef , ElementRef , useImperativeHandle } from 'react' ;
2- import { isFunction } from 'lodash-es' ;
1+ import React , { ElementRef , forwardRef , useCallback , useImperativeHandle , useMemo , useRef } from 'react' ;
32import classNames from 'classnames' ;
4- import type { TdTreeSelectProps , TreeSelectValue } from './type' ;
5- import type { StyledProps , TreeOptionData } from '../common' ;
3+ import { isFunction } from 'lodash-es' ;
4+ import noop from '../_util/noop' ;
5+ import parseTNode from '../_util/parseTNode' ;
66import useConfig from '../hooks/useConfig' ;
77import useControlled from '../hooks/useControlled' ;
8- import Tree from '../tree' ;
9- import type { TreeInstanceFunctions , TreeProps } from '../tree' ;
10- import SelectInput , { SelectInputProps } from '../select-input/SelectInput' ;
8+ import useDefaultProps from '../hooks/useDefaultProps' ;
119import { usePersistFn } from '../hooks/usePersistFn' ;
1210import useSwitch from '../hooks/useSwitch' ;
13- import noop from '../_util/noop' ;
11+ import SelectInput , { type SelectInputProps } from '../select-input/SelectInput' ;
12+ import Tree from '../tree' ;
13+ import { treeSelectDefaultProps } from './defaultProps' ;
14+ import { useTreeSelectLocale } from './hooks/useTreeSelectLocale' ;
15+ import { useTreeSelectPassThroughProps } from './hooks/useTreeSelectPassthroughProps' ;
1416import { useTreeSelectUtils } from './hooks/useTreeSelectUtils' ;
1517import { SelectArrow } from './SelectArrow' ;
16- import { useTreeSelectPassThroughProps } from './hooks/useTreeSelectPassthroughProps' ;
17- import { useTreeSelectLocale } from './hooks/useTreeSelectLocale' ;
18- import { treeSelectDefaultProps } from './defaultProps' ;
19- import parseTNode from '../_util/parseTNode' ;
20- import useDefaultProps from '../hooks/useDefaultProps' ;
21- import { PopupRef } from '../popup' ;
22- import { InputRef } from '../input' ;
18+
19+ import type { StyledProps , TreeOptionData } from '../common' ;
20+ import type { InputRef } from '../input' ;
21+ import type { PopupRef } from '../popup' ;
22+ import type { TreeInstanceFunctions , TreeProps } from '../tree' ;
23+ import type { TdTreeSelectProps , TreeSelectValue } from './type' ;
2324
2425export interface TreeSelectProps < DataOption extends TreeOptionData = TreeOptionData >
2526 extends TdTreeSelectProps < DataOption > ,
@@ -75,6 +76,8 @@ const TreeSelect = forwardRef<TreeSelectRefType, TreeSelectProps>((originalProps
7576 onEnter,
7677 } = props ;
7778
79+ const showLoading = ! disabled && loading ;
80+
7881 const selectInputProps = useTreeSelectPassThroughProps ( props ) ;
7982 const [ value , onChange ] = useControlled ( props , 'value' , props . onChange ) ;
8083 const [ popupVisible , setPopupVisible ] = useControlled ( props , 'popupVisible' , props . onPopupVisibleChange ) ;
@@ -143,11 +146,7 @@ const TreeSelect = forwardRef<TreeSelectRefType, TreeSelectProps>((originalProps
143146 // eslint-disable-next-line react-hooks/exhaustive-deps
144147 } , [ normalizeValue , value , data ] ) ;
145148
146- const internalInputValue = useMemo ( ( ) => {
147- if ( multiple ) return normalizedValue ;
148- // 可筛选、单选、弹框时内容为过滤值
149- return filterable && popupVisible ? filterInput : normalizedValue [ 0 ] || '' ;
150- } , [ multiple , normalizedValue , filterable , popupVisible , filterInput ] ) ;
149+ const internalValue = useMemo ( ( ) => ( multiple ? normalizedValue : normalizedValue [ 0 ] ) , [ multiple , normalizedValue ] ) ;
151150
152151 // @ts -ignore TODO: remove it
153152 const normalizedValueDisplay : SelectInputProps [ 'valueDisplay' ] = useMemo ( ( ) => {
@@ -164,30 +163,6 @@ const TreeSelect = forwardRef<TreeSelectRefType, TreeSelectProps>((originalProps
164163 return normalizedValue . length ? displayNode : '' ;
165164 } , [ valueDisplay , multiple , normalizedValue ] ) ;
166165
167- const internalInputValueDisplay : SelectInputProps [ 'valueDisplay' ] = useMemo ( ( ) => {
168- // 只有单选且下拉展开时需要隐藏 valueDisplay
169- if ( filterable && ! multiple && popupVisible ) {
170- return undefined ;
171- }
172- return normalizedValueDisplay ;
173- } , [ filterable , popupVisible , multiple , normalizedValueDisplay ] ) ;
174-
175- const inputPlaceholder = useMemo ( ( ) => {
176- // 可筛选、单选、弹框且有值时提示当前值
177- if ( filterable && ! multiple && popupVisible && normalizedValue . length ) {
178- // 设置了 valueDisplay 时,优先展示 valueDisplay
179- const valueDisplayPlaceholder = normalizedValueDisplay ;
180- if ( typeof valueDisplayPlaceholder === 'string' ) {
181- return valueDisplayPlaceholder ;
182- }
183-
184- return typeof normalizedValue [ 0 ] . label === 'string' ? normalizedValue [ 0 ] . label : String ( normalizedValue [ 0 ] . value ) ;
185- }
186- return placeholder ;
187- } , [ filterable , multiple , popupVisible , normalizedValue , placeholder , normalizedValueDisplay ] ) ;
188-
189- const showLoading = ! disabled && loading ;
190-
191166 /* ---------------------------------handler---------------------------------------- */
192167
193168 const handleFilter = useCallback < TreeProps [ 'filter' ] > (
@@ -243,7 +218,7 @@ const TreeSelect = forwardRef<TreeSelectRefType, TreeSelectProps>((originalProps
243218 const { index, e, trigger } = ctx ;
244219 const node = getNodeItem ( normalizedValue [ index ] . value ) ;
245220 onChange (
246- normalizedValue . filter ( ( value , i ) => i !== index ) . map ( ( { value, label } ) => formatValue ( value , label ) ) ,
221+ normalizedValue . filter ( ( _ , i ) => i !== index ) . map ( ( { value, label } ) => formatValue ( value , label ) ) ,
247222 { node, data : node ?. data , trigger, e } ,
248223 ) ;
249224 onRemove ?.( {
@@ -328,13 +303,13 @@ const TreeSelect = forwardRef<TreeSelectRefType, TreeSelectProps>((originalProps
328303 { ...selectInputProps }
329304 ref = { selectInputRef }
330305 className = { classNames ( `${ classPrefix } -tree-select` , className ) }
331- value = { internalInputValue }
306+ value = { internalValue }
332307 inputValue = { filterInput }
333308 panel = { renderTree ( ) }
334309 allowInput = { filterable }
335310 inputProps = { { ...inputProps , size } }
336311 tagInputProps = { { size, excessTagsDisplayType : 'break-line' , inputProps, tagProps : props . tagProps } }
337- placeholder = { inputPlaceholder }
312+ placeholder = { placeholder }
338313 popupVisible = { popupVisible && ! disabled }
339314 onInputChange = { handleFilterChange }
340315 onPopupVisibleChange = { onInnerPopupVisibleChange }
@@ -353,7 +328,7 @@ const TreeSelect = forwardRef<TreeSelectRefType, TreeSelectProps>((originalProps
353328 }
354329 collapsedItems = { collapsedItems }
355330 label = { parseTNode ( label || prefixIcon ) }
356- valueDisplay = { internalInputValueDisplay }
331+ valueDisplay = { normalizedValueDisplay }
357332 />
358333 ) ;
359334} ) ;
0 commit comments