动态生成多个 React createRef

2023-10-27

有这么个需求,从接口获取数据,数据格式为:

/**
 * dataList - 接口获取的数据
 * tableData - 表格数据
 */
const dataList = [[tableData1], [tableData2], [tableData3], ...]

需要实现的效果大概长这样:

 

dataList 数组长度不固定,tableData 数组长度也不固定,需要在同一个弹窗中遍历出多个表格,每个表格对应一个 tableData 的数据,每个 tableData 中的数据可以被编辑,还可以对 tableData 做新增一条新数据的操作。因为修改数据后需要通过 table 组件中的 setState 来触发页面重新渲染,所以我的做法是给 Table 组件增加了一个 onChangeData 的方法给父组件调用,用以触发子组件(Table 组件)的 setState。

因为 dataList 是从接口获取的且长度不固定,想要做到的是按获取到的数据长度动态生成对应数量的 table 以及动态生成对应数量的 tableRef,以便在修改 table 数据时,能够根据下标找到对应的 tableRef 来调用组件中的 onChangeData。

整个结构及过程大概是这样:

// Table 组件
class Table extends PureComponent {
    constructor(props) {
        super(props)
        this.state = {
            currentData: props.currentData || []
        }
    }

    onChangeData = (currentData) => {
        this.setState({ currentData })
    }

    render() {
        return <Table data={ this.state.currentData } ></Table>
    }
}

// 父组件调用
function Farther (props) {
    const [dataList, setDataList] = useState([])
    const [tableRefList, setTableRefList] = useState([])

    useEffect(() => {
        // ...此处省略接口获取dataList步骤,resDataList 为接口获取的数据
        const resDataList = [[tableData1], [tableData2], [tableData3], ...]
        // arr 为临时存放 tableRef 的数组
        const arr = []
        resDataList.forEach(item => {
            arr.push(React.createRef())
        })
        setDataList(resDataList)
        setTableRefList(arr)
    })
    
    // 编辑、新增
    const modify = () => {
        // targetIndex 为根据唯一标识在 dataList 中找到的对应 tableList 的下标
        const targetIndex = dataList.findIndex(item => {
            return xxx === item.xxx
        })
        // newDataList 为经过一系列编辑或者新增操作的新数据,对应旧数据为 dataList
        const newDataList = [newDataList]
        if (targetIndex > -1) {
            tableRefList[targetIndex].current.onChangeData(newDataList[targetIndex])
        }
    }
    
    return (<Popup visible={ visible }>
        { dataList && dataList.map((item, index) => <Table
            currentData={ item }
            ref={ tableRefList[index] }
        />) }
    </Popup>)
}

也许有其他更好的做法,但我目前只想到这个,并且足以实现当前的需求,有更好的做法欢迎讨论~!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态生成多个 React createRef 的相关文章

