zoukankan      html  css  js  c++  java
  • react-hooks实现todolist

    分而治之

    import React , {useState, useCallback, useRef, useEffect, memo} from 'react';
    import './ToDoList.css';
    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;
    
    • 添加TODO组件
    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>
    })
    
    • TODO列表项组件
    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>
    })
    
    • TODO列表组件
    onst 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>
        )
    })
    
  • 相关阅读:
    C#文件操作常用相关类(Directory类、File类、Path类)
    winform使用相对路径读取文件的方法
    设置GridView不换行强制GridView不换行GridView强制不换行
    VS2010 Visual Studio2010 保护视力 背景色设置颜色设置
    20190306
    20190325
    常用DOS命令
    项目创建
    VS2015自定义工具栏,往工具栏上添加按钮
    ping不通公网ip时路由器设置
  • 原文地址:https://www.cnblogs.com/Lewiskycc/p/12470489.html
Copyright © 2011-2022 走看看