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
    评论
React 版本的 ToDo List 可以使用 React 的组件化开发方式来实现。首先,你需要创建一个名为 `TodoList` 的 React 组件,它将包含待办事项列表并管理其状态。 ```jsx import React, { useState } from 'react'; const TodoList = () => { const [todos, setTodos] = useState([]); const [inputValue, setInputValue] = useState(''); const addTodo = () => { if (inputValue.trim() !== '') { setTodos([...todos, inputValue]); setInputValue(''); } }; const removeTodo = (index) => { const updatedTodos = todos.filter((_, i) => i !== index); setTodos(updatedTodos); }; return ( <div> <input type="text" value={inputValue} onChange={(e) => setInputValue(e.target.value)} /> <button onClick={addTodo}>Add</button> <ul> {todos.map((todo, index) => ( <li key={index}> {todo} <button onClick={() => removeTodo(index)}>Remove</button> </li> ))} </ul> </div> ); }; export default TodoList; ``` 在上面的代码中,我们使用了 React 的 `useState` 钩子来创建了 `todos` 和 `inputValue` 两个状态。`todos` 用于存储待办事项列表,`inputValue` 用于获取输入框的值。 `addTodo` 函数用于将输入框的内容添加到 `todos` 列表中,并清空输入框的值。`removeTodo` 函数用于移除指定位置的待办事项。 在组件的返回部分,我们渲染了一个输入框、一个添加按钮和一个待办事项列表。通过 `map` 方法遍历 `todos` 列表,并为每一个待办事项创建一个包含删除按钮的列表项。 你可以将这个 `TodoList` 组件嵌入到你的 React 应用中,从而实现一个基本的 ToDo List 功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值