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

效果:

相关推荐
码事漫谈5 小时前
大模型输出的“隐性结构塌缩”问题及对策
前端·后端
这儿有一堆花5 小时前
前端三件套真的落后了吗?揭开现代 Web 开发的底层逻辑
前端·javascript·css·html5
.Cnn6 小时前
JavaScript 前端基础笔记(网页交互核心)
前端·javascript·笔记·交互
醉酒的李白、6 小时前
Vue3 组件通信本质:Props 下发,Emits 回传
前端·javascript·vue.js
anOnion6 小时前
构建无障碍组件之Window Splitter Pattern
前端·html·交互设计
NotFound4866 小时前
实战分享Python爬虫,如何实现高效解析 Web of Science 文献数据并导出 CSV
前端·爬虫·python
徐小夕7 小时前
PDF无限制预览!Jit-Viewer V1.5.0开源文档预览神器正式发布
前端·vue.js·github
WangJunXiang67 小时前
Haproxy搭建Web群集
前端
吴声子夜歌7 小时前
Vue.js——自定义指令
前端·vue.js·flutter
小芝麻咿呀7 小时前
vue--面试题第一部分
前端·javascript·vue.js