1.30 实战案例:任务列表
一、任务列表-ToDoList
代码示例:
import { useState } from 'react'
import { useImmer } from 'use-immer'
import classNames from 'classnames'
import style from './30.module.css'
interface IList {
id: number
text: string
checked: boolean
}
interface IParam {
title: string
list: IList[]
handleCheck: never
}
function CompleteList({ title = '', list = [], handleCheck }: IParam) {
return (
<>
{title}
<ul>
{list.map((item) => (
<li
key={item.id}
className={classNames({ [style.active]: item.checked })}
>
<input
type="checkbox"
checked={item.checked}
onChange={(e) => handleCheck(e, item.id)}
/>
{item.text}
</li>
))}
</ul>
</>
)
}
function App() {
const [msg, setMsg] = useState<string>('')
const [list, setList] = useImmer<IList[]>([])
const unCompleteList = list.filter((item) => !item.checked)
const completeList = list.filter((item) => item.checked)
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setMsg(e.target.value)
}
const handleClick = () => {
setList((d) => {
d.unshift({ id: list.length, text: msg, checked: false })
})
setMsg('')
}
const handlechecked = (
e: React.ChangeEvent<HTMLInputElement>,
id: number
) => {
setList((d) => {
d.find((item) => item.id === id).checked = e.target.checked
})
}
return (
<>
<div>
<input type="text" value={msg} onChange={handleChange} />
<button onClick={handleClick}>添加任务</button>
<CompleteList
title={<h2>未完成的任务:{unCompleteList.length}个</h2>}
list={unCompleteList}
handleCheck={handlechecked}
/>
<CompleteList
title={<h2>已完成的任务:{completeList.length}个</h2>}
list={completeList}
handleCheck={handlechecked}
/>
</div>
</>
)
}
export default App
最后更新于