【发布时间】:2020-04-17 02:25:00
【问题描述】:
我用 React 创建了一个待办事项列表。我希望能够通过单击它们来标记已完成的任务。我还希望能够通过单击按钮清除已完成的任务。这两个功能无法与我设置的代码一起正常工作。当我单击单个待办事项以将其标记为已完成时,列表中的每个待办事项都会被标记为已完成,因此显示为“直通”。当我然后单击指定按钮清除已完成的任务时,绝对没有任何反应。有人可以帮我解决这两个问题吗?
App 组件代码:
class App extends React.Component {
constructor() {
super();
this.state = {
todos: [
{
task: "learn how to fly drone",
id: Date.now(),
completed: false
},
{
task: "learn React class components",
id: Date.now(),
completed: false
},
{
task: "practice editing videos",
id: Date.now(),
completed: false
},
{
task: "read Ten Years A Nomad",
id: Date.now(),
completed: false
}
],
todo: ''
}
}
inputChangeHandler = event => {
this.setState({[event.target.name]: event.target.value})
}
addTask = event => {
event.preventDefault();
let newTask = {
task: this.state.todo,
id: Date.now(),
completed: false
};
this.setState({
todos: [...this.state.todos, newTask],
todo: ''
})
}
toggleComplete = itemId => {
const todos = this.state.todos.map(todo => {
if (todo.id === itemId) {
todo.completed = !todo.completed
}
return todo
});
this.setState({todos, todo: ''})
}
clearCompleted = e => {
e.preventDefault();
return this.state.todos.filter(item => !item.completed)
}
render() {
return (
<div className="App">
<h2>Welcome to your Todo App!</h2>
<TodoList
todos={this.state.todos}
toggleComplete={this.toggleComplete} />
<TodoForm todos={this.state.todos} value={this.state.todo} inputChangeHandler={this.inputChangeHandler} addTask={this.addTask} clearCompleted={this.clearCompleted}/>
</div>
);
}
}
export default App;
待办事项列表:
const TodoList = props => {
return (
<div>
{props.todos.map((todo, id) => (
<Todo
todo={todo}
key={id}
toggleComplete={props.toggleComplete} />
))}
</div>
)
}
export default TodoList;
待办事项:
const Todo = props => {
return (
<div
key={props.todo.id}
onClick={() => {
props.toggleComplete(props.todo.id)
}}>
<p
style={{textDecoration: props.todo.completed ? 'line-through' : 'none'}}>
{props.todo.task}
</p>
</div>
)
}
export default Todo;
TodoForm:
const TodoForm = props => {
return (
<form>
<input
name="todo"
value={props.value}
type="text"
onChange={props.inputChangeHandler}
placeholder="Enter new task" />
<button onClick={props.addTask}>Add Todo</button>
<button onClick={props.clearCompleted}>Clear Completed</button>
</form>
)
}
export default TodoForm;
【问题讨论】:
标签: javascript arrays reactjs onclick