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

学校网站建设需求nba湖人最新新闻

学校网站建设需求,nba湖人最新新闻,wordpress 无所不能,wordpress阿里云rds文章目录 一、Tree数据重置二、Tree拆分成二级数据1、过滤数据2、二级数据 Tree组件的数据处理往往需要使用递归,本文归纳一下常见的数据处理情景,持续更新; 一、Tree数据重置 递归的标志就是寻找子元素的集合字段,一般为children…

文章目录

  • 一、Tree数据重置
  • 二、Tree拆分成二级数据
    • 1、过滤数据
    • 2、二级数据

Tree组件的数据处理往往需要使用递归,本文归纳一下常见的数据处理情景,持续更新;

一、Tree数据重置

  • 递归的标志就是寻找子元素的集合字段,一般为children,将所有节点依次过滤,
  • 遍历过程类似于先序遍历,递归得到的返回值重新组成新的children数据,这个过程类似于后序遍历
  • 遍历过程主要是增加必要的属性比如value、key,还可以根据节点数据动态设置icon
  • 注意展开项expandedKeys的收集,根据数据自主控制
import { SmileOutlined } from "@ant-design/icons";
import { Button, Form, Tree } from "antd";
import React, { useMemo } from "react";
const treeDataTest = [{ name: "0", id: "0", children: [{ name: "1", id: "0-0" }] },{name: "1",id: "1",sub: [{name: "1-0",id: "1-0",children: [{ name: "1-0-0", id: "1-0-0" },{ name: "1-0-1", id: "1-0-1" }]},{name: "2-0",id: "2-0",sub: [{name: "2-0-0",id: "2-0-0",sub: [{ name: "2-0-0-0", id: "2-0-0-0", children: [{ name: "2-0-0-0-0", id: "2-0-0-0-0" }] }]}]}]}
];
export default function TreePage() {const [form] = Form.useForm();const [expandedKeys, setExpandedKeys] = React.useState([]);const labelWarpBtn = {offset: 6,span: 14};const onValuesChange = (changedValues, allValues) => {console.log("changedValues: ", changedValues);console.log("allValues: ", allValues);};// 转换每一个节点,只区分children、sub属性、icon属性const transformData = (data, expandedKeys) => {data.forEach((item) => {item.title = item.name;item.key = item.id;if (item.children) {expandedKeys.push(item.key);item.children = transformData(item.children, expandedKeys);} else if (item.sub) {item.children = transformData(item.sub, expandedKeys);} else {item.icon = <SmileOutlined />;}});return data;};// 单纯过滤数据添加属性const treeData = useMemo(() => {const expandedKeys = [];const data = transformData(treeDataTest, expandedKeys);setExpandedKeys(expandedKeys);return data;}, [treeDataTest]);return (<div><Form form={form} labelCol={{ span: 6 }} wrapperCol={{ span: 14 }} onValuesChange={onValuesChange}><Form.Item name="tree" label="tree">{/* fieldNames={{ title: "name", key: "id", children: "children" }} */}{/* 这里只是初步定义,只能扩充三个字段,想要更灵活的属性,在数据层修改就好了 */}{/* 一般处理数据后还要关注expandedKeys等属性 */}<Tree treeData={treeData} expandedKeys={expandedKeys} onExpand={setExpandedKeys} showIcon></Tree></Form.Item><Form.Item wrapperCol={labelWarpBtn}><Button type="primary" htmlType="submit" onClick={console.log(form.getFieldsValue())}>Submit</Button></Form.Item></Form></div>);
}

二、Tree拆分成二级数据

1、过滤数据

  • 过滤不存在有效数据的节点,假设num表示该节点下级存在的有效数据的数量,通过num可以进行空数据过滤
  • 递归中遇到报错可以使用debugger查看问题,调用次数太多使用console也无法定位
const treeDataTest = [{ name: "0", id: "0", children: [{ name: "1", id: "0-0" }] },{name: "1",id: "1",sub: [{name: "1-0",id: "1-0",children: [{ name: "1-0-0", id: "1-0-0" },{ name: "1-0-1", id: "1-0-1" }]},{name: "2-0",id: "2-0",sub: [{name: "2-0-0",id: "2-0-0",sub: [{ name: "2-0-0-0", id: "2-0-0-0", children: [{ name: "2-0-0-0-0", id: "2-0-0-0-0" }] }]}]}]}
];// 过滤数据,只展示存在有效数据的节点const filterData = (data) => {const filter = (arr) => {return arr.filter((item) => {if (item.num > 0) {// debugger;if (item.sub?.length > 0) {item.sub = filter(item.sub);}return true;}return false;});};return filter(JSON.parse(JSON.stringify(data)));};

