react-hooks實現todolist

import React , {useState, useCallback, useRef, useEffect, memo} from 'react'; import './ToDoList.css'; let idSeq = 0; const Control = memo(function Control (props) { const { addTodo } = props; const inputRef = useRef(); const onSubmit = (e) => { e.preventDefault(); const newText = inputRef.current.value.trim(); if(newText.length > 0) { addTodo({ id: ++ idSeq, text: newText, complete: false }) } inputRef.current.value = ""; } return <div className="control"> <h1>todos</h1> <form onSubmit={onSubmit}> <input type="text" className="new-todo" placeholder="what needs td be done?" ref={inputRef} /> </form> </div> }) const Todos = memo(function Todos (props) { const { todos , removeTodo, toggleTodo} = props; return ( <ul className="todos"> { todos.map(todo => { return ( <TodoItem key={todo.id} todo={todo} toggleTodo={toggleTodo} removeTodo={removeTodo} /> ) }) } </ul> ) }) const TodoItem = memo(function TodoItem (props) { const { todo: { id, text, complete } , removeTodo, toggleTodo} = props const onChange =() => { toggleTodo(id); } const onRemove = () => { removeTodo(id); } return ( <li className="todo-item"> <input type="checkbox" onChange={onChange} checked={complete}/> <label className={complete ? 'complete': ''}>{text}</label> <button onClick={onRemove}>刪除</button> </li> ) }) const ToDoList = memo(function ToDoList () { const [todos, setTodos ] = useState([]); const addTodo = useCallback((todo) => { setTodos(todos => [...todos,todo]); },[]) const removeTodo = useCallback( (id) => { setTodos(todos => todos.filter(todo => { return todo.id !== id; })) }, [] ) const toggleTodo = useCallback((id) => { setTodos(todos => todos.map(todo => { return todo.id === id ? { ...todo, complete: !todo.complete }: {...todo} })) },[]) useEffect(() => { const todos = JSON.parse(localStorage.getItem('todos')) || []; setTodos(todos); },[]) useEffect(()=> { localStorage.setItem('todos',JSON.stringify(todos)) },[todos]) return ( <div className="todo-list"> <Control addTodo={addTodo}></Control> <Todos toggleTodo={toggleTodo} removeTodo={removeTodo} todos={todos}></Todos> </div> ) }) export default ToDoList;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章