react的小案例 TODOList

先看效果图

在这里插入图片描述

一 添加

 let [todo,setTodo] = useState('')
 let [todos,setTodos] = useState(todoList)
   // 输入框事件
  const addtodo=useCallback(()=>{
    setisDown(false)
    if(todo){
      // value是值 isDown是否完成
      setTodos([...todos,{value:todo,isDown:false}])
    }
    setTodo('')
  },[todo])
  
  // 键盘回车
  const keyDown=(e)=>{
    if(e.keyCode===13){
      addtodo(e.target.value)
    }
  }
  
<div className="app">
    <div className="app-header">
      <img src={note} className="app-logo" alt="logo" />
      <p>To-Do List</p>
    </div>
    <h1>~ Today I need to ~</h1>
    <div className="app-input">
      <input placeholder="添加待办事项" onKeyDown={(e)=>{keyDown(e)}} value={todo} onChange={(e)=>{ setTodo(e.target.value)}}  />
      <button className={isDown ? "down" : "up"} onMouseDown={()=>{setisDown(true)}} onMouseUp={addtodo}><span>添加</span></button>
    </div>
)

二、渲染

 <ul className="app-list">
      {
        todos.map((item,index)=>{
          return <li key={index} className={item.isDone ? "done" : ""}>
             <div className="checkbox" onClick={() => toggleCheck(index)}>
                <img
                  style={{ display: item.isDone ? "block" : "none" }}
                  src={checkedImg}
                  alt="check"
                />
              </div>
                    <span>{item.value} </span>
                    <button onClick={()=>{removeList(index)}}>x</button>
                </li>
        })
      }
    </ul>

三、删除

  // 删除某个事项
  const removeList = useCallback((i)=>{
    todos.splice(i,1)
    setTodos([...todos])
  })

四、已完成

  // 切换是否完成
  const toggleCheck = useCallback((i)=>{
    todos[i].isDone = !todos[i].isDone
    setTodos([...todos  ])
  })

统计完成和未完成

  // 计算完成的
  let done = useMemo(()=>{
    let doneList=[]
    todos.forEach(item=>{
      if(item.isDone){
        doneList.push(item)
      }
    })
    return doneList.length
  },[todos])

  // 未完成 noDone
  let noDone = useMemo(()=>{
    let doneList=[]
    todos.forEach(item=>{
      if(!item.isDone){
        doneList.push(item)
      }
    })
    return doneList.length
  },[todos])

    // 删除全部已完成
    const remove = useCallback(()=>{
      todos.forEach((item,index)=>{
        if(item.isDone){
          todos.splice(index,done)
          setTodos([...todos])
        }
      })
    })

    <div className="Statistics">
      <span>任务事项:{todos.length} </span>
      <span>已完任务事项: {done}</span>
      <span>待办任务事项: {noDone}</span>
      <span onClick={remove}>清空已完成</span>
    </div>

源码

https://gitee.com/hewweibo_admin/react-todolist

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值