我在react中创建了一个普通的动态表(而不是使用)。我想更改单击行的背景色。我在表中添加了ref :但我无法访问children ()。
如何在react中更改表中按id单击的行的样式?
import React, { useEffect, useRef } from "react";
import "./TableBox.css";
const TableBox = ({ table_data }) => {
const myTable = useRef(null);
useEffect(() => {
console.log("myTable", myTable.current);
});
const handlerRowClicked = (event) => {
// console.log('clicked')
// myTable.current.backgroundColor='blue'
};
return (
<div>
<table ref={myTable}>
<thead>
<tr>
{Object.keys(table_data[0]).map((title) => (
<th key={title}>{title}</th>
))}
</tr>
</thead>
<tbody>
{table_data.map((row, index) => (
<tr key={index} id={index} onClick={handlerRowClicked}>
{Object.keys(row).map((key) => (
<td key={row[key]}>{row[key]}</td>
))}
</tr>
))}
</tbody>
</table>
</div>
);
};
export default TableBox;发布于 2021-04-22 15:18:03
您可以做的最简单的解决方案是将单击行的索引保存在状态中,并在循环槽table_data时将其用作条件。
const TableBox = ({ table_data }) => {
const myTable = useRef(null);
const [rowIndexClicked, setRowIndexClicked] = useState(null);
useEffect(() => {
console.log("myTable", myTable.current);
});
const handlerRowClicked = (rowIndex) => (event) => {
if (rowIndexClicked !== rowIndex) {
// handle if user clicks again the same row
setRowIndexClicked(rowIndex);
} else {
setRowIndexClicked(null); // set clicked row to null if same row is selected
}
};
return (
...
{table_data.map((row, index) => (
<tr
key={index}
id={index}
className={rowIndexClicked === index ? "clicked-class" : ""}
onClick={handlerRowClicked(index)}
>
{Object.keys(row).map((key) => (
<td key={row[key]}>{row[key]}</td>
))}
</tr>
))}
...
);
};使用useRef不会给您带来任何优势。您可以在其中存储单击元素,但是没有理由不使用最简单的方法。
解决方案2
如果您仍然希望从单击元素本身获取id,则只需使用从单击事件中获得的event:
const TableBox = ({ table_data }) => {
const myTable = useRef(null);
const [rowIndexClicked, setRowIndexClicked] = useState(null);
useEffect(() => {
console.log("myTable", myTable.current);
});
const handlerRowClicked = (event) => {
const { id } = event.currentTarget;
if (rowIndexClicked !== id) {
// handle if user clicks again the same row
setRowIndexClicked(id);
} else {
setRowIndexClicked(null); // set clicked row to null if same row is selected
}
};
return (
...
{table_data.map((row, index) => (
<tr
key={index}
id={index}
className={rowIndexClicked === index ? "clicked-class" : ""}
onClick={handlerRowClicked}
>
{Object.keys(row).map((key) => (
<td key={row[key]}>{row[key]}</td>
))}
</tr>
))}
...
);
};发布于 2021-04-22 15:15:04
为此目的使用裁判最有可能是一种过度杀戮。相反,我建议您使用useState,并附加一个className或style。
例如:
import React, { useEffect, useRef } from 'react'
import './TableBox.css'
const TableBox = ({ table_data }) => {
const [selectedRow, setSelectedRow] = useState(-1);
...
const handlerRowClicked = useCallback((event) => {
// if you insist to use `id`
const { id } = event.currentTarget;
setSelectedRow(id);
}, [])
...
<table>
...
<tr onClick={handlerRowClicked} className={selectedRow === index ? 'selected: ''}>有一些更好的实践如何处理className,但这说明了这个想法。
https://stackoverflow.com/questions/67215963
复制相似问题