从零实现一套低代码(保姆级教程) --- 【12】实现左侧层级树并支持查看JSON

摘要

目前,我们还有最后一个小模块没有实现,那就是左侧的数据。

在这里插入图片描述
我们希望它能够展示整个页面的相关协议,其实也就是我们redux中管理的数据。我们希望能够通过可视化的方式看到它。

因为有时候我们想知道一个组件的具体信息,就可以通过这种方式去查看。
同时在之前的篇章中,我们实现的容器组件是嵌套关系的,所以这里展示数据的组件,我们选择使用Tree组件。

如果你是第一次看到这一篇文章, 建议先看一下第一节内容:
从零实现一套低代码(保姆级教程) — 【1】初始化项目,实现左侧组件列表

OK,现在我们实现左侧的组件层级树。

在这里插入图片描述

1.实现Tree组件

首先,我们应该拿到redux中保存的comList组件列表,它是一个多层的嵌套数组,为了初始化层级树的数据,我们要递归将其转换为Tree组件需要的结构。

  const items: TabsProps['items'] = [
    {
      key: 'component',
      label: <div style={{fontSize:'18px',width:'100px',textAlign:'center'}}>组件</div>,
      children: <Collapse className='comCollapse' items={collapseItems} defaultActiveKey={'enterDataCom'}/>,
    },
    // 层级树返回的组件
    {
      key: 'data',
      label: <div style={{fontSize:'18px',width:'100px',textAlign:'center'}}>数据</div>,
      children: getTreeList(),
    }
  ];
  const getTreeList = () => {
    const comList = Store.getState().comList;

    const toTreeData = (arr: []) => {
      return arr.map((item: any) => {
        const node: any = {
          title: item.caption,
          key: item.comId,
        }
        if(item.childList) {
          node.children = toTreeData(item.childList)
        }
        return node
      })
    }

    const treeData = [{
      title: '组件协议',
      key: 'zujianxieyi',
      children: toTreeData(comList)
    }]
    console.log(treeData);
    
    return <Tree
      className='leftList'
      showLine={true}
      treeData={treeData}
    />
  }

OK。我们用组件的caption作为标题,comId作为key,来渲染整个层级树。
同时,如果redux的数据更新了,我们的层级树也需要更新,所以这里我们也要引入subscribeHook方法

2.补充组件的caption属性

现在,我们可以看到整颗树了,但是有一个问题,树上啥也没有,这是为啥呢?

在这里插入图片描述

这是因为,我们创建每个节点的时候,并没有给每个组件caption属性,所以这里我们要给所有的组件进行初始化caption。

这里我就直接简单一点,通过一个递增的num来表示了,大家有好方法自己去改进,我这里就不管重不重名了。

回到mainPart下,我们修改一下onDrop方法:

  const onDrop = (e: any) => {
  	  // 其他代码
      const comNode = {
        comType: nowCom,
        style,
        comId,
        // 初始话caption
        caption: componentTextMap[nowCom] + num++
      }
      // 其他代码
  }

对于所有组件,那也一定要能修改caption,所以我们把没有caption属性的组件给加上。

对于后面读者自己新增的组件,也一定要把caption属性给加上。

现在我们的树结构就很清晰了。

在这里插入图片描述

3.右键查看组件json

有了层级树之后,我希望能够右键点击查看协议。OK,我们先来实现右键的点击功能,我们要先修改getTreeList方法,我们的每个节点不能只是一段文本了。

然后我们要有一个弹窗来展示组件的json,那我们就要管理这个弹窗的显示和隐藏
我们要有一个状态用来表示展示哪个组件

  const [showJson, setShowJson] = useState(false)
  const [jsonComId, setJsonComId] = useState('')
  
  const dropItems = [
    {
      label: '查看JSON',
      key: 'showJson'
    }
  ]
  
  const menuOnClick = (comId: string) =>{
    return (menuItem: any) => {
      if(menuItem.key === 'showJson'){
      	// 展示协议的弹窗
        setShowJson(true)
        setJsonComId(comId)
      }
    }
  }
  
  const getTreeList = () => {
    const comList = Store.getState().comList;

    const toTreeData = (arr: []) => {
      return arr.map((item: any) => {
        const node: any = {
          // 修改节点的title
          title: <div>
          <Dropdown menu={{onClick: menuOnClick(item.comId), items: dropItems }} trigger={['contextMenu']}>
            <span>{item.caption}</span>
          </Dropdown>
        </div>,
          key: item.comId,
        }
        if(item.childList) {
          node.children = toTreeData(item.childList)
        }
        return node
      })
    }
  }

OK,现在我们只需要实现弹窗即可。

我们在modal文件夹下新增一个弹窗:

