import { useState, useRef } from 'react' import './App.css' interface Todo { id: number, text: string, completed: boolean } type Filter = 'all' | 'active' | 'completed'; function filterTodos(todos: Todo[], filter: Filter): Todo[] { switch (filter) { case 'all': return todos; case 'active': return todos.filter(todo => !todo.completed); case 'completed': return todos.filter(todo => todo.completed); default: return todos; } } function Header({ addTodo }: { addTodo: (text: string) => void }) { const inpRef = useRef(null); const handleKeyDown = (e: React.KeyboardEvent) => { if (e.keyCode === 13) { addTodo(inpRef.current!.value); inpRef.current!.value = "" } } return (

todos

) } function Main({ onToggleAll, allCompleted }: { onToggleAll: (val: boolean) => void, allCompleted: boolean }) { const handleToggle = () => { allCompleted = !allCompleted; onToggleAll(allCompleted) } return (
) } function TodoItem({ todo, onDelete, onActive }: { todo: Todo, onDelete: (id: number) => void, onActive: (id: number) => void }) { const deleteTodo = (val: number) => { onDelete(val) } const activeTodo = (val: number) => { onActive(val) } return (
  • activeTodo(todo.id)} />
  • ) } function Footer({ count, clearAll, filter, tabFilter }: { count: number, clearAll: () => void, filter: Filter, tabFilter: (val: string) => void }) { console.log(filter, 'filter') return (
    {count} items left
    ) } function App() { const [todos, setTodos] = useState([ { id: 1, text: '吃饭', completed: false }, { id: 2, text: '睡觉', completed: false }, { id: 3, text: '打豆豆', completed: true } ]) const completeCount = todos.filter((item) => !item.completed).length; const isCompleted = todos.every((item) => item.completed); const [isFilter, setIsFilter] = useState('all'); const newArr = filterTodos(todos, isFilter); const handleAdd = (val: string) => { setTodos([...todos, { id: Date.now(), text: val, completed: false }]) } const handleDelete = (val: number) => { setTodos((prevTodos) => { return prevTodos.filter((todo) => todo.id !== val) }) } const handleAvtive = (val: number) => { setTodos((prevTodos) => prevTodos.map((todo) => { return todo.id === val ? { ...todo, completed: !todo.completed } : todo })) } const handleAll = (val: boolean) => { setTodos((prev) => prev.map((todo) => { return { ...todo, completed: val } })) } const handleClear = () => { setTodos([...todos.filter((todo) => !todo.completed)]) } const handleSet = (val: Filter) => { setIsFilter(val) } return ( <>
      { newArr.map((todo) => { return ( ) }) }
    ) } export default App