|
1 | 1 | import { cloneDeep, isFunction, isNumber } from 'lodash-es'; |
2 | 2 | import { pathToKey } from '@tdesign/common-js/tree-v1/tree-node-model'; |
3 | 3 |
|
| 4 | +import { preserveSelectionOrder } from '../../_util/helper'; |
4 | 5 | import { getFullPathLabel, getTreeValue } from './helper'; |
5 | 6 |
|
6 | 7 | import type { CascaderContextType, TdCascaderProps, TreeNode, TreeNodeModel, TreeNodeValue } from '../interface'; |
@@ -81,7 +82,8 @@ export function expendClickEffect( |
81 | 82 | * @returns |
82 | 83 | */ |
83 | 84 | export function valueChangeEffect(node: TreeNode, cascaderContext: CascaderContextType) { |
84 | | - const { disabled, max, inputVal, multiple, setVisible, setValue, treeNodes, treeStore, valueType } = cascaderContext; |
| 85 | + const { disabled, max, inputVal, multiple, setVisible, setValue, treeNodes, treeStore, value, valueType } = |
| 86 | + cascaderContext; |
85 | 87 |
|
86 | 88 | if (!node || disabled || node.disabled) { |
87 | 89 | return; |
@@ -114,11 +116,20 @@ export function valueChangeEffect(node: TreeNode, cascaderContext: CascaderConte |
114 | 116 | setVisible(false, {}); |
115 | 117 | } |
116 | 118 |
|
| 119 | + const getPreviousKeys = (): TreeNodeValue[] => { |
| 120 | + if (!Array.isArray(value)) return []; |
| 121 | + if (valueType === 'full') { |
| 122 | + return (value as TreeNodeValue[][]).filter((path) => Array.isArray(path) && path.length > 0).map(pathToKey); |
| 123 | + } |
| 124 | + return value as TreeNodeValue[]; |
| 125 | + }; |
| 126 | + const orderedChecked = preserveSelectionOrder(getPreviousKeys(), checked); |
| 127 | + |
117 | 128 | // 处理不同数据类型 |
118 | 129 | const resValue = |
119 | 130 | valueType === 'single' |
120 | | - ? checked |
121 | | - : checked.map((val) => |
| 131 | + ? orderedChecked |
| 132 | + : orderedChecked.map((val) => |
122 | 133 | treeStore |
123 | 134 | .getNode(val) |
124 | 135 | .getPath() |
@@ -160,26 +171,15 @@ export function handleRemoveTagEffect( |
160 | 171 | index: number, |
161 | 172 | onRemove: TdCascaderProps['onRemove'], |
162 | 173 | ) { |
163 | | - const { disabled, setValue, value, valueType, treeStore } = cascaderContext; |
| 174 | + const { disabled, setValue, value, treeStore } = cascaderContext; |
164 | 175 |
|
165 | 176 | if (disabled) return; |
166 | 177 | const newValue = cloneDeep(value) as []; |
167 | 178 | const res = newValue.splice(index, 1); |
168 | 179 | const node = treeStore.getNodes(res[0])[0]; |
169 | 180 | const checked = node.setChecked(!node.isChecked()); |
170 | 181 |
|
171 | | - if (valueType === 'single') { |
172 | | - setValue(newValue, 'uncheck', node.getModel()); |
173 | | - } else { |
174 | | - // 处理不同数据类型 |
175 | | - const resValue = checked.map((val) => |
176 | | - treeStore |
177 | | - .getNode(val) |
178 | | - .getPath() |
179 | | - .map((item) => item.value), |
180 | | - ); |
181 | | - setValue(resValue, 'uncheck', node.getModel()); |
182 | | - } |
| 182 | + setValue(newValue, 'uncheck', node.getModel()); |
183 | 183 |
|
184 | 184 | if (isFunction(onRemove)) { |
185 | 185 | onRemove({ value: checked, node: node as any }); |
|
0 commit comments