在这里插入图片描述

这个弹窗里,我们只需要拿到查看节点的comId,然后给它的JSON展示出来即可。

import { Modal, Typography } from 'antd'
import Store from '../../../store';
import { getComById } from '../../../utils/nodeUtils';

const { Paragraph } = Typography;

export default function EditJson(props) {
  const {showJson, setShowJson, jsonComId} = props
  const comList = JSON.parse(JSON.stringify(Store.getState().comList))
  const selectNode = getComById(jsonComId, comList)

  return (
    <Modal
      open={showJson}
      onOk={() => {setShowJson(false)}}
      onCancel={() => {setShowJson(false)}}
      closable={false}
    >
      <Paragraph
        style={{
          maxWidth: 440,
          marginTop: 24,
        }}
      >
        <pre
          style={{
            border: 'none',
            height:'370px',
            width:'450px',
            overflow:'auto'
          }}
        >
          {JSON.stringify(selectNode, null, 2)}
        </pre>
      </Paragraph>
    </Modal>
  )
}

现在我们就可以通过右键查看JSON了。

在这里插入图片描述

到此,左侧的层级树,大致就实现了。

相关的代码提交在github上:
https://github.com/TeacherXin/XinBuilder2
commit: 第十二节: 实现左侧层级树并支持查看JSON

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Golang http包实战:构建RESTful API

Golang http包实战&#xff1a;构建RESTful API 引言简介目的 Go语言http包简介功能概述基本组件 搭建基础Web服务器步骤指导代码示例创建简单的HTTP文件服务器步骤说明代码示例 设计RESTful API结构设计原则路由设计 实现RESTful API处理请求代码示例 中间件应用代码示例 错误…

从零开始配置pwn环境:CTF PWN 做题环境

前期在kali2023环境安装的pwndocker使用发现不好用&#xff0c;so找了网上配置好pwn环境的虚拟机。 GitHub - giantbranch/pwn-env-init: CTF PWN 做题环境一键搭建脚本 可以直接下载我配置好的Ubuntu 16.04&#xff0c;为VMware导出的ovf格式 链接&#xff1a;百度网盘 请输…

小兔鲜儿 uniapp - SKU 模块

目录 存货单位&#xff08;SKU&#xff09;​ 插件市场​ 下载 SKU 插件​ 使用 SKU 插件​ 插件类型问题​ 核心业务​ 渲染商品规格​ 打开弹窗交互​ 渲染被选中的值​ 存货单位&#xff08;SKU&#xff09;​ SKU 概念 存货单位&#xff08;Stock Keeping Unit&a…

55寸oled透明显示屏售价,受哪些因素影响

55寸OLED透明显示屏的售价受到多个因素的影响&#xff0c;包括以下几个方面&#xff1a; 尺寸和分辨率&#xff1a;OLED透明显示屏的尺寸和分辨率是决定价格的重要因素。较大的尺寸和较高的分辨率会增加制造成本和售价。 技术水平和制造工艺&#xff1a;OLED透明显示屏的技术水…

@Autowired和@Resource的区别是什么

引言 当涉及到Spring框架中的依赖注入时&#xff0c;Autowired和Resource是两个常用的注解。它们都可以用来注入Bean&#xff0c;并且在实际开发中经常被使用。然而&#xff0c;Autowired和Resource之间存在一些重要的区别&#xff0c;包括适用范围、注入规则和注解来源等方面…

电源模块电阻测试:万用表如何测量电源的电阻?

电阻是电路中常用的电子元件&#xff0c;它可以调节电压、限制电流&#xff0c;从而保护电路。电阻测试是电源模块的常规测试项目之一&#xff0c;常见的电阻测试方法是通过万用表来测量电阻阻值&#xff0c;具体如下&#xff1a; 一、两线法 适用于测量较大的电阻值&#xff0…

众和策略:沪指震荡跌0.21%,煤炭、电力等板块拉升,核电概念活跃

2日早盘&#xff0c;三大股指盘中震荡走低&#xff0c;创业板指跌逾1%&#xff0c;北证50指数逆市拉升&#xff1b;北向资金大幅流出。 到午间收盘&#xff0c;沪指跌0.21%报2968.7点&#xff0c;深成指跌0.91%&#xff0c;创业板指跌1.38%&#xff0c;北证50指数涨1.33%&…

成功安装Milvus!零基础Ubuntu部署安装Milvus教程

Milvus源码编译安装 Milvus源码编译安装Golang和C开发环境安装源码安装编译基础依赖&#xff1a;OpenBLAS安装Rust安装前置依赖下载源码更改安装脚本开始编译测试Milvus是否安装成功 遇到的问题问题1&#xff1a;问题2&#xff1a;问题3&#xff1a;问题4&#xff1a;问题5&…