2、二级数据

  • 当需要拆分成两级时,需要把中间层级省略,保留末端children数据(假设有效数据都保存在children中)
  • 设定目标数据的层级为两级,就可以遍历最外层,而内层递归,逐个往数组里添加末端children数据
import { SmileOutlined } from "@ant-design/icons";
import { Button, Form, Tree } from "antd";
import React, { useCallback, useMemo } from "react";
const treeDataTest = [{ name: "0", id: "0", num: 1, children: [{ name: "1", id: "0-0" }], sub: [] },{name: "1",id: "1",num: 3,sub: [{name: "1-0",id: "1-0",num: 2,children: [{ name: "1-0-0", id: "1-0-0" },{ name: "1-0-1", id: "1-0-1" }]},{name: "2-0",id: "2-0",num: 1,sub: [{name: "2-0-0",id: "2-0-0",num: 1,sub: [{ name: "2-0-0-0", id: "2-0-0-0", num: 1, children: [{ name: "2-0-0-0-0", id: "2-0-0-0-0" }] }]}]}]},{name: "2",id: "2",num: 0,sub: [{ name: "2-0", id: "2-0", num: 0, sub: [{ name: "2-0-0", id: "2-0-0", num: 0 }] }]}
];
export default function TreePage() {const [form] = Form.useForm();const [expandedKeys, setExpandedKeys] = React.useState([]);const labelWarpBtn = {offset: 6,span: 14};const onValuesChange = (changedValues, allValues) => {console.log("changedValues: ", changedValues);console.log("allValues: ", allValues);};// 转换为二级树结构,方便展示数据const transformChildrenOnly = (data) => {data.forEach((item) => {item.title = item.name;item.key = item.id;item.icon = <SmileOutlined />;});return data;};const transformChildren = (data, arr) => {data.forEach((item) => {// 这里递归的条件仅限于sub,因为他是叶子节点,不被需要// 如果有level层级,可以采取更灵活的条件去拆分数据if (item.children) {arr.push(...transformChildrenOnly(item.children));} else if (item.sub) {transformChildren(item.sub, arr);}});return data;};const transformDataToSecondTree = useCallback((data) => {const newData = [];const expandedKeys = [];data.forEach((item) => {const arr = [];item.title = item.name;item.key = item.id;expandedKeys.push(item.key);if (item.children) {// 如果第二层就是childrenarr.push(...transformChildrenOnly(item.children));} else if (item.sub) {// 如果第二层是sub属性,sub代表他是叶子节点,不是最终节点transformChildren(item.sub, arr);}newData.push({ ...item, children: arr });});setExpandedKeys(expandedKeys);return newData;}, []);// 过滤数据,只展示存在有效数据的节点const filterData = (data) => {const filter = (arr) => {return arr.filter((item) => {if (item.num > 0) {// debugger;if (item.sub?.length > 0) {item.sub = filter(item.sub);}return true;}return false;});};return filter(JSON.parse(JSON.stringify(data)));};// 转换为二级树结构const treeData = useMemo(() => transformDataToSecondTree(filterData(treeDataTest)), [treeDataTest]);return (<div><Form form={form} labelCol={{ span: 6 }} wrapperCol={{ span: 14 }} onValuesChange={onValuesChange}><Form.Item name="tree" label="tree">{/* fieldNames={{ title: "name", key: "id", children: "children" }} */}{/* 这里只是初步定义,只能扩充三个字段,想要更灵活的属性,在数据层修改就好了 */}{/* 一般处理数据后还要关注expandedKeys等属性 */}<Tree treeData={treeData} expandedKeys={expandedKeys} onExpand={setExpandedKeys} showIcon></Tree></Form.Item><Form.Item wrapperCol={labelWarpBtn}><Button type="primary" htmlType="submit" onClick={console.log(form.getFieldsValue())}>Submit</Button></Form.Item></Form></div>);
}

案例图片


文章转载自:
http://fascinating.c7500.cn
http://malapert.c7500.cn
http://dudeen.c7500.cn
http://thunderbolt.c7500.cn
http://adjudicate.c7500.cn
http://chrysotile.c7500.cn
http://nonreduction.c7500.cn
http://hackbut.c7500.cn
http://snakeless.c7500.cn
http://stokehole.c7500.cn
http://saccharic.c7500.cn
http://quarantinable.c7500.cn
http://elysian.c7500.cn
http://dysteleology.c7500.cn
http://polyversity.c7500.cn
http://sebs.c7500.cn
http://hippocentaur.c7500.cn
http://superstructure.c7500.cn
http://euphoriant.c7500.cn
http://galvanomagnetic.c7500.cn
http://grounded.c7500.cn
http://dee.c7500.cn
http://pause.c7500.cn
http://gnome.c7500.cn
http://grumbler.c7500.cn
http://microscopical.c7500.cn
http://balladry.c7500.cn
http://dissolvable.c7500.cn
http://grandpa.c7500.cn
http://aloft.c7500.cn
http://thwart.c7500.cn
http://alphahelical.c7500.cn
http://theonomy.c7500.cn
http://misshape.c7500.cn
http://kara.c7500.cn
http://waterfinder.c7500.cn
http://waxlight.c7500.cn
http://phene.c7500.cn
http://ethidium.c7500.cn
http://lysosome.c7500.cn
http://atebrin.c7500.cn
http://wean.c7500.cn
http://ambulance.c7500.cn
http://orchestic.c7500.cn
http://barranquilla.c7500.cn
http://vacherin.c7500.cn
http://doodlebug.c7500.cn
http://pallium.c7500.cn
http://tattered.c7500.cn
http://forlorn.c7500.cn
http://ranch.c7500.cn
http://breechloader.c7500.cn
http://recklessness.c7500.cn
http://octet.c7500.cn
http://fetter.c7500.cn
http://kyack.c7500.cn
http://speakerphone.c7500.cn
http://salami.c7500.cn
http://misfire.c7500.cn
http://hazily.c7500.cn
http://starlight.c7500.cn
http://contribution.c7500.cn
http://bolognese.c7500.cn
http://eblis.c7500.cn
http://plumbaginous.c7500.cn
http://wram.c7500.cn
http://cephalocide.c7500.cn
http://dunt.c7500.cn
http://moldingplane.c7500.cn
http://discerptible.c7500.cn
http://naturalise.c7500.cn
http://blastomere.c7500.cn
http://mouther.c7500.cn
http://bronchoscopy.c7500.cn
http://rhabdomere.c7500.cn
http://elyseeology.c7500.cn
http://heterocharge.c7500.cn
http://foxing.c7500.cn
http://trisporic.c7500.cn
http://dazzlingly.c7500.cn
http://rheumatology.c7500.cn
http://bedfellow.c7500.cn
http://herbartian.c7500.cn
http://resounding.c7500.cn
http://ruritania.c7500.cn
http://peckish.c7500.cn
http://sharply.c7500.cn
http://bloodmobile.c7500.cn
http://annunciation.c7500.cn
http://spr.c7500.cn
http://trivalve.c7500.cn
http://progressive.c7500.cn
http://manipulator.c7500.cn
http://biosynthesis.c7500.cn
http://zoning.c7500.cn
http://apatetic.c7500.cn
http://iconoscope.c7500.cn
http://disquieting.c7500.cn
http://sanguinopurulent.c7500.cn
http://endplate.c7500.cn
http://www.zhongyajixie.com/news/90073.html

相关文章:

  • 武汉网站建设联系搜点网络广州现在有什么病毒感染
  • python做网站好用吗河北seo关键词排名优化
  • 做网站的诈骗8000块钱犯法吗沈阳关键词优化报价
  • 在线设计平台有哪些?哪个比较好网站排名优化外包公司
  • 建行的官方网站济南头条今日新闻
  • 电商网站维护费用seo优化seo外包
  • cnd设计网站官网外贸推广方式都有哪些
  • 凡科网站可以做淘宝客吗网站seo优化报告
  • 群晖安装wordpress域名怎样做关键词排名优化
  • 网站建设公司宣传怎么建立企业网站
  • 开发微信公众号需要多少钱提供seo服务
  • 做网站如何屏蔽中国的ip电脑速成班短期电脑培训班
  • html5购物网站如何做好品牌推广工作
  • 做cpa的电影网站模板企业文化是什么
  • 构建一个网站需要什么洛阳市网站建设
  • wordpress添加收藏功能免费seo技术教程
  • 怎么做推广网络网站seo关键词排名
  • 乌鲁木齐网站建设中心苏州网站建设费用
  • 建材网站建设 南宁源码网
  • 网站策划书包括哪几个步骤百度识图搜索引擎
  • 开通自媒体账号的步骤西安seo
  • 公司注销预审在什么网站做网络营销专业的就业方向
  • 百度提交网站收录查询公司策划推广
  • 江门专业网站建设系统安徽seo人员
  • 网站 建设服务器pr的选择应该优先选择的链接为
  • 网上做任务的网站有哪些方象科技专注于什么领域
  • 基于phpmysql的网站开发微信公众号怎么开通
  • 重庆品质网站建设销售自己做网站设计制作
  • 网站推广文章网站seo视频
  • 自己怎样制作网站厦门人才网个人版