javascript - 删除元素后如何重新渲染列表
问题描述
我正在尝试编写一个删除方法以从列表中删除一个元素,首先我无法在 setState 函数中编写它,所以我将它作为直接函数调用,我怎样才能设法发出信号在直接函数之后重新渲染还是设法将函数放在 setState 方法中以进行自动重新渲染?
class TASKMANAGER extends Component {
constructor(props){
super(props);
this.state= {
name: "",
description:"",
priority: "urgent",
tasklist: [],
}
this.handleTitleChange= this.handleTitleChange.bind(this);
//this.handleDescriptionChange= this.handleDescriptionChange.bind(this);
//this.handlePriorityChange= this.handleDescriptionChange.bind(this);
this.handleClick= this.handleClick.bind(this);
}
handleTitleChange = event => {
this.setState( {
name: event.target.value
})
};
handleDescriptionChange = event => {
this.setState({
description: event.target.value
})
};
handlePriorityChange = event => {
this.setState({
priority: event.target.value
})
};
handleClick = event => {
this.setState((state) => {
const tasklist = [
...state.tasklist,
[
state.name,
state.description,
state.priority
]
];
return {
tasklist
};
});
//console.log(this.state.tasklist);
};
handleDelete = index => {
this.setState(() => {
this.state.tasklist.splice(index, 1)
});
console.log(this.state.tasklist)
} THIS ONE IS THE FUNCTION I CANNOT SET TO WORK TO TRIGGER THE AUTO RE-RENDER
render() {
const task_item = this.state.tasklist.map((arr, index) => (
<li
key= {index}
className= 'task'>
Task: {arr[0]} <br />
Description: {arr[1]} <br />
Priority: {arr[2]} <br />
<div className='delete-button' onClick={
/*() => {this.state.tasklist.splice(index, 1);}*/ THIS ONE IS THE DIRECT FUNCTION THAT WORKS, BUT DOESN'T TRIGGER THE RE-RENDER, IT SHOWS WHEN I TYPE AGAIN ON THE INPUTS
this.handleDelete
}>delete</div>
</li>
))
return (
<div>
<div className= 'task-form'>
<form>
<div>
<label>Name your task!</label>
<input type= 'text' id='task-title' value={this.state.name} onChange={this.handleTitleChange} />
</div>
<div>
<label>Description?</label>
<textarea id='description' value={this.state.description} onChange={this.handleDescriptionChange}/>
</div>
<div>
<label>Priority?</label>
<select value={this.state.priority} onChange={this.handlePriorityChange}>
<option value='urgent'>Urgent</option>
<option value='regular'>Regular</option>
<option value='Can wait'>Can wait</option>
</select>
</div>
</form>
<button onClick={this.handleClick}>PRESS</button>
</div>
<div className='list-items'>
<ul className='list-render'>
{task_item}
</ul>
</div>
</div>
)
}}
export default TASKMANAGER
解决方案
您不应该对当前状态进行任何更改,而是从现有状态构建一个新状态,并在此过程中生成一个新的过滤数组
handleDelete = index => {
this.setState((state) => ({
...state,
tasklist: state.taskList.filter((_,i) => i != index)
}));
}
当您将您的映射taskList
到下面的 JSX 时,您将需要避免使用项目的索引 as key
,因为使用该key
值的优化反应将在被破坏的假设下运行。使用每个项目key
保持不变且唯一的值。可能是它的名称,或者在创建时附加到它的标识符。
推荐阅读
- sql-server - 如何将主从表数据传输给具有相同关系的其他人?
- centos - 强制 CEPH 同步和建议 CEPH 更新
- vue.js - 在自定义功能组件中使用 Quasar 组件时出错
- python - Python PyQt5 - 检测点击垂直标题项(QTableWidget)
- node.js - 如何在 nodejs 中的 IBM Object Storage 中进行 CURD 操作
- go - 在 Go 中进行 linting 时,有没有办法阻止使用包中的特定函数
- continuous-integration - Bamboo 在安排新构建时停止正在进行的构建
- python - Python Selenium 通过 xpath 或 id 问题查找元素
- javascript - 在 HTML 中一次性使用的大型 Vue 组件
- android - 打开和关闭键盘后对话框中的视图消失