随机推荐

  • MySQL索引失效场景实例演示

    文章目录 一 环境信息 二 表 数据准备 三 复合索引的失效情况 最左前缀法则 or查询 四 单列索引的失效情况 like模糊查询使用前通配符 索引列上使用函数 字符串索引没加引号 使用 lt gt gt lt is null 或 is n
  • Jenkins安装与配置

    什么是CICD CI CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法 CI CD 的核心概念是持续集成 持续交付和持续部署 作为一个面向开发和运营团队的解决方案 CI CD 主要针对在集成新代码时所引发的问题 亦称 集成
  • Ubuntu16.04下基于Docker的Caffe-GPU版本环境搭建总结

    Caffe的GPU环境搭建在docker支持下并不困难 但是过程比较杂 所需依赖如下 本文会说明安装方法 帮助大家少走弯路 GNU Linux x86 64 with kernel version gt 3 10 Docker gt 1 9
  • 这是一个更新版本服务代码python

    import win32serviceutil import win32service import win32event import os import logging import inspect import time from u
  • 【计算机网络】实验报告三:Cisco Packet Tracer 实验

    Cisco Packet Tracer 实验 1 直接连接两台 PC 构建 LAN 2 用交换机构建 LAN 3 交换机接口地址列表 4 生成树协议 Spanning Tree Protocol 5 路由器配置初步 6 静态路由 7 动态路
  • 1045 快速排序

    著名的快速排序算法里有一个经典的划分过程 我们通常采用某种方法取一个元素作为主元 通过交换 把比主元小的元素放到它的左边 比主元大的元素放到它的右边 给定划分后的 N 个互不相同的正整数的排列 请问有多少个元素可能是划分前选取的主元 例如给
  • typora高亮_用Typora实现写作排版一体化

    用Typora实现写作排版一体化 一般的推文制作过程 大概都是在本地word写好文案以后 再导入到第三方的推文编辑器中进行排版 最后再黏贴到微信的图文素材编辑器里生成图文发布 经常看到许多公众号文章充满花里胡哨的元素 大概都是因为使用了推文
  • SpringBoot整合Elasticsearch(最新最全,高效安装到使用)

    文章目录 一 安装Elasticsearch相关插件 1 选择版本 2 安装Elasticsearch 3 安装node 4 安装grunt 5 安装es head插件 6 安装kibana 7 安装ik分词器 二 整合SpringBoot
  • 从零开始学编程——DOS命令

    一 DOS操作系统 DOS 英文 Disk Operating System 是一款由微软早期推出的磁盘操作系统 可以通过一系列dos命令直接对硬盘文件进行增删改查 DOS和windiws的最大不同之处在于它是一个字符式操作系统 所有的操作
  • Oracle 表空间查询与操作方法

    一 查询篇 1 查询oracle表空间的使用情况 select b file id 文件ID b tablespace name 表空间 b file name 物理文件名 b bytes 总字节数 b bytes sum nvl a by
  • 自动化办公更简单了:新版python-office,有哪些更新?

    职场经验谈 大家好 这里是程序员晚枫 小破站 小红薯都叫这个名 去年4月开源了一个Python自动化办公项目 python office GitHub和Gitee都能看到 1行代码实现复杂的自动化办公任务 帮助不懂代码的小白 快速使用Pyt
  • Unity鼠标控制物体的旋转、移动、缩放等

    这个是控制相机 44条消息 unity 相机 旋转缩放查看 物体或地图 unity旋转查看物体 野区捕龙为宠的博客 CSDN博客 下面的是控制物体本身 知识点 Input GetMouseButton 0 获取鼠标输入 参数为一个int值
  • QT moveToThread解析

    目录 简介 源码分析 判断是否可以执行移动动作 执行移动动作 调用moveToThread helper 调用setThreadData helper 简介 每一个QObject子类都会关联到一个具体QThread线程上 QObject有一
  • 同一块磁盘下,非lvm的扩容

    1 想要给跟分区扩容 2 先安装growpart yum install cloud utils growpart 3 growpart dev sda 2 发现lsblk看到扩容了 但是实际df还是没扩容 4 需要执行xfs growfs
  • 数据库系统之NoSQL数据库系统

    NoSQL Database Systems 什么是NoSQL数据库系统 为什么使用NoSQL NoSQL数据库系统的属性 半结构化的 无模式的数据模型 专业分布模型 弱一致性 Relaxing durability Versioning
  • 操作系统_03_内存管理(个人总结)

    声明 1 本文为我的个人复习总结 并非那种从零基础开始普及知识 内容详细全面 言辞官方的文章 2 由于是个人总结 所以用最精简的话语来写文章 3 若有错误不当之处 请指出 为什么要有虚拟地址 使各个进程使用的内存 相互独立 单片机没有操作系
  • 论文笔记之DPG

    原论文地址 阅读DPG的必要性 A2C的难收敛使得policy based向着DDPG发展 而DDPG Deep DPG 因此想要理解DDPG算法 就必须先理解DPG Deterministic Policy Gradient Algori
  • 【QT5 带参connect语法记录】

    QT5 带参connect语法记录 slot版 lamda版 Qt4版 未测试 更多细节参考 slot版 void QListWidget itemClicked2 QListWidgetItem QListWidget itemClick
  • 第三章作业

    例3 1 在一个班级中随机抽取9名学生 得到每名学生的英语考试分数如下 91 69 75 78 81 96 92 88 86 计算9名学生的平均考试分数 解 根据式3 1有 x 91 69 75 78 81 96 92 88 86 9 84
  • 动态生成多个 React createRef

    有这么个需求 从接口获取数据 数据格式为 dataList 接口获取的数据 tableData 表格数据 const dataList tableData1 tableData2 tableData3 需要实现的效果大概长这样 dataLi