React18-树形菜单-递归

文章目录

    • 案例分析
    • 技巧
    • 通信
    • 展示效果
    • 实现代码
      • 技巧点
      • 技巧点
    • Refer to

案例分析

https://github.com/dL-hx/manager-fe/commit/85faf3b1ae9a925513583feb02b9a1c87fb462f7

从接口获取城市数据,渲染出一个树形菜单
要求:
可以展开和收起

技巧

  1. 学会递归渲染出一个树形菜单, 并点击后可以展开和收起
  2. 通过对数据上添加控制字段(show)避免在子组件添加各种同步的useState,等字段.保证单向数据流向, 来简化问题.

通信

父子通信

展示效果

在这里插入图片描述

实现代码

在这里插入图片描述
在这里插入图片描述
src\views\TreeMenu\index.tsx

import TreeMenu from "./TreeMenu";
export default TreeMenu

技巧点

  1. 调用pulic/citydata.json数据
  2. 通过原数据添加show字段,递归处理.为每一个item添加show字段
  3. 当再次点击item选项时候,根据原数据上的show字段进行控制, 递归修改源数据对应的id(判断条件找到对应item, if (item.value === id) ).
    将其取反后setData
    对于接口源数据没有返回的ui控制字段,前端需要自己添加

因为是react, 对引用数据修改要注意需要生成新数据后在setData
src\views\TreeMenu\TreeMenu.tsx

import { Button } from "antd";
import { useState, useEffect } from "react";
import Tree from "./Tree";
export default function TreeMenu() {const [data, setData] = useState([])useEffect(() => {fetch('/citydata.json').then(res => res.json()).then(res => {setData(recursionAddProps(res))})}, [])// 当数据请求过来后,我们要递归式给每一个数据加一个属性,用来控制是否展开功能const recursionAddProps = (data) => {// 在item 上加一个属性// show: true 则展开,  false 折叠return data.map((item) => {item.show = false// 递归式自己调用自己if (item.children) {recursionAddProps(item.children)}return item})}/*** * @param data 源数据* @param id 点击的id选项* @returns */const recursionEditProps = (data, id) => {// 在item 上加一个属性// show: true 则展开,  false 折叠return data.map((item) => {if (item.value === id) { // 判断条件: 找到对应id在取反item.show = !item.show // 取反} // 递归式自己调用自己if (item.children) {recursionEditProps(item.children, id)}return item})}// 获取到子组件传递过来的数据const setShow = (child) => {// item.show = true// const newData = data.map((item) => {//     if (item['value'] === child.value) {//         // @ts-ignore//         item['show'] = !child.show//     }//     return item// })// setData(newData)// 需要递归处理这个show展开 // console.log(recursionEditProps(data, child.value));// 通过item-id,把数据中的show 改为truesetData(recursionEditProps(data, child.value))}return <div><Tree data={data} setShow={setShow}></Tree></div>
}

技巧点

  1. 递归调用自身
  2. 通过为父组件原数据添加show字段, 子组件修改父组件数据结构的show字段来控制,子组件是否展示
    因为是单向数据流, 数据控制视图, 通过递归完成

src\views\TreeMenu\Tree.tsx

