如何将值传递给组件以删除 table 行? ReactJS 和 Material UI
How to pass value to component in order to delete table row? ReactJS and Material UI
我的目的是在点击后删除特定的 table 行。我有两个组件,并且已经编写了从 table handleDelete()
中删除行的函数。问题是,点击后,总是最后一行被删除,而不是我点击的那一行。可能我需要将值(例如 props.nameTask
)传递给 parent 组件,但它不起作用(控制台错误)。
Parent:
class Home extends Component {
constructor(props) {
super(props);
this.state = { data: [] };
this.handleDelete = this.handleDelete.bind(this);
}
// Delete row from table
handleDelete = (index) => {
var array = this.state.data.slice();
array.splice(index, 1)
this.setState({ data: array });
}
render() {
return (
<div>
<TableTasks handleDelete={this.handleDelete} data={this.state.data} header={[{ name: "Task" }, { name: "Delete" }]} />
</div>
);
}}
export default Home;
Child:
const row = (props, i, handleDelete) =>
<TableRow key={`thr-${i}`}>
<TableRowColumn>
{props.nameTask}
</TableRowColumn>
<TableRowColumn className="IconButton">
<IconButton>
<DeleteIcon onClick={handleDelete}/>
</IconButton>
</TableRowColumn>
</TableRow>;
export const TableTasks = ({ data, header, handleDelete }) =>
<Table>
<TableHeader>
<TableRow>
{header.map((x, i) =>
<TableHeaderColumn key={`thc-${i}`}>
{x.name}
</TableHeaderColumn>
)}
</TableRow>
</TableHeader>
<TableBody>
{data.map((x, i) => row(x, i, handleDelete))}
</TableBody>
</Table>;
为此,您需要将一些唯一标识符传递给父组件以从数组中删除特定项目,例如名称或行索引等。
按行索引:
将索引传递给DeleteIcon
组件:
<DeleteIcon itemIndex={i} onClick={handleDelete}/>
现在从 DeleteIcon
组件调用 handleDelete
具有项目索引的函数:
this.props.handleDelete(this.props.itemIndex);
使用该索引删除特定项目。
通过任何其他唯一 属性:
同样的方法,但你需要运行循环来找到那个唯一项目的索引,在得到索引后删除项目并更新状态。
建议:
由于您正在更新父数组(删除元素),因此使用数组索引作为键不是一个好主意,请使用其他一些唯一的 属性 作为键。
查看此答案了解更多详情:
我认为问题出在您传递给父函数的索引handleDelete
,它不应该有您想要的值(尝试记录它以查看它是什么)
我建议将要删除的索引作为新的 属性 添加到 <DeleteIcon/>
元素。
将父级 handleDelete
更改为如下内容:
handleDelete = e => {
const index = e.currentTarget.getAttribute('index')
...
}
我的目的是在点击后删除特定的 table 行。我有两个组件,并且已经编写了从 table handleDelete()
中删除行的函数。问题是,点击后,总是最后一行被删除,而不是我点击的那一行。可能我需要将值(例如 props.nameTask
)传递给 parent 组件,但它不起作用(控制台错误)。
Parent:
class Home extends Component {
constructor(props) {
super(props);
this.state = { data: [] };
this.handleDelete = this.handleDelete.bind(this);
}
// Delete row from table
handleDelete = (index) => {
var array = this.state.data.slice();
array.splice(index, 1)
this.setState({ data: array });
}
render() {
return (
<div>
<TableTasks handleDelete={this.handleDelete} data={this.state.data} header={[{ name: "Task" }, { name: "Delete" }]} />
</div>
);
}}
export default Home;
Child:
const row = (props, i, handleDelete) =>
<TableRow key={`thr-${i}`}>
<TableRowColumn>
{props.nameTask}
</TableRowColumn>
<TableRowColumn className="IconButton">
<IconButton>
<DeleteIcon onClick={handleDelete}/>
</IconButton>
</TableRowColumn>
</TableRow>;
export const TableTasks = ({ data, header, handleDelete }) =>
<Table>
<TableHeader>
<TableRow>
{header.map((x, i) =>
<TableHeaderColumn key={`thc-${i}`}>
{x.name}
</TableHeaderColumn>
)}
</TableRow>
</TableHeader>
<TableBody>
{data.map((x, i) => row(x, i, handleDelete))}
</TableBody>
</Table>;
为此,您需要将一些唯一标识符传递给父组件以从数组中删除特定项目,例如名称或行索引等。
按行索引:
将索引传递给DeleteIcon
组件:
<DeleteIcon itemIndex={i} onClick={handleDelete}/>
现在从 DeleteIcon
组件调用 handleDelete
具有项目索引的函数:
this.props.handleDelete(this.props.itemIndex);
使用该索引删除特定项目。
通过任何其他唯一 属性:
同样的方法,但你需要运行循环来找到那个唯一项目的索引,在得到索引后删除项目并更新状态。
建议:
由于您正在更新父数组(删除元素),因此使用数组索引作为键不是一个好主意,请使用其他一些唯一的 属性 作为键。
查看此答案了解更多详情:
我认为问题出在您传递给父函数的索引handleDelete
,它不应该有您想要的值(尝试记录它以查看它是什么)
我建议将要删除的索引作为新的 属性 添加到 <DeleteIcon/>
元素。
将父级 handleDelete
更改为如下内容:
handleDelete = e => {
const index = e.currentTarget.getAttribute('index')
...
}