当前位置: 首页 > news >正文

福建网站建设价格wordpress+小米商城

福建网站建设价格,wordpress+小米商城,网站建设 服务内容,杭州旅游 网站建设功能点: 点击节点前的箭头,可以手动展开或折叠该节点的子节点。在搜索框中输入关键词,匹配的节点及其父节点会自动展开。清空搜索框后,恢复到用户手动控制的展开状态。勾选节点时仍然遵守 "最多勾选 6 个节点" 和 &quo…

 功能点:

  • 点击节点前的箭头,可以手动展开或折叠该节点的子节点。
  • 在搜索框中输入关键词,匹配的节点及其父节点会自动展开。
  • 清空搜索框后,恢复到用户手动控制的展开状态。
  • 勾选节点时仍然遵守 "最多勾选 6 个节点" 和 "只能选择同级节点" 的限制。
import { Transfer, Tree, Input, message } from 'antd';
import React, { useState } from 'react';// 判断是否已选中
const isChecked = (selectedKeys, eventKey) => selectedKeys.includes(eventKey);// 生成树结构,并标记禁用状态
const generateTree = (treeNodes = [], checkedKeys = []) =>treeNodes.map(({ children, ...props }) => ({...props,disabled: checkedKeys.includes(props.key),children: generateTree(children, checkedKeys),}));// 搜索功能:过滤树节点并展开到匹配节点
const filterTreeData = (treeData, searchValue) => {const loop = (data) =>data.map((item) => {const match = item.title.toLowerCase().includes(searchValue.toLowerCase());const children = item.children ? loop(item.children) : [];return {...item,children,isMatch: match || children.some((child) => child.isMatch),};}).filter((item) => item.isMatch);return loop(treeData);
};// 自定义 TreeTransfer 组件
const TreeTransfer = ({ dataSource, targetKeys, ...restProps }) => {const transferDataSource = [];const [searchValue, setSearchValue] = useState('');const [expandedKeys, setExpandedKeys] = useState([]); // 控制展开的节点// 展平树结构为一维数组function flatten(list = []) {list.forEach((item) => {transferDataSource.push(item);flatten(item.children);});}flatten(dataSource);// 动态计算需要展开的节点(用于搜索)const calculateExpandedKeys = (treeData) => {const keys = [];const loop = (data) =>data.forEach((item) => {if (item.isMatch) {keys.push(item.key);if (item.children) loop(item.children);}});loop(treeData);return keys;};// 过滤后的树数据const filteredTreeData = filterTreeData(dataSource, searchValue);const autoExpandedKeys = calculateExpandedKeys(filteredTreeData);// 更新展开状态const handleExpand = (newExpandedKeys) => {setExpandedKeys(newExpandedKeys);};return (<Transfer{...restProps}targetKeys={targetKeys}dataSource={transferDataSource}className="tree-transfer"render={(item) => item.title}showSelectAll={false}>{({ direction, onItemSelect, selectedKeys }) => {if (direction === 'left') {const checkedKeys = [...selectedKeys, ...targetKeys];return (<>{/* 搜索框 */}<Inputplaceholder="搜索节点"value={searchValue}onChange={(e) => {setSearchValue(e.target.value);setExpandedKeys(autoExpandedKeys); // 搜索时自动展开匹配节点}}style={{ marginBottom: 16 }}/><TreeblockNodecheckablecheckStrictlydefaultExpandAllcheckedKeys={checkedKeys}treeData={filteredTreeData}expandedKeys={searchValue ? autoExpandedKeys : expandedKeys} // 根据搜索状态决定展开哪些节点onExpand={handleExpand} // 手动控制展开/折叠onCheck={(_, { node }) => {const { key, parentKey } = node;// 检查是否在同一层级const isSameLevel = checkedKeys.every((k) => {const checkedNode = transferDataSource.find((item) => item.key === k);return !checkedNode || checkedNode.parentKey === parentKey;});// 检查是否超过最大勾选数量限制const isWithinLimit = checkedKeys.length < 6 || checkedKeys.includes(key);if (isSameLevel && isWithinLimit) {onItemSelect(key, !isChecked(checkedKeys, key));} else {message.warn(!isSameLevel? '只能选择同级节点': '最多只能同时勾选 6 个节点');}}}onSelect={(_, { node }) => {const { key, parentKey } = node;// 检查是否在同一层级const isSameLevel = checkedKeys.every((k) => {const checkedNode = transferDataSource.find((item) => item.key === k);return !checkedNode || checkedNode.parentKey === parentKey;});// 检查是否超过最大勾选数量限制const isWithinLimit = checkedKeys.length < 6 || checkedKeys.includes(key);if (isSameLevel && isWithinLimit) {onItemSelect(key, !isChecked(checkedKeys, key));} else {message.warn(!isSameLevel? '只能选择同级节点': '最多只能同时勾选 6 个节点');}}}/></>);}}}</Transfer>);
};// 测试数据
const treeData = [{key: '0-0',title: 'Node 0-0',parentKey: null, // 根节点没有父节点},{key: '0-1',title: 'Node 0-1',parentKey: null,children: [{key: '0-1-0',title: 'Node 0-1-0',parentKey: '0-1', // 父节点是 '0-1'},{key: '0-1-1',title: 'Node 0-1-1',parentKey: '0-1', // 父节点是 '0-1'},],},{key: '0-2',title: 'Node 0-3',parentKey: null,},
];// 主应用组件
const App = () => {const [targetKeys, setTargetKeys] = useState([]);const onChange = (keys) => {setTargetKeys(keys);};return <TreeTransfer dataSource={treeData} targetKeys={targetKeys} onChange={onChange} />;
};export default App;

http://www.dtcms.com/a/566380.html

相关文章:

  • 京东 jd.item_review API 返回值全面解析​​
  • 深圳网站优化企业北京师大互联网公司排名
  • 运动模糊图像的处理
  • OpenGauss数据库闪回恢复基本功能
  • 【ICCV 2025】Bridging the Skeleton-Text Modality Gap:扩散模型驱动零样本骨架动作识别
  • 电子设计中的“握手信号”:深入浅出理解DCDC的PG引脚与软启动
  • dedecms 图片网站模板烘焙甜点培训学校
  • 怎么用手机建设网站dede做双语网站
  • yapi文档系统
  • MySQL 高可用(HA)参考架构:Oracle 官方指引(适配 Dev/Test/ 核心 Prod)与停机风险应对
  • 宜州做网站网站服务器失去响应
  • 手机怎么网站模板网站建设宗旨是什么
  • 系统性学习C++-第九讲-list类
  • 沈阳市网站制作浙江省2011年1月高等教育自学考试 网站建设与管理试题与答案
  • 基于 Qwen2.5-1.5B-Instruct 的商品信息抽取实践(附完整代码)
  • 免费行情软件网站大全西宁休闲娱乐场所
  • 基于Java开发的AMHS天车调度系统技术可行性评估以及相关示例
  • 做彩票网站能挣到钱吗?西安优秀的集团门户网站建设服务商
  • 小说网站怎么做app替换wordpress logo
  • 界面控件DevExpress WPF v25.1新版亮点:AI功能的全面升级
  • 建站快车品牌网站菜单代码
  • 药品加工厂做网站临县网站建设
  • 手机网站 微信网站 区别用国外网站 图片做自媒体
  • 网站建设万首先金手指12php做网站需要后台吗
  • 网站设计申请书学院网站建设情况
  • Redis(二)——数据类型二
  • 知名网站开发公司永州网站推广
  • 营销型网站标准网页源码wordpress去掉页眉
  • 少儿编程全路线学习规划:从 AI 机器人到 C++,分龄分阶段的科学进阶指南
  • 【C++】红黑树详解(2w字详解)