java常用数据结构

List&#xff1a;ArrayList 和 LinkedList 1、ArrayList 和 LinkedList都是非线程安全 2、ArrayList 可以直接根据下表定位元素&#xff0c;查找速度快&#xff0c;但是修改元素慢&#xff1b;LinkedList 查找元素必须从第一个开始逐个查找&#xff0c;查找速度慢&#xf…

开关电源输入输出电压测试方法:如何用开关电源智能测试系统测试输入输出电压?

一、用万用表测量输入输出电压 1. 连接万用表到电路中 2. 将万用表调到直流电压挡&#xff0c;连接红表笔到开关电源正极&#xff0c;连接黑表笔到开关电源负极。 3. 打开电源&#xff0c;读取万用表显示的电压值。 二、用示波器测量输入输出电压 1. 连接示波器到电路中 2. 将示…

【索引的数据结构】第2章节:InooDB和MyISAM索引结构对比

目录结构 之前整篇文章太长&#xff0c;阅读体验不好&#xff0c;将其拆分为几个子篇章。 本篇章讲解 InnoDB 和 MyISAM 索引结构对比。 InnoDB 的 BTree 索引注意事项 根页面位置万年不变 上述我们在索引迭代的过程中&#xff0c;为了更佳形象的描述&#xff0c;所以将顺序…

机器学习(二) -- 数据预处理(1)

系列文章目录 机器学习&#xff08;一&#xff09; -- 概述 机器学习&#xff08;二&#xff09; -- 数据预处理&#xff08;1-3&#xff09; 未完待续…… 目录 系列文章目录 前言 一、概述 二、数据获取 三、数据分布与趋势探查 1、散点图 2、折线图 3、频率分布直…

SpringMVC框架

SpringMVC 三层架构MVC模式SpringMVC入门案例总结 三层架构 表现层&#xff08;web&#xff09; 页面数据的收集&#xff0c;产出页面 业务逻辑层&#xff08;service&#xff09; 业务处理 数据访问层&#xff08;Dao&#xff09; 数据持久化 MVC模式 SpringMVC 基于Java…

BOSS直聘上算法岗位的薪资分析

目录 一、数据介绍及预处理 1、数据介绍 2、数据预处理 二、数据分析 1、缺失值统计 2、岗位数量、薪资水平统计 3、企业维度岗位数量 4、top薪资岗位 三、划重点 少走10年弯路 元旦抽空爬取了一下BOSS直聘上base北京的算法岗位的相关数据&#xff0c;本文简单分析拿…

Linux 系统拉取 Github项目

一、安装Git 在Linux上拉取GitHub项目可以使用Git命令。首先确保已经安装了Git。如果没有安装&#xff0c;可以通过包管理器&#xff08;比如apt、yum&#xff09;来进行安装。 sudo yum install git #查看安装版本 git -version二、关联GitHub 配置本地账户和邮箱 >>…

HarmonyOS4.0系统性深入开发08服务卡片架构

服务卡片概述 服务卡片&#xff08;以下简称“卡片”&#xff09;是一种界面展示形式&#xff0c;可以将应用的重要信息或操作前置到卡片&#xff0c;以达到服务直达、减少体验层级的目的。卡片常用于嵌入到其他应用&#xff08;当前卡片使用方只支持系统应用&#xff0c;如桌…

《师兄啊师兄》:以“稳健”诠释修仙,反套路喜剧动画赢麻了!

在众多动画题材中&#xff0c;修仙动画一直以其独特的东方神秘色彩和热血的打斗场景深受观众喜爱&#xff0c;可以说是国漫中最具本土特色的题材之一。近年来&#xff0c;大量的修仙题材爆款IP被改编成动画&#xff0c;整体反响非常热烈。动画男主角们通过不断地修炼&#xff0…

深度学习——PIL和OpenCV

PIL 官方文档 格式互转 opencv cv2.imread() 参数&#xff1a; filepath&#xff1a;读入imge的完整路径 flags&#xff1a;标志位&#xff0c;{cv2.IMREAD_COLOR&#xff0c;cv2.IMREAD_GRAYSCALE&#xff0c;cv2.IMREAD_UNCHANGED} cv2.IMREAD_COLOR&#xff1a;默认参数&…

Cypress安装与使用教程(3)—— 软测大玩家

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

计算商场优惠

#include<stdio.h> #include<string.h> #include<math.h> double amount(double list[], int n, double min) {int i;double sum 0, cheap list[0];for (i 0; i < n; i){sum sum list[i];if (list[i] < cheap) //找出最小的cheap list[i];}if (n…