Commit e00578c40a585a4a35f235c0228aebaf62cea1ba
Committed by
GitHub
1 parent
6717fe65
feat(tree): 1. 添加自定义数据过滤判断方法 2. 添加搜索完成自动展开结果选项 3. 添加搜索完成自动选中结果选项 4. 树节点数据变化时强制搜索…
…(同步searchData避免展示错误) (#1132)
Showing
2 changed files
with
38 additions
and
3 deletions
src/components/Tree/src/Tree.vue
... | ... | @@ -211,16 +211,32 @@ |
211 | 211 | searchState.startSearch = false; |
212 | 212 | return; |
213 | 213 | } |
214 | + const { filterFn, checkable, expandOnSearch, checkOnSearch } = unref(props); | |
214 | 215 | searchState.startSearch = true; |
215 | - const { title: titleField } = unref(getReplaceFields); | |
216 | + const { title: titleField, key: keyField } = unref(getReplaceFields); | |
216 | 217 | |
218 | + const searchKeys: string[] = []; | |
217 | 219 | searchState.searchData = filter( |
218 | 220 | unref(treeDataRef), |
219 | 221 | (node) => { |
220 | - return node[titleField]?.includes(searchValue) ?? false; | |
222 | + const result = filterFn | |
223 | + ? filterFn(searchValue, node, unref(getReplaceFields)) | |
224 | + : node[titleField]?.includes(searchValue) ?? false; | |
225 | + if (result) { | |
226 | + searchKeys.push(node[keyField]); | |
227 | + } | |
228 | + return result; | |
221 | 229 | }, |
222 | 230 | unref(getReplaceFields), |
223 | 231 | ); |
232 | + | |
233 | + if (expandOnSearch && searchKeys.length > 0) { | |
234 | + setExpandedKeys(searchKeys); | |
235 | + } | |
236 | + | |
237 | + if (checkOnSearch && checkable && searchKeys.length > 0) { | |
238 | + setCheckedKeys(searchKeys); | |
239 | + } | |
224 | 240 | } |
225 | 241 | |
226 | 242 | function handleClickNode(key: string, children: TreeItem[]) { |
... | ... | @@ -239,6 +255,7 @@ |
239 | 255 | |
240 | 256 | watchEffect(() => { |
241 | 257 | treeDataRef.value = props.treeData as TreeItem[]; |
258 | + handleSearch(unref(searchText)); | |
242 | 259 | }); |
243 | 260 | |
244 | 261 | onMounted(() => { | ... | ... |
src/components/Tree/src/props.ts
1 | 1 | import type { PropType } from 'vue'; |
2 | -import type { ReplaceFields, ActionItem, Keys, CheckKeys, ContextMenuOptions } from './typing'; | |
2 | +import type { | |
3 | + ReplaceFields, | |
4 | + ActionItem, | |
5 | + Keys, | |
6 | + CheckKeys, | |
7 | + ContextMenuOptions, | |
8 | + TreeItem, | |
9 | +} from './typing'; | |
3 | 10 | import type { ContextMenuItem } from '/@/hooks/web/useContextMenu'; |
4 | 11 | import type { TreeDataItem } from 'ant-design-vue/es/tree/Tree'; |
5 | 12 | import { propTypes } from '/@/utils/propTypes'; |
... | ... | @@ -66,6 +73,17 @@ export const basicProps = { |
66 | 73 | rightMenuList: { |
67 | 74 | type: Array as PropType<ContextMenuItem[]>, |
68 | 75 | }, |
76 | + // 自定义数据过滤判断方法(注: 不是整个过滤方法,而是内置过滤的判断方法,用于增强原本仅能通过title进行过滤的方式) | |
77 | + filterFn: { | |
78 | + type: Function as PropType< | |
79 | + (searchValue: any, node: TreeItem, replaceFields: ReplaceFields) => boolean | |
80 | + >, | |
81 | + default: null, | |
82 | + }, | |
83 | + // 搜索完成时自动展开结果 | |
84 | + expandOnSearch: propTypes.bool.def(false), | |
85 | + // 搜索完成自动选中所有结果,当且仅当 checkable===true 时生效 | |
86 | + checkOnSearch: propTypes.bool.def(false), | |
69 | 87 | }; |
70 | 88 | |
71 | 89 | export const treeNodeProps = { | ... | ... |