我正在学习React,并且目前正在尝试创建一个待办事项列表。一切都运作良好,但是当我尝试从数组中删除一个项目时,整个页面都会重新渲染。
请问有人可以告诉我我错在哪里吗?我只想在点击按钮后删除特定的项目,而不重新渲染整个页面。
代码:
import React, { Component } from "react";
import "./todo.css";
class Todo extends Component {
constructor(props) {
super(props);
this.state = {
task: "",
taskList: []
};
}
handleAdd = e => {
e.preventDefault();
this.setState({
task: "",
taskList: [...this.state.taskList, this.state.task]
});
};
onChange = e => {
this.setState({
task: e.target.value
});
};
handleDelete = task => {
console.log(task);
const newtaskList = this.state.taskList.splice(task, 1);
this.setState({
taskList: newtaskList
});
console.log(task);
};
render() {
return (
<form className='App'>
<div className='input input-group mb-3'>
<input
type='text'
className='form-control'
placeholder='Enter a task'
value={this.state.task}
onChange={this.onChange}
/>
<button className='btn btn-primary' onClick={this.handleAdd}>
ADD
</button>
</div>
<div className='output' id='output'>
<ul className='list-group'>
{this.state.taskList.map((task, index) => (
<li
className='list-group-item'
key={index}
style={{
display: "flex",
justifyContent: "space-between",
alignContent: "center"
}}>
{task}
<div className='input-group-prepend'>
<button
className='btn btn-danger'
onClick={() => this.handleDelete(task)}>
Done
</button>
</div>
</li>
))}
</ul>
</div>
</form>
);
}
}
handleDelete
函数中添加e.preventDefault();
。这样可以防止默认行为的发生。 - Utsav PatelonClick={() => this.handledelete(task)}
替换为onClick={(e) => this.handledelete(e, task)}
。 - Sajeeb Ahamedtype
,例如<button type="button"
即可解决问题。 - palaѕн