@@ -8,7 +8,7 @@ import { Popup } from 'tdesign-mobile-react/popup';
8
8
import { Radio , RadioGroup } from 'tdesign-mobile-react/radio' ;
9
9
import Tabs from 'tdesign-mobile-react/tabs' ;
10
10
import TabContext from 'tdesign-mobile-react/tabs/context' ;
11
- import { StyledProps , TNode , TreeKeysType , TreeOptionData } from '../common' ;
11
+ import { StyledProps , TNode , TreeOptionData } from '../common' ;
12
12
import { usePrefixClass } from '../hooks/useClass' ;
13
13
import useDefaultProps from '../hooks/useDefaultProps' ;
14
14
import { cascaderDefaultProps } from './defaultProps' ;
@@ -41,6 +41,8 @@ const Cascader = forwardRef<HTMLDivElement, CascaderProps>((props) => {
41
41
subTitles,
42
42
options : inputOptions ,
43
43
keys,
44
+ checkStrictly,
45
+ closeBtn,
44
46
onChange,
45
47
onClose,
46
48
onPick,
@@ -53,8 +55,7 @@ const Cascader = forwardRef<HTMLDivElement, CascaderProps>((props) => {
53
55
54
56
// 根据 inputOptions 和 key 重新构建 options
55
57
const options = useMemo ( ( ) => {
56
- // TODO: keys 的类型 不对
57
- const { label = 'label' , value = 'value' , children = 'children' } = ( keys || { } ) as TreeKeysType ;
58
+ const { label = 'label' , value = 'value' , children = 'children' } = keys || { } ;
58
59
59
60
const convert = ( options : TreeOptionData [ ] ) =>
60
61
options . map ( ( item ) => ( {
@@ -115,9 +116,16 @@ const Cascader = forwardRef<HTMLDivElement, CascaderProps>((props) => {
115
116
} , [ optionsList , internalSelectedValues , placeholder ] ) ;
116
117
117
118
const selectedValuesByInterValue = useMemo ( ( ) => {
118
- // 最后一级的value为匹配时,返回整个链路上的value
119
+ /**
120
+ * checkStrictly true 从外到内 匹配上就挺 返回整个链路上的value
121
+ * checkStrictly false 最后一级的 value 匹配时,返回整个链路上的value
122
+ */
119
123
const findValues = ( options : TreeOptionData [ ] ) : CascaderProps [ 'value' ] [ ] => {
120
124
for ( const item of options ) {
125
+ if ( checkStrictly && item . value === internalValue ) {
126
+ return [ item . value ] ;
127
+ }
128
+
121
129
const isLast = ! ( Array . isArray ( item . children ) && item . children . length ) ;
122
130
if ( isLast ) {
123
131
if ( item . value === internalValue ) {
@@ -134,7 +142,7 @@ const Cascader = forwardRef<HTMLDivElement, CascaderProps>((props) => {
134
142
} ;
135
143
136
144
return findValues ( options ) ;
137
- } , [ options , internalValue ] ) ;
145
+ } , [ options , internalValue , checkStrictly ] ) ;
138
146
139
147
// 当 selectedValuesByInterValue 深度变化 的时候再控制 selectedValues
140
148
useDeepCompareEffect ( ( ) => {
@@ -149,6 +157,23 @@ const Cascader = forwardRef<HTMLDivElement, CascaderProps>((props) => {
149
157
}
150
158
} , [ optionsList , stepIndex ] ) ;
151
159
160
+ // 结束了
161
+ const onFinish = useCallback (
162
+ ( selectedValues : CascaderProps [ 'value' ] [ ] ) => {
163
+ const selectedOptions = [ ...optionsList ] . slice ( 0 , selectedValues . length ) . map ( ( options , index ) => {
164
+ const target = options . find ( ( item ) => item . value === selectedValues [ index ] ) ;
165
+ const { label = 'label' , value = 'value' } = keys || { } ;
166
+ return {
167
+ [ label ] : target ?. label || '' ,
168
+ [ value ] : target ?. value || '' ,
169
+ } ;
170
+ } ) ;
171
+ setInternalValue ( last ( selectedValues ) , selectedOptions as any ) ;
172
+ onClose ?.( 'finish' ) ;
173
+ } ,
174
+ [ onClose , optionsList , setInternalValue , keys ] ,
175
+ ) ;
176
+
152
177
return (
153
178
< Popup
154
179
visible = { internalVisible }
@@ -163,11 +188,16 @@ const Cascader = forwardRef<HTMLDivElement, CascaderProps>((props) => {
163
188
< div
164
189
className = { `${ cascaderClass } __close-btn` }
165
190
onClick = { ( ) => {
191
+ if ( checkStrictly ) {
192
+ onFinish ( internalSelectedValues ) ;
193
+ return ;
194
+ }
195
+
166
196
setInternalVisible ( false ) ;
167
197
onClose ?.( 'close-btn' ) ;
168
198
} }
169
199
>
170
- < Icon name = "close" size = { 24 } />
200
+ { closeBtn === true ? < Icon name = "close" size = { 24 } /> : closeBtn }
171
201
</ div >
172
202
< div className = { `${ cascaderClass } __content` } >
173
203
{ labelList . length ? (
@@ -248,23 +278,7 @@ const Cascader = forwardRef<HTMLDivElement, CascaderProps>((props) => {
248
278
return ;
249
279
}
250
280
251
- // 结束了
252
- const selectedOptions = optionsList . map ( ( options , index ) => {
253
- const target = options . find ( ( item ) => item . value === selectedValues [ index ] ) ;
254
- const {
255
- label = 'label' ,
256
- value = 'value' ,
257
- children = 'children' ,
258
- } = ( keys || { } ) as TreeKeysType ;
259
- return {
260
- [ label ] : target ?. label || '' ,
261
- [ value ] : target ?. value || '' ,
262
- [ children ] : target ?. children ,
263
- } ;
264
- } ) ;
265
- // TODO onChange 的 selectedOptions 类型不对
266
- setInternalValue ( value , selectedOptions as any ) ;
267
- onClose ?.( 'finish' ) ;
281
+ onFinish ( selectedValues ) ;
268
282
} }
269
283
>
270
284
{ curOptions . map ( ( item ) => (
0 commit comments