千峰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

效果:

相关推荐
potender4 分钟前
前端基础学习html+css+js
前端·css·学习·html·js
Hilaku12 分钟前
你以为的 Tailwind 并不高效,看看这些使用误区
前端·css·前端框架
帅夫帅夫14 分钟前
Vibe Coding从零开始教你打造一个WebLLM页面
前端·人工智能
Vonalien14 分钟前
Trae 深度体验:从怀疑到真香,AI 如何重塑我的开发流?
前端
刘白Live15 分钟前
【html】localStorage设置和获取局部存储的值
前端
白瓷梅子汤16 分钟前
跟着官方示例学习 @tanStack-table --- Basic
前端·react.js
openInula前端开源社区16 分钟前
【openInula茶话会】第三期:Vue转换到openInula技术揭秘
前端·javascript
哄哄57516 分钟前
Antd中Upload组件封装及使用:
前端
哄哄57516 分钟前
人工智能之web前端开发(deepSeek与文心一言结合版)
前端
哄哄57517 分钟前
js如何将deepSeek生成的报告添加封面并下载成word
前端