import Tree from './Tree'export default ({ data, show=true, setShow }: any) => {console.log(data);return <ul style={{display: show? 'block': 'none'}}>{Array.isArray(data) && data.length && data.map(item => {return <li key={item.value} onClick={(event)=>{// 清除冒泡event.stopPropagation()setShow(item)}}>{item.value}{/* 递归组件 */}{item.children && item.children.length && <Tree data={item.children} show={item.show} setShow={setShow}/>}</li>})}</ul>
}

/public/citydata.json

[{"lable": "北京市","value": "北京市","children": [{"lable": "东城区","value": "东城区","children": [{"lable": "东城区-0","value": "东城区-0"},{"lable": "东城区-1","value": "东城区-1"},{"lable": "东城区-2","value": "东城区-2"}]},{"lable": "西城区-1","value": "西城区","children": [{"lable": "西城区-0","value": "西城区-0"},{"lable": "西城区-1","value": "西城区-1"},{"lable": "西城区-2","value": "西城区-2"}]},{"lable": "海淀区-2","value": "海淀区-2"}]},{"lable": "西安市","value": "西安市","children": [{"lable": "长安区-0","value": "长安区-0"},{"lable": "桥西区-1","value": "桥西区-1"},{"lable": "新华区-2","value": "新华区-2"}]},{"lable": "天津市","value": "天津市"}
]

Refer to

https://www.bilibili.com/video/BV19W4y1p7eu

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/239255.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

加密经济学:Web3时代的新经济模型

随着Web3技术的迅猛发展&#xff0c;我们正迈入一个全新的数字经济时代。加密经济学作为这一时代的核心&#xff0c;不仅在数字货币领域崭露头角&#xff0c;更是重新定义了传统经济模型&#xff0c;为我们开启了一个充满创新和机遇的新纪元。 1. 去中心化的经济体系 Web3时代…

MybatisPlus框架入门级理解

MybatisPlus 快速入门入门案例常见注解常用配置 核心功能条件构造器自定义SQLService接口 快速入门 入门案例 使用MybatisPlus的基本步骤&#xff1a; 1.引入MybatisPlus的起步依赖 MybatisPlus官方提供了starter&#xff0c;其中集成了Mybatis和MybatisPlus的所有功能&#…

接口测试用例设计 - 实战篇

一&#xff0e;接口测试流程 1&#xff0e;需求讨论 2&#xff0e;需求评审 3&#xff0e;场景设计 4&#xff0e;数据准备 5&#xff0e;执行 二&#xff0e;分析接口文档中哪些元素 1&#xff0e;接口名称 2&#xff0e;接口地址 3&#xff0e;支持格式 4&#xff0…

APM链路监控: Linux 部署 pinpoint

目录 一、实验 1.环境 2. 准备 3.HBase单机部署 4.pinpoint部署 二、问题 1.pinpoint有哪些功能 2.pinpoint架构是如何组成的 3.Linux中自带的jdk 如何设置JAVA_HOME 4. hbase启动报错 5.hbase的master启动失败 6.JPS命令如何安装和使用 一、实验 1.环境 &#x…

IPKISS ------ 远程服务器 IPKISS 内置示例安装问题

IPKISS ------ 远程服务器示例安装问题 引言正文 引言 很多时候&#xff0c;如果我们在服务器上使用管理员权限安装了 IPKISS 证书&#xff0c;而我们使用个人账号登录服务器时有时候会显示如下界面&#xff1a; 我们会看到这个 PyCharm (Luceda Academy) 是灰色的。那么该怎…

eclipse ADT安装及abap cds模版创建

文章目录 1.前提2.安装3.创建cds模版 abap cds 常用语法 https://blog.csdn.net/weixin_49198221/article/details/135531478?spm1001.2014.3001.5501 1.前提 需要了解版本关系: **1.eclipse:**2023-06 (4.28), 2023-09 (4.29), 2023-12 (4.30) 2.Windows: ​ 1.Windows …

短视频怎么截取gif动画?一个方法教你快速截取gif

电影、电视剧已经是我们日常生活中最常见最普遍的消遣娱乐方式了&#xff0c;当我们看到好看的画面想要截图里面的画面做成gif动画是应该如何制作gif动态图片&#xff08;https://www.gif.cn/&#xff09;呢&#xff1f;很简单&#xff0c;通过使用专业的gif在线制作工具&#…

VUE生命周期和生命周期四个阶段

Vue生命周期&#xff1a;一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个阶段&#xff1a;① 创建 ② 挂载 ③ 更新 ④ 销毁 vue的生命周期如图所示&#xff1a; Vue 生命周期函数&#xff08;钩子函数&#xff09;&#xff1a;Vue生命周期过程中&#xff0c;会自…

世微AP5160宽电压 LED 降压型恒流芯片14-18V 3A 电源PCB线路

这是一款14-18V 3A 电流的PCB设计方案. 运用的是世微AP5160 电源驱动IC,这是一款效率高&#xff0c;稳定可靠的 LED 灯恒流驱动控制芯片&#xff0c;内置高精度比较器&#xff0c;固定 关断时间控制电路&#xff0c;恒流驱动电路等&#xff0c;特别适合大功率 LED 恒流驱动。 …

Markdown 流程图绘制详解

✍️作者简介&#xff1a;小北编程&#xff08;专注于HarmonyOS、Android、Java、Web、TCP/IP等技术方向&#xff09; &#x1f433;博客主页&#xff1a; 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN &#x1f514;如果文章对您有一定的帮助请&#x1f…

Docker-数据卷网络

docker数据卷 docker volume ls #查看有哪些数据卷 docker volume inspect mysql-db #查看具体数据卷的元信息 docker container run -d --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORDTrue -v mysql-db:/var/lib/mysql mysql #会在docker 的卷下面新建一个mysqldb用于数据持久…

力扣hot100 杨辉三角 递归 DP

Problem: 118. 杨辉三角 文章目录 思路复杂度&#x1f496; DP&#x1f496; 从下往上递归 思路 &#x1f468;‍&#x1f3eb; 参考地址 复杂度 时间复杂度: 添加时间复杂度, 示例&#xff1a; O ( n ) O(n) O(n) 空间复杂度: 添加空间复杂度, 示例&#xff1a; O ( n ) …

Linux/Frolic

Enumeration nmap 还是扫描系统对外开放的端口情况&#xff0c;对外开放了22,139,445,还有9999端口&#xff0c;显示是http服务&#xff0c;使用了nginx 1.10.3 ┌──(kali㉿kali)-[~/HTB/Frolic] └─$ nmap -sC -sV -oA nmap -Pn 10.10.10.111 Starting Nmap 7.93 ( http…

Linux第25步_在虚拟机中备份“ST官方的TF-A源码”

TF-A是ARM公司提供的&#xff0c;ST公司通过修改它&#xff0c;做了一个自己的TF-A代码。因为在后期开发中&#xff0c;若硬件被改变了&#xff0c;我们需要通过修改"ST官方的TF-A源码"就可以自己的TF-A代码了。为了防止源文件被误改了&#xff0c;我们需要将"S…

【经典算法】有趣的算法之---遗传算法梳理

every blog every motto: You can do more than you think. 0. 前言 遗传算法是一种基于自然选择和遗传机制的优化算法&#xff0c;因此它通常被用于求解各种最优化问题&#xff0c;例如函数优化、特征选择、图像处理等。 一言以蔽之&#xff1a; 将数学中的优化问题&#xf…

ZooKeeper 实战(三) SpringBoot整合Curator-开发使用篇

文章目录 ZooKeeper 实战(三) SpringBoot整合Curator-开发使用篇0. ZooKeeper客户端 1. Curator1.1. 简介1.2. 应用场景1.3. 优势1.4. 依赖说明 2. 依赖导入3. 配置类3.1. 重试策略3.2. 实现代码3.3. 总结 4. Curator中的基本API4.1. 创建节点CreateMode中的节点类型4.2. 查询节…

【MATLAB源码-第114期】基于matlab的孔雀优化算法(POA)无人机三维路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 POA&#xff08;孔雀优化算法&#xff09;是一种基于孔雀羽毛开屏行为启发的优化算法。这种算法模仿孔雀通过展开其色彩斑斓的尾羽来吸引雌性的自然行为。在算法中&#xff0c;每个孔雀代表一个潜在的解决方案&#xff0c;而…

通过IDE和jar包运行时加载json配置文件

程序中使用了json配置文件&#xff0c;位置在$rootPath/src/main/resources/config.json, 调试时使用IDE&#xff0c;但运行时使用Jar包&#xff0c;加载config.json配置文件的代码如下&#xff1a; public ConfigParser(String configFileName) throws IOException {try{Inp…

用el-image-viewer实现全局预览图片

背景 在后台管理系统中&#xff0c;一些预览图片的场景&#xff0c;通常都是使用 el-image-viewer 去实现&#xff0c;但是如果多个地方都需要预览图片&#xff0c;又要重复的去写 el-image-viewer 以及一些重复的和预览相关的代码。 可以把预览图片的组件放在根文件&#x…

Python - Bert-VITS2 语音推理服务部署

目录 一.引言 二.服务搭建 1.服务配置 2.服务代码 3.服务踩坑 三.服务使用 1.服务启动 2.服务调用 3.服务结果 四.总结 一.引言 上一篇文章我们介绍了如果使用 conda 搭建 Bert-VITS2 最新版本的环境并训练自定义语音&#xff0c;通过 1000 个 epoch 的训练&#xf…