reactjs - 单击时将元素从一个容器转移到下一个容器
问题描述
我正在创建一个待办事项列表,用户可以在其中添加任务列表,一旦他们单击完成的复选框,它就会出现在另一个容器中
当我单击复选框时,我收到一条错误消息,提示 this.props.handleComplete(this.props.title) 不是函数。
App.js 是父组件,todo 是实际的 todo 项,active 和 completed 都是容器。
import React from 'react';
import Active from './Components/Active';
import Completed from './Components/Completed';
import Todoform from './Components/Todoform';
import './App.css';
class App extends React.Component {
state = {
items: [],
task: '',
id: 0,
completedItems: []
}
handleInput = (event) => {
this.setState({
task: event.target.value
})
}
handleSubmit = (event) => {
event.preventDefault()
const newTask = {
id: this.state.id,
title: this.state.task
}
const updatedItems = [...this.state.items, newTask]
this.setState({
items: updatedItems,
task: '',
id: this.state.id + 1
})
}
handleComplete = (newTask) => {
this.setState({completedItems: [...this.state.completedItems,
newTask]})
}
render() {
return (
<div id="main-content">
<h1>Task Lister</h1>
<Todoform
handleChange={this.handleInput}
handleSubmit={this.handleSubmit}
task={this.state.task}
/>
<Active
items={this.state.items}
handleComplete={this.handleComplete}
/>
<Completed
completedItems={this.state.completedItems}
/>
</div>
)
}
}
export default App;
import React from 'react'
class Todo extends React.Component{
state = {
checked: false
}
handleCheck = () => {
this.setState({
checked: !this.state.checked
})
}
handleClick = () => {
if(this.state.checked){
this.props.handleComplete(this.props.title)
}
}
render(){
const {title} = this.props
return (
<div className="ui checked checkbox">
<input type="checkbox" checked={this.state.checked}
onChange={this.handleCheck} onClick={this.handleClick}/>
<label>Completed {title}</label>
</div>
)
}
}
export default Todo;
import React from 'react'
import Todo from './Todo'
const Active = (props) => {
const { items, handlecompletedList} = props
return(
<div id="activeList">
<h2 className="position">Active</h2>
<ul id="tasks">
{
items.map(item => {
return(
<Todo key={item.id} handlecompleted=.
{handlecompletedList} title={item.title}/>
)
})
}
</ul>
</div>
)
}
export default Active;
import React from 'react'
import Todo from './Todo'
const Completed = (props) => {
const { completedItems } = props
return(
<div id="completedList">
<h2 className="position">Completed</h2>
<ul id="tasks">
{
completedItems.map(item => {
return(
<Todo key={item.id} title={item.title}/>
)
})
}
</ul>
</div>
)
}
export default Completed
解决方案
您正在发送handleComplete
到<Active>
组件,但它也需要发送到<ToDo>
组件:
const Active = (props) => {
const { items, ..., ---> handleComplete <--- } = props
...
return (items.map(item => (
<Todo key={item.id} title={item.title} ... handleComplete={handleComplete} />
));
}
(一般来说,您的代码需要进行一些重新设计,您在组件之间进行冗余工作,但这是一个好的开始!)
推荐阅读
- vb.net - 使用 DragDrop VB.Net 复制文件
- python-3.x - 在python dict中计算相等的值(碰撞)
- angular - Angular 12/rxjs 7/angularfire:不推荐使用 toPromise 的异步令牌拦截器
- python - 如何删除列中包含“无评论”字符串的行?
- python - 如何以不同的方式在骰子上获得点,我无法弄清楚
- android - 我可以在 iOS 和 android 应用程序中为 Google 登录设置嵌入式 Web 视图的用户代理吗?
- docker - 不了解 docker build --secret 应该如何使用
- javascript - 在 React 中使用 props 控制 Kendo PanelBar 的展开状态
- algorithm - 试图找到问题 Power Sum 解决方案的复杂性
- cypress - 如何在 Cypress 中处理 Cross Origin iframe 元素?