千峰React:案例一

做这个案例捏

因为需要用到样式,所以创建一个样式文件:

css 复制代码
//29_实战.module.css
.active{
    text-decoration:line-through
}

然后创建jsx文件,修改main文件:导入Todos,写入Todos组件

javascript 复制代码
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import Todos from './28_实战'

createRoot(document.getElementById('root')).render(
  <StrictMode>
    <Todos />
  </StrictMode>
)

Todos.jsx文件需要先写渲染组件的基本结构:

javascript 复制代码
function Todos() {

  return (
    <div>
   
    </div>
  )
}
export default Todos

观察案例,首先需要一个添加任务的文本框、点击添加任务的按钮、用value使用可控组件改变value值,记得加onChange:

javascript 复制代码
return (
    <div>
      <input type='text' value={msg} onChange={handleChange} />
      <button onClick={handleClick}>点击添加任务</button>
    </div>
  )

改变value的值、使用Immer整合更改

javascript 复制代码
 const [msg, setMsg] = useState('')
  const [list, setList] = useImmer([])
 const handleChange = (e) => {
    setMsg(e.target.value)
  }
  const handleClick = () => {
    setList((draft) => {
      draft.unshift({ id: list.length, task: msg, checked: false })
    })
    setMsg('')
  }

复选框功能:

javascript 复制代码
 const unCompleteList = list.filter((item) => !item.checked)
  const completeList = list.filter((item) => item.checked)
  const handleChecked = (e, id) => {
    setList((draft) => {
      draft.find((item) => item.id === id).checked = e.target.checked //更改对应id的数据的复选框状态
    })
  }

return(
  <div>
      {/* {未完成的列表} */}
      <CompleteList
        title={<h2>未完成的任务:{unCompleteList.length}个</h2>}
        handleChecked={handleChecked}
        list={unCompleteList}
      />
      {/* {已完成的列表} */}
      <CompleteList
        title={<h2>已完成的任务:{completeList.length}个</h2>}
        list={completeList}
        handleChecked={handleChecked}
      />
    </div>)

列表的组件

javascript 复制代码
function CompleteList({
  title = '',
  list = [],
  handleChecked = function () {},
}) {
  return (
    <>
      {title}
      <ul>
        {list.map((item) => {
          return (
            <li
              key={item.id}
              className={classNames({ [style.active]: item.checked })}
            >
              <input
                type='checkbox'
                checked={item.checked}
                onChange={(e) => handleChecked(e, item.id)}
              />
              {item.task}
            </li>
          )
        })}
      </ul>
    </>
  )
}

整体的代码

javascript 复制代码
import { func } from 'prop-types'
import { useState } from 'react'
import { useImmer } from 'use-immer'
import classNames from 'classnames'
import style from './29_实战.module.css'

function CompleteList({
  title = '',
  list = [],
  handleChecked = function () {},
}) {
  return (
    <>
      {title}
      <ul>
        {list.map((item) => {
          return (
            <li
              key={item.id}
              className={classNames({ [style.active]: item.checked })}
            >
              <input
                type='checkbox'
                checked={item.checked}
                onChange={(e) => handleChecked(e, item.id)}
              />
              {item.task}
            </li>
          )
        })}
      </ul>
    </>
  )
}

function Todos() {
  const [msg, setMsg] = useState('')
  const [list, setList] = useImmer([])
  const unCompleteList = list.filter((item) => !item.checked)
  const completeList = list.filter((item) => item.checked)
  const handleChange = (e) => {
    setMsg(e.target.value)
  }
  const handleClick = () => {
    setList((draft) => {
      draft.unshift({ id: list.length, task: msg, checked: false })
    })
    setMsg('')
  }
  const handleChecked = (e, id) => {
    setList((draft) => {
      draft.find((item) => item.id === id).checked = e.target.checked //更改对应id的数据的复选框状态
    })
  }
  return (
    <div>
      <input type='text' value={msg} onChange={handleChange} />
      <button onClick={handleClick}>点击添加任务</button>
      {/* {未完成的列表} */}
      <CompleteList
        title={<h2>未完成的任务:{unCompleteList.length}个</h2>}
        handleChecked={handleChecked}
        list={unCompleteList}
      />
      {/* {已完成的列表} */}
      <CompleteList
        title={<h2>已完成的任务:{completeList.length}个</h2>}
        list={completeList}
        handleChecked={handleChecked}
      />
    </div>
  )
}
export default Todos

效果:

相关推荐
treasure14010 小时前
【复古】浅尝Django前后端不分离
前端·css·python·django·bootstrap·html·web
jay神11 小时前
基于 YOLOv8 的手势识别系统(Web 版)
前端·人工智能·python·深度学习·yolo·计算机视觉·计算机毕业设计
屏什么录11 小时前
长时间录屏中途崩溃:MP4 打不开的 6 种救回方案与参数设置
前端·音视频开发
code_Bo11 小时前
不只命令行:我把跨 Agent 会话同步做成了桌面应用
前端·javascript·后端
kyriewen11 小时前
AI 能把页面写出来,为什么改个需求就开始崩?
前端·javascript·人工智能
涛涛ing13 小时前
2026年最值得关注的前端变化,藏在“默认值”里
前端
亿元程序员14 小时前
太牛了!这AI做出来的游戏,居然还能变现!
前端
hellice15 小时前
闪传 FlashDrop 实战:我用 300 行 Node 代码做了个「4 位取件码」临时文件中转站
前端·产品
用户08297732600515 小时前
RTX 5500 MIG 踩坑记录:切分之后模型跑不起来,排错整整一下午
前端
Lank_M15 小时前
AI 放大后的图更清楚,但它不能当原图入库
前端