使用多维数组创建动态 table 并将数据存储在状态中
create dynamic table using multidimensional array and store data in state
我是reactjs小白,这个月开始学习,这里我尝试创建useState变量,它的数据以多维数组的方式存储,或者只是数组。此变量的输入来自动态 tables 单元格,这些单元格是根据行号和列号创建的。
此 link 已创建 table 部分,我在数组
中存储数据时遇到问题
https://codesandbox.io/s/new-glitter-lepkk?file=/src/demo.js
import React, { Fragment, useState } from "react";
// Material-ui imports
import { fade, withStyles } from "@material-ui/core/styles";
import { makeStyles } from "@material-ui/core/styles";
import Table from "@material-ui/core/Table";
import TableBody from "@material-ui/core/TableBody";
import TableCell from "@material-ui/core/TableCell";
import TableContainer from "@material-ui/core/TableContainer";
import TableRow from "@material-ui/core/TableRow";
import Paper from "@material-ui/core/Paper";
import InputBase from "@material-ui/core/InputBase";
import TextField from "@material-ui/core/TextField";
const useStyles = makeStyles({
table: {
minWidth: 650
}
});
const BootstrapInput = withStyles((theme) => ({
root: {
"label + &": {
marginTop: theme.spacing(3)
}
},
input: {
borderRadius: 4,
position: "relative",
backgroundColor: theme.palette.common.white,
border: "1px solid #ced4da",
fontSize: 16,
width: "60%",
padding: "5px 6px",
transition: theme.transitions.create(["border-color", "box-shadow"]),
"&:focus": {
boxShadow: `${fade(theme.palette.primary.main, 0.25)} 0 0 0 0.2rem`,
borderColor: theme.palette.primary.main
}
}
}))(InputBase);
export default function DataTabelVariable() {
// Table
const classes = useStyles();
const [rowValue, setRowValue] = useState(0);
const [columnsValue, setColumnsValue] = useState(0);
const [tableCellsData, setTableCellsData] = useState();
// const [jsonVar, setJsonVar] = useState({});
// var dictVarKey = {};
// var dictVarValue = {};
// var jsonVar = {}
const getUniqueKeyFromArrayIndex = (rowNum, columnNum) => {
return `${rowNum}-${columnNum}`;
};
// const onChangeHandler = (e) => {
// console.log(e.target.name, e.target.value);
// setTableCellsData({
// ...tableCellsData,
// [e.target.name]: e.target.value
// });
// };
const onChangeHandler = (e) => {
// console.log(e.target.name, e.target.value);
setTableCellsData({
...tableCellsData,
[e.target.name]: e.target.value
});
// console.log(Object.keys(tableCellsData));
// for (var key in tableCellsData) {
// var value = tableCellsData[key];
// const splitVar = key.split("-");
// if (parseInt(splitVar[0], 10) === 0) {
// dictVarKey[splitVar[1]] = value;
// } else if (parseInt(splitVar[0], 10) > 0) {
// dictVarValue[splitVar[1]] = value;
// }
// }
// for (var Kkey in dictVarKey) {
// for (var Vkey in dictVarValue) {
// if (Kkey === Vkey) {
// jsonVar[dictVarKey[Kkey]] = dictVarValue[Vkey];
// }
// }
// }
// console.log(dictVarKey);
// console.log(dictVarValue);
// console.log(jsonVar);
// for (let i = 0; i<rowValue; i++){
// for (let j=0;j <columnsValue; j ++ ){
// }
// }
};
const generateTable = () => {
let table = [];
// Outer loop to create parent
for (let i = 0; i < rowValue; i++) {
let children = [];
//Inner loop to create children
for (let j = 0; j < columnsValue; j++) {
children.push(
<td>
<BootstrapInput
name={getUniqueKeyFromArrayIndex(i, j)}
onChange={onChangeHandler}
/>
</td>
);
}
table.push(
<TableRow key={i}>
<TableCell>{children}</TableCell>
</TableRow>
);
// console.log(tableCellsData);
}
return table;
};
return (
<Fragment>
<div>
<h5>Select Row number and Columns number</h5>
<div className={"rowColumnsNumber"} style={{ marginTop: 20 }}>
<TextField
id="Row-number"
label="Row(s)"
type="number"
InputLabelProps={{ shrink: true }}
inputProps={{ min: "0", max: "1000", step: "1" }}
onChange={(e) => setRowValue(e.target.value)}
variant="outlined"
/>
<TextField
id="Columns-number"
label="Columns(s)"
type="number"
inputProps={{ min: "0", max: "1000", step: "1" }}
InputLabelProps={{ shrink: true }}
onChange={(e) => setColumnsValue(e.target.value)}
variant="outlined"
/>
</div>
<br />
<div className={"TableContainer"}>
<TableContainer component={Paper}>
<Table className={classes.table} aria-label="simple table">
<TableBody>{generateTable()}</TableBody>
</Table>
</TableContainer>
</div>
</div>
</Fragment>
);
}
大部分工作已经完成。
如果您想在多维数组(在本例中为 2d)中维护 table 的数据,那么 name 属性可以在这里为您提供帮助,因为它表示由连字符分隔的行号和列号。
只需获取 name 属性值,在连字符和中提琴上拆分!你会有行号和列号,之后你只需要使用它们来设置数组中的数据。
我已经更新了 codesandbox (check console to see the data array)。更新后的代码在第 74 和 84 行之间
我是reactjs小白,这个月开始学习,这里我尝试创建useState变量,它的数据以多维数组的方式存储,或者只是数组。此变量的输入来自动态 tables 单元格,这些单元格是根据行号和列号创建的。 此 link 已创建 table 部分,我在数组
中存储数据时遇到问题https://codesandbox.io/s/new-glitter-lepkk?file=/src/demo.js
import React, { Fragment, useState } from "react";
// Material-ui imports
import { fade, withStyles } from "@material-ui/core/styles";
import { makeStyles } from "@material-ui/core/styles";
import Table from "@material-ui/core/Table";
import TableBody from "@material-ui/core/TableBody";
import TableCell from "@material-ui/core/TableCell";
import TableContainer from "@material-ui/core/TableContainer";
import TableRow from "@material-ui/core/TableRow";
import Paper from "@material-ui/core/Paper";
import InputBase from "@material-ui/core/InputBase";
import TextField from "@material-ui/core/TextField";
const useStyles = makeStyles({
table: {
minWidth: 650
}
});
const BootstrapInput = withStyles((theme) => ({
root: {
"label + &": {
marginTop: theme.spacing(3)
}
},
input: {
borderRadius: 4,
position: "relative",
backgroundColor: theme.palette.common.white,
border: "1px solid #ced4da",
fontSize: 16,
width: "60%",
padding: "5px 6px",
transition: theme.transitions.create(["border-color", "box-shadow"]),
"&:focus": {
boxShadow: `${fade(theme.palette.primary.main, 0.25)} 0 0 0 0.2rem`,
borderColor: theme.palette.primary.main
}
}
}))(InputBase);
export default function DataTabelVariable() {
// Table
const classes = useStyles();
const [rowValue, setRowValue] = useState(0);
const [columnsValue, setColumnsValue] = useState(0);
const [tableCellsData, setTableCellsData] = useState();
// const [jsonVar, setJsonVar] = useState({});
// var dictVarKey = {};
// var dictVarValue = {};
// var jsonVar = {}
const getUniqueKeyFromArrayIndex = (rowNum, columnNum) => {
return `${rowNum}-${columnNum}`;
};
// const onChangeHandler = (e) => {
// console.log(e.target.name, e.target.value);
// setTableCellsData({
// ...tableCellsData,
// [e.target.name]: e.target.value
// });
// };
const onChangeHandler = (e) => {
// console.log(e.target.name, e.target.value);
setTableCellsData({
...tableCellsData,
[e.target.name]: e.target.value
});
// console.log(Object.keys(tableCellsData));
// for (var key in tableCellsData) {
// var value = tableCellsData[key];
// const splitVar = key.split("-");
// if (parseInt(splitVar[0], 10) === 0) {
// dictVarKey[splitVar[1]] = value;
// } else if (parseInt(splitVar[0], 10) > 0) {
// dictVarValue[splitVar[1]] = value;
// }
// }
// for (var Kkey in dictVarKey) {
// for (var Vkey in dictVarValue) {
// if (Kkey === Vkey) {
// jsonVar[dictVarKey[Kkey]] = dictVarValue[Vkey];
// }
// }
// }
// console.log(dictVarKey);
// console.log(dictVarValue);
// console.log(jsonVar);
// for (let i = 0; i<rowValue; i++){
// for (let j=0;j <columnsValue; j ++ ){
// }
// }
};
const generateTable = () => {
let table = [];
// Outer loop to create parent
for (let i = 0; i < rowValue; i++) {
let children = [];
//Inner loop to create children
for (let j = 0; j < columnsValue; j++) {
children.push(
<td>
<BootstrapInput
name={getUniqueKeyFromArrayIndex(i, j)}
onChange={onChangeHandler}
/>
</td>
);
}
table.push(
<TableRow key={i}>
<TableCell>{children}</TableCell>
</TableRow>
);
// console.log(tableCellsData);
}
return table;
};
return (
<Fragment>
<div>
<h5>Select Row number and Columns number</h5>
<div className={"rowColumnsNumber"} style={{ marginTop: 20 }}>
<TextField
id="Row-number"
label="Row(s)"
type="number"
InputLabelProps={{ shrink: true }}
inputProps={{ min: "0", max: "1000", step: "1" }}
onChange={(e) => setRowValue(e.target.value)}
variant="outlined"
/>
<TextField
id="Columns-number"
label="Columns(s)"
type="number"
inputProps={{ min: "0", max: "1000", step: "1" }}
InputLabelProps={{ shrink: true }}
onChange={(e) => setColumnsValue(e.target.value)}
variant="outlined"
/>
</div>
<br />
<div className={"TableContainer"}>
<TableContainer component={Paper}>
<Table className={classes.table} aria-label="simple table">
<TableBody>{generateTable()}</TableBody>
</Table>
</TableContainer>
</div>
</div>
</Fragment>
);
}
大部分工作已经完成。 如果您想在多维数组(在本例中为 2d)中维护 table 的数据,那么 name 属性可以在这里为您提供帮助,因为它表示由连字符分隔的行号和列号。 只需获取 name 属性值,在连字符和中提琴上拆分!你会有行号和列号,之后你只需要使用它们来设置数组中的数据。
我已经更新了 codesandbox (check console to see the data array)。更新后的代码在第 74 和 84 行之间