如何在React JS中动态更新MaterialUI DataGrid表

2024-01-25

这是我正在尝试做的事情的概要:

  • 当用户单击一行中的复选框时,该行将被保存以免被删除(通常用户将单击多行)。
  • 一旦用户点击“清除记录”按钮,所有没有选中复选框的记录都会被删除。

我得到了一些关于如何做到这一点的一般建议,并且我使用了给我的建议以及我自己的逻辑来提出一个实现。问题是,虽然我认为我的逻辑看起来不错并且所有 console.log 语句看起来都不错,但其中的数据没有更新。顺便说一句,这是一个 JSX 文件,而不仅仅是一个普通的 JS 文件。

我已经被这个问题困扰了一天了,我真的很困惑我的问题是什么/为什么这不起作用。感谢您的所有帮助和建议


import React, { Component, useState } from "react";
import { DataGrid } from "@material-ui/data-grid";
import Button from "@material-ui/core/Button";
import DeleteIcon from '@material-ui/icons/Delete';
const columns = [
  { field: "id", headerName: "ID", width: 70 },
  { field: "firstName", headerName: "First name", width: 130 },
  { field: "lastName", headerName: "Last name", width: 130 },
  { field: "age", headerName: "Age", type: "number", width: 90 },
  { field: "fullName", headerName: "Full name", description: "This column has a value getter and is not sortable.", 
    sortable: false,
    width: 160,
    valueGetter: (params) =>
      `${params.getValue("firstName") || ""} ${
        params.getValue("lastName") || ""
      }`
  },
  { field: "city", headerName: "City", width: 100 },
  { field: "state", headerName: "State", width: 100 }
];

var data = [
  {
    id: 1,
    lastName: "Snow",
    firstName: "Jon",
    age: 35,
    city: "Milwaukee",
    state: "Wisconsin"
  },
  {
    id: 2,
    lastName: "Lannister",
    firstName: "Cersei",
    age: 42,
    city: "Dubuque",
    state: "Iowa"
  },
  {
    id: 3,
    lastName: "Lannister",
    firstName: "Jaime",
    age: 45,
    city: "Appleton",
    state: "Wisconsin"
  },
  {
    id: 4,
    lastName: "Stark",
    firstName: "Arya",
    age: 16,
    city: "Madison",
    state: "Wisconsin"
  },
  {
    id: 5,
    lastName: "Targaryenmnsdlfbsjbgjksbgksbfksfgbk",
    firstName: "Daenerys",
    age: null,
    city: "Green Bay",
    state: "Wisconsin"
  },
  {
    id: 6,
    lastName: "Melisandre",
    firstName: null,
    age: 150,
    city: "San Antonio",
    state: "Texas"
  },
  {
    id: 7,
    lastName: "Clifford",
    firstName: "Ferrara",
    age: 44,
    city: "Dallas",
    state: "Texas"
  },
  {
    id: 8,
    lastName: "Frances",
    firstName: "Rossini",
    age: 36,
    city: "Brooklyn",
    state: "New York"
  },
  {
    id: 9,
    lastName: "Roxie",
    firstName: "Harvey",
    age: 65,
    city: "Toledo",
    state: "Ohio"
  },
  {
    id: 10,
    lastName: "Larry",
    firstName: "King",
    age: 105,
    city: "Chicago",
    state: "Illiniois"
  },
  {
    id: 11,
    lastName: "Snow",
    firstName: "Jon",
    age: 35,
    city: "Milwaukee",
    state: "Wisconsin"
  },
  {
    id: 12,
    lastName: "Lannister",
    firstName: "Cersei",
    age: 42,
    city: "Dubuque",
    state: "Iowa"
  },
  {
    id: 13,
    lastName: "Lannister",
    firstName: "Jaime",
    age: 45,
    city: "Appleton",
    state: "Wisconsin"
  },
  {
    id: 14,
    lastName: "Stark",
    firstName: "Arya",
    age: 16,
    city: "Madison",
    state: "Wisconsin"
  },
  {
    id: 15,
    lastName: "Targaryenmnsdlfbsjbgjksbgksbfksfgbk",
    firstName: "Daenerys",
    age: null,
    city: "Green Bay",
    state: "Wisconsin"
  },
  {
    id: 16,
    lastName: "Melisandre",
    firstName: null,
    age: 150,
    city: "San Antonio",
    state: "Texas"
  },
  {
    id: 17,
    lastName: "Clifford",
    firstName: "Ferrara",
    age: 44,
    city: "Dallas",
    state: "Texas"
  },
  {
    id: 18,
    lastName: "Frances",
    firstName: "Rossini",
    age: 36,
    city: "Brooklyn",
    state: "New York"
  },
  {
    id: 19,
    lastName: "Roxie",
    firstName: "Harvey",
    age: 65,
    city: "Toledo",
    state: "Ohio"
  },
  {
    id: 20,
    lastName: "Larry",
    firstName: "King",
    age: 105,
    city: "Chicago",
    state: "Illiniois"
  }
];

var rowsToKeep = [];
var rowsToBeDeleted = [];

class ElgibleContracts extends Component {
  //const [rows, setRows] = useState(data);
  //const [deletedRows, setDeletedRows] = useState([]);

  /*
  * It's assumed that the user will want to delete all the rows,
  * but there will be scenarios when that's not the case.
  */
  setRowsToBeDeleted = () => {
    for (var i = 0; i < data.length; i++){
      rowsToBeDeleted.push(data[i].id);
    }
    rowsToBeDeleted = [...new Set(rowsToBeDeleted)]; //Did this because clicking the button twice will make doubles appear for each row
    
  };

  /*
   * This method fires off when the checkbox is clicked for a given row.
  */
  handleRowSelection = (e) => {
    // remove it if it's already present - this means the user unchecked it
    if (rowsToKeep.includes(e.data.id)){
      for(var i = 0; i < rowsToKeep.length; i++){ 
        if (rowsToKeep[i] === e.data.id){ 
          rowsToKeep.splice(i, 1); 
        }
      }
    } else {
      // user clicked it - add it to the list of rows to keep.
      rowsToKeep.push(e.data.id);
    }

    this.setRowsToBeDeleted();
    console.log("Rows to Keep: " + rowsToKeep);
    //setDeletedRows([...deletedRows, ...rows.filter((r) => r.id === e.data.id)]);
    //console.log("All rows: " + rows);
  };

  /*
  * This method updates the data that's to be displayed.
  */
  handlePurge = () => {
    // Check to see what rows are to be deleted and which ones aren't.
    for (var j = 0; j < rowsToKeep.length; j++){
      if (rowsToBeDeleted.includes(rowsToKeep[j])){
        // delete it from 'rows to be deleted' array
        console.log("Found:" + rowsToKeep[j]);
        while(rowsToBeDeleted.indexOf(rowsToKeep[j]) !== -1) {
          rowsToBeDeleted.splice(rowsToBeDeleted.indexOf(rowsToKeep[j]), 1)
        }
      } else {
        // do nothing
      }
    } 

    // remove it from the data set. Just used ID of 1 in this case to test whether or not it would work
    data = data.filter(function(item) { 
      return item.id !== 1;  
    });
    
    console.log("Rows to Delete: " + rowsToBeDeleted);
    console.log("Here are deleted items",rowsToBeDeleted);
  };

  render(){
    return (
    <div style={{ textAlign: "center" }}>
      <h1 style={{ fontFamily: "Stone" }}>Elgible Contracts</h1>
      <span className="horizontal-line" />
      <div className="centerDiv" style={{ height: 380, width: 950 }}>
        <DataGrid
          rows={data}
          columns={columns}
          pageSize={10}
          checkboxSelection
          onRowSelected={this.handleRowSelection}
        />
      </div>
      <br />
      <Button variant="contained" color="primary" startIcon={<DeleteIcon />} style={{textTransform: "none"}} onClick={this.handlePurge}>
        Purge Records
      </Button>
    </div>
  );
};
}

export default ElgibleContracts;

这里的问题是您没有保留数据的状态。我看到您尝试使用钩子 - 这些在类组件中不起作用,所以只需使用状态类属性

class ElgibleContracts extends Component {
  //const [rows, setRows] = useState(data); <-- this will not work in class component
  //const [deletedRows, setDeletedRows] = useState([]); <-- this will not work in class component

  state = {
    data: data // use state class property instead
  };

在你的里面handlePurge方法,这是您为过滤后的数据设置新状态的地方

let data_to_be_kept = this.state.data.filter(function (item) {
  return rowsToBeDeleted.includes(item.id) === false;
});

this.setState({
  data: data_to_be_kept
});

最后,在你的DataGrid, 的价值prop rows应该被赋予的值state data

<DataGrid
  rows={this.state.data}
  columns={columns}
  pageSize={10}
  checkboxSelection
  onRowSelected={this.handleRowSelection}
/>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在React JS中动态更新MaterialUI DataGrid表 的相关文章

  • Angular 2 Material 2 日期选择器日期格式

    我不知道如何更改材料2日期选择器的日期格式 我已阅读文档 但我不明白我实际上需要做什么 datepicker默认提供的输出日期格式为f e 6 9 2017 我想要实现的目标是将格式更改为类似的格式9 Jun 2017或任何其他 文档htt
  • Javascript - 在加载所有图像后执行

    看了别人的问题我想 window onload 会回答我的问题 我已经尝试过这个 但它会在页面加载时立即执行代码 而不是在图像加载之后 如果有什么区别的话 图像来自 CDN 并且不是相对的 有人知道解决办法吗 我没有使用 jQuery 想要
  • 打开 md-calendar 时滚动到当前日期

    目前正在构建一个使用 Angular Material 的应用程序 我们需要一个 md calendar 组件 我们想要自定义按钮样式和内容 因此不使用普通的 md datepicker 问题是 当 md calender 打开时 滚动位置
  • 如何导入和导出 javascript ES6 类

    我是 javascript 和 nodejs 的新手 我正在使用这个项目来发展我的技能并学习新技术 目前我的项目使用多个相互依赖的类 类文件位于不同的目录中 我当前正在尝试使用 export 和 require 语句来允许在其他文件中引用类
  • javascript jquery 使用脚本更改脚本的src

    我有一个 JavaScript 脚本 它有一个 src 元素 这个 src 是一个 url 我想使用 javascript 更改它 一次更改为其他内容 或者动态创建它 使用 javascript jquery 动态创建脚本元素的最佳方法是什
  • 搜索深度嵌套数组以更新对象

    我有一个深层嵌套的数据结构 我有兴趣匹配数组 和数组数组 中的某个值 然后将一些数据推送到随附的数组中 例如以下是我的数组colors并伴随着的是更多颜色数组可能存在也可能不存在 var myData color green moreCol
  • 确定元素是在页面折叠上方还是下方

    我有一些页面有多个输入框 用户可以在其中输入文本 在单击 下一步 按钮之前 需要填写其中一些内容 我弹出验证错误供用户查看 但是如果问题不在页面上 我希望页面滚动到它 而不是他们必须搜索丢失 错误的字段 我有一个滚动到位 但我无法确定要滚动
  • 如何以编程方式退出或关闭 Javascript UWP 应用程序? (Windows 10)

    我制作了一个游戏 它需要自己的退出按钮 我无法使用CoreApplication Exit https msdn microsoft com en us library windows apps windows applicationmod
  • 如何从 JSON 响应重定向?

    所以我尝试使用 Flask 和 Javascript 上传器 Dropzone 上传文件并在上传完成后重定向 文件上传正常 但在烧瓶中使用传统的重定向 return redirect http somesite com 不执行任何操作 页面
  • console.log() 显示同一对象属性的矛盾值

    我想我可能要疯了 我使用 console log 来查看对象的状态 然后在下一行对同一对象的特定属性执行 console log 并为每个属性获取不同的值 我正在使用的代码是 console log this pictures Items
  • 如何更改自动完成中的结果过滤器?

    我不想进行字面匹配 而是想通过正则表达式选择结果 我可以覆盖自动完成的默认行为来完成此任务还是需要替代结构 有一个内置的方法可以做到这一点 只需提供一个函数source http jqueryui com demos autocomplet
  • 为什么 Web Worker 性能在 30 秒后急剧下降?

    我正在尝试提高在网络工作人员中执行时脚本的性能 它旨在解析浏览器中的大型文本文件而不会崩溃 一切都运行得很好 但我注意到使用网络工作者时大文件的性能存在严重差异 于是我做了一个简单的实验 我在同一输入上运行脚本两次 第一次运行在页面的主线程
  • 在管道中重用变量的功能方式

    在 javascript 和 typescript 中与 Ramda 一起使用函数式编程 我经常发现自己编写如下代码 const myFun c gt const myId c id const value pipe getAnotherO
  • 在 React Navigation 中将 props 传递给自定义抽屉导航器

    在反应导航抽屉菜单中 我想显示用户名 John Doe 它处于我的主要组件的状态 Router 我怎样才能将自定义抽屉内容组件传递给它 额外信息 我从 AsyncStorage 中获取此名称 组件已挂载 这是我的代码 export defa
  • 如何处理requireJs超时错误?

    我正在使用 require js 作为加载框架编写一个移动混合应用程序 我遇到加载错误的问题 我想做的是在设备离线且无法下载在屏幕上显示地图所需的 google 地图 API 脚本时设置后备解决方案 我得到的只是 Uncaught Erro
  • 从 DirectionsRenderer 中获取折线或标记的事件

    我正在使用 DirectionsService 和路线方法来生成 DirectionsResult 我还使用 DirectionsRenderer 对象来显示结果 因为它非常易于使用 我在检测 Directions changed 事件时没
  • useParams 钩子在 React 功能组件中返回未定义

    该应用程序显示所有照片
  • mozilla pdf.js 没有全视图

    我喜欢这个 pdf 查看器https github com mozilla pdf js https github com mozilla pdf js Demo http mozilla github com pdf js web vie
  • 在 HTML5 iOS 7 / iOS 8 中显示十进制键盘

    经过几个小时的搜索后 我只是有一个简单的问题 是否有可能在网络浏览器输入字段中显示小数键盘 input type number 只显示数字 但我需要在左下角使用逗号或点 我尝试过任何事情 pattern step等等 但没有显示十进制键盘
  • Node npm 包抛出使用严格:全局发布和安装后未找到命令

    我正在尝试发布 npm 包 当我全局安装该包并尝试运行 cli 命令时 我收到此错误 nvm versions node v0 12 2 bin myPack line 1 use strict command not found nvm

随机推荐