antd ant design vue 树形控件 check 具体详解

Ant design vue pro 树形控件操作

​ 下面是我的树形控件使用的地方

 <a-tree
            v-if="treeData && treeData.value && treeData.value.length"
            :checkedKeys="modelRef.menuIds"
            :replace-fields="{ children: 'children', title: 'label', key: 'id', value: 'id' }"   //这里设置节点名字和节点参数
            :defaultCheckedKeys="modelRef.menuIds"
            :defaultExpandedKeys="modelRef.menuIds"
            :tree-data="treeData.value"
            @check="onCheck"  //因为设置了checkable 所以是带选中状态 选中就会触发check
            checkable
          />

在使用过程中发现了一个问题,就是树形控件他如果加了chenkable 他的父子节点关联就会失效,比如向下图,我如果只选中了菜单管理和行政区管理,传参数的话是没有传系统管理父节点的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NUNQGYjt-1627982630610)(C:\Users\Mango\AppData\Roaming\Typora\typora-user-images\image-20210803171732638.png)]

所以需要解决这个问题 ,在选中的同时,组件第二个参数里有半勾选状态的参数集合,只需要把已勾选和半勾选的连接起来,就是全部需要传的参数,这里需要注意一下,不要将v-model绑定的id直接接手连接的数组,因为这样会导致所有的选中框选中,建议先存起来,提交时候做处理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g3SkoVFb-1627982630613)(C:\Users\Mango\AppData\Roaming\Typora\typora-user-images\image-20210803171849598.png)]

提交解决了,然后回显发现了问题,如果又父节点,他会直接把子节点全部选中,不给你一点解释的机会,也是头疼了半天,最后发现一招有效的解决办法,讲回显的父节点全部删除,只留子节点,这样就完美实现了功能

        for(let i in data){
          console.log(data[i]);
          if(listin.includes(data[i])){
            delete data[i]
          }
        }
        modelRef.menuIds = data || []

modelRef.menuIds = data || []


以下是使用 TypeScript 实现 Ant Design 树形控件的可查找功能的示例代码: ```typescript import React, { useState } from 'react'; import { Tree, Input } from 'antd'; import { SearchOutlined } from '@ant-design/icons'; import { DataNode } from 'antd/lib/tree'; const { TreeNode } = Tree; const { Search } = Input; interface TreeProps { treeData: DataNode[]; } const SearchableTree: React.FC<TreeProps> = ({ treeData }) => { const [expandedKeys, setExpandedKeys] = useState<string[]>([]); const [searchValue, setSearchValue] = useState<string>(''); const [autoExpandParent, setAutoExpandParent] = useState<boolean>(true); const onExpand = (keys: string[]) => { setExpandedKeys(keys); setAutoExpandParent(false); }; const getParentKey = (key: string, tree: DataNode[]): string | undefined => { let parentKey; for (const node of tree) { if (node.children) { if (node.children.some((item) => item.key === key)) { parentKey = node.key; } else if (getParentKey(key, node.children)) { parentKey = getParentKey(key, node.children); } } } return parentKey; }; const generateTreeNodes = (data: DataNode[]): React.ReactNode[] => data.map((item) => { const { key, title, children } = item; const itemTitle = ( <span> {title} {key === searchValue && ( <span style={{ color: 'blue', marginLeft: '5px' }}> (found)</span> )} </span> ); if (children) { return ( <TreeNode key={key} title={itemTitle}> {generateTreeNodes(children)} </TreeNode> ); } return <TreeNode key={key} title={itemTitle} />; }); const onSearch = (e: React.ChangeEvent<HTMLInputElement>) => { const { value } = e.target; const expandedKeys: string[] = []; const loop = (data: DataNode[]) => { data.forEach((item) => { if (item.title?.toString().indexOf(value) > -1) { const parentKey = getParentKey(item.key, treeData); if (parentKey) { expandedKeys.push(parentKey); } } if (item.children) { loop(item.children); } }); }; loop(treeData); setSearchValue(value); setExpandedKeys(expandedKeys); setAutoExpandParent(true); }; return ( <div> <Search placeholder="Search" allowClear prefix={<SearchOutlined />} onChange={onSearch} style={{ width: '100%', marginBottom: '1rem' }} /> <Tree onExpand={onExpand} expandedKeys={expandedKeys} autoExpandParent={autoExpandParent} treeData={generateTreeNodes(treeData)} /> </div> ); }; export default SearchableTree; ``` 这个组件接收一个 `treeData` 属性,表示树形控件的数据源。在组件内部,使用 `useState` 定义了一些状态: - `expandedKeys`: 当前展开的节点 key 数组。 - `searchValue`: 当前搜索框的值。 - `autoExpandParent`: 是否自动展开父节点。 - `setExpandedKeys`: 更新 `expandedKeys` 状态的函数。 - `setSearchValue`: 更新 `searchValue` 状态的函数。 - `setAutoExpandParent`: 更新 `autoExpandParent` 状态的函数。 当用户在搜索框输入内容时,会触发 `onSearch` 函数。这个函数会遍历树形控件的数据源,查找所有包含搜索关键字的节点,并将它们的父节点展开。最后,更新 `expandedKeys` 和 `autoExpandParent` 状态,以便重新渲染树形控件。 在渲染树形控件时,使用 `generateTreeNodes` 函数递归生成每个节点的 UI。对于包含搜索关键字的节点,会在标题后面添加一个 “(found)” 的文本,用蓝色字体标识。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mangoxin1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值