数据网格组件要求所有行都具有唯一的“id”属性

nop*_*nop 20 typescript reactjs material-ui mui-x mui-x-data-grid

我知道我必须使用 getRowId,但是我该如何使用它statIdid?它是独一无二的。id或者为它们每个人生成一个属性?

错误:MUI:数据网格组件要求所有行都具有唯一的id属性。或者,您可以使用getRowIdprop 为每行指定一个自定义 id。rows 属性中提供了没有 id 的行:{"statId":813183,"teamId":3,"season":2021,"name":"Atlanta Hawks","team":"ATL","wins" :41,“损失”:31,“fieldGoalsMade”:3492.1,“fieldGoalsAttempted”:7468.1,“fieldGoalsPercentage”:55.6,“twoPointersMade”:2427.9,“twoPointersAttempted”:4612.1,“twoPointersPercentage”:62.5,“ ThreePointersMade”:1064.2 ,“ ThreePointersAttempted”:2856,“ ThreePointersPercentage”:44.3,“ freeThrowsMade”:1684.8,“ freeThrowsAttempted”:2074.8,“ freeThrowsPercentage”:96.5,“进攻篮板”:903.6,“防守篮板”:3002.2,“篮板”:3905.9,“助攻”:2065.3、“抢断”:598.1、“封堵投篮”:405.4、“失误”:1086.7、“个人犯规”:1655.1、“得分”:9733.2、“双打”:120.1、“三双”:1.4}

import { useState, useEffect } from 'react';
import type { NextPage } from 'next';
import Container from '@mui/material/Container';
import Box from '@mui/material/Box';
import { DataGrid, GridColDef, GridRowIdGetter } from '@mui/x-data-grid';
import { Grid, Paper, Typography } from '@mui/material';
import Skeleton from '@mui/material/Skeleton';
import { blue } from '@mui/material/colors';

import FormOne from './../src/FormOne';
import { TeamSeason } from './../src/lib/interfaces/TeamSeason';

const LoadingSkeleton = () => (
  <Box
    sx={{
      height: 'max-content',
    }}
  >
    {[...Array(10)].map((_, index) => (
      <Skeleton variant="rectangular" sx={{ my: 4, mx: 1 }} key={index} />
    ))}
  </Box>
);

const columns: GridColDef[] = [
  { field: 'statId', headerName: 'Stat ID' },
  { field: 'name', headerName: 'Name', width: 300 },
  { field: 'season', headerName: 'Season', width: 600 },
];

const Home: NextPage = () => {
  const [data, setData] = useState([]);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    setInterval(
      () =>
        fetch('https://localhost:7000/TeamSeason/2021')
          .then((response) => response.json())
          .then((data) => {
            setData(data);
            setLoading(false);
          }),
      3000
    );
  }, []);

  return (
    <Container
      maxWidth={false}
      sx={{
        height: '100vh',
        overflow: 'auto',
        background: `linear-gradient(to right, ${blue[200]}, ${blue[500]})`,
      }}
    >
      <Container maxWidth="lg" sx={{ mt: 3, mb: 3 }}>
        <Grid container spacing={{ xs: 2, md: 3 }}>
          <Grid item xs={12} md={6}>
            <Paper sx={{ padding: 3 }}>
              <FormOne data={data} />
            </Paper>
          </Grid>

          <Grid item xs={12} md={6}>
            <Paper sx={{ padding: 3 }}></Paper>
          </Grid>

          <Grid item xs={12}>
            <Paper sx={{ padding: 3 }}>
              <DataGrid
                sx={{ height: '650px' }} // either autoHeight or this
                rows={data}
                columns={columns}
                pageSize={10}
                // autoHeight
                rowsPerPageOptions={[10]}
                disableSelectionOnClick
                disableColumnMenu
                disableColumnSelector
                components={{
                  LoadingOverlay: LoadingSkeleton,
                }}
                loading={loading}
              />
            </Paper>
          </Grid>
        </Grid>
      </Container>
    </Container>
  );
};

export default Home;

Run Code Online (Sandbox Code Playgroud)
export interface TeamSeason {
  statId: number;
  teamId: number;
  season: number;
  name: string;
  team: string;
  wins: number;
  losses: number;
  fieldGoalsMade: number;
  fieldGoalsAttempted: number;
  fieldGoalsPercentage: number;
  twoPointersMade: number;
  twoPointersAttempted: number;
  twoPointersPercentage: number;
  threePointersMade: number;
  threePointersAttempted: number;
  threePointersPercentage: number;
  freeThrowsMade: number;
  freeThrowsAttempted: number;
  freeThrowsPercentage: number;
  offensiveRebounds: number;
  defensiveRebounds: number;
  rebounds: number;
  assists: number;
  steals: number;
  blockedShots: number;
  turnovers: number;
  personalFouls: number;
  points: number;
  doubleDoubles: number;
  tripleDoubles: number;
}

Run Code Online (Sandbox Code Playgroud)

小智 33

您可以在道具中使用它DataGrid

<DataGrid getRowId={(row) => row.statId} />
Run Code Online (Sandbox Code Playgroud)


Nel*_*les 10

对于此错误,请记住迭代将继续运行keys以充当每行的唯一标识符。该getRowId属性希望从行中推断出唯一的 id。

这是一个示例解决方案:

const columns: GridColDef[] = [
      { salary:53025, first_name:"Don" },
      { salary:63026, first_name:"Ted" },
      { salary:73027, first_name:"Bill" },
      { salary:83028, first_name:"Al" },
      { salary:23022, first_name:"Biff" },
   ];

   return (
      <div style={{ height: 300, width: "100%" }}>
         <DataGrid
            rows={rows}
            columns={columns}
            getRowId={(row: any) =>  row.first_name + row.salary}
         />
      </div>
Run Code Online (Sandbox Code Playgroud)

或者如果你仍然有按键冲突,你可以尝试这样的事情

function generateRandom() {
    var length = 8,
        charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",
        retVal = "";
    for (var i = 0, n = charset.length; i < length; ++i) {
        retVal += charset.charAt(Math.floor(Math.random() * n));
    }
    return retVal;
}

   return (
      <div style={{ height: 300, width: "100%" }}>
         <DataGrid
            rows={rows}
            columns={columns}
            getRowId={(row: any) =>  generateRandom()}
         />
      </div>
Run Code Online (Sandbox Code Playgroud)

更多信息可以在MUI 网站上找到。


小智 5

如果您使用 MongoDB,则应包含此行 getRowId={(row) => row._id} ,因为 MongoDB 的 ID 名为 _id,这将查找 _id 选项并选择它作为唯一 ID


小智 5

我从数据库 MongoDB 获取数据,所以这对我有用

  <DataGrid
    rows={usersData}
    disableSelectionOnClick
    columns={columns}
    pageSize={8}
    checkboxSelection
    getRowId={(row) => row._id}
    >
Run Code Online (Sandbox Code Playgroud)