React组件化开发实现全选反选框

速通-React基础(结合Ant Design练习) 记录了学习React的基本内容、一些学习案例 阅读详情

一、效果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、实现步骤

1.通过 create-react-app 初始化项目

2.拆分组件

List组件:包含选项
Item组件:选项
CheckAll:全选反选
Footer:展示被选项

文件结构如下:
在这里插入图片描述

3.各组件代码

App.jsx

import React, { Component } from 'react'
import './App.css'
import List from './components/List'
import CheckAll from './components/CheckAll'
import Footer from './components/Footer'

export default class App extends Component {

    // 初始化状态
    state = {
        options: [
            { id: '001', name: '方便面', checked: true },
            { id: '002', name: '热干面', checked: true },
            { id: '003', name: '牛肉面', checked: false },
            { id: '004', name: '蟹脚面', checked: false }
        ]
    }

    // 更新选择框状态
    updateChecked = (id, checked) => {
        const { options } = this.state
        const newOptions = options.map((optionObj) => {
            if (optionObj.id === id) {
                return { ...optionObj, checked: checked }
            } else {
                return optionObj
            }
        })
        this.setState({ options: newOptions })
    }

    // 全选反选
    checkAll = (checked) => {
        const { options } = this.state
        const newOptions = options.map((optionObj) => {
            return { ...optionObj, checked: checked }
        })
        this.setState({ options: newOptions })
    }

    render() {
        const { options } = this.state
        return (
            <div className="check-container">
                <div className="check-wrap">
                    <List options={options} updateChecked={this.updateChecked} />
                    <CheckAll options={options} checkAll={this.checkAll} />
                    <Footer options={options} />
                </div>
            </div>
        )
    }
}

App.css

/* base */
body {
    background: #fff;
  }
  
  .check-container {
    width: 600px;
    margin: 0 auto;
  }
  .check-container .check-wrap {
    padding: 10px;
    border: 1px solid #ddd;
    border-radius: 5px;
  }
  

List组件

index.jsx
import React, { Component } from 'react'
import Item from '../Item'
import './index.css'

// 列表组件,包含选项
export default class List extends Component {
    render() {
        const { options, updateChecked } = this.props
        return (
            <ul className="check-main">
                {
                    options.map(option => {
                        return <Item key={option.id} {...option} updateChecked={updateChecked} />
                    })
                }
            </ul>
        )
    }
}

index.css
  /*main*/
  .check-main {
    margin-left: 0px;
    border: 1px solid #ddd;
    border-radius: 2px;
    padding: 0px;
  }

Item组件

index.jsx
import React, { Component } from 'react'
import './index.css'

// 选项组件
export default class Item extends Component {

    // 标识鼠标移入移出
    state = { mouse: false }

    // 鼠标移入、移出的回调
    handleMouse = (flag) => {
        return () => {
            this.setState({ mouse: flag })
        }
    }

    // 更新选择框的回调
    handleCheck = (id) => {
        return (event) => {
            this.props.updateChecked(id, event.target.checked)
        }
    }

    render() {
        const { mouse } = this.state
        const { id, name, checked } = this.props
        return (
            <li style={{ backgroundColor: mouse ? '#ddd' : 'white' }} onMouseEnter={this.handleMouse(true)} onMouseLeave={this.handleMouse(false)} >
                <label>
                    <input type="checkbox" checked={checked} onChange={this.handleCheck(id)} />
                    <span>{name}</span>
                </label>
            </li>
        )
    }
}

index.css
  /*item*/
  li {
    list-style: none;
    height: 36px;
    line-height: 36px;
    padding: 0 5px;
    border-bottom: 1px solid #ddd;
  }
  
  li label {
    float: left;
    cursor: pointer;
  }
  
  li label li input {
    vertical-align: middle;
    margin-right: 6px;
    position: relative;
    top: -1px;
  }
  
  
  li:before {
    content: initial;
  }
  
  li:last-child {
    border-bottom: none;
  }

CheckAll组件

index.jsx
import React, { Component } from 'react'
import './index.css'

// 全选反选组件
export default class CheckAll extends Component {

    // 全选反选的回调
    handleCheckAll = (event) => {
        return this.props.checkAll(event.target.checked)
    }

    render() {
        const { options } = this.props
        const checkedNum = options.reduce((pre, option) => pre + (option.checked ? 1 : 0), 0)
        const total = options.length
        return (
            <div className="check-checkall">
                <label>
                    <input type="checkbox" checked={(checkedNum === total && total !== 0 ? true : false)} onChange={this.handleCheckAll} />
                </label>
                <span>
                    <span>已选择{checkedNum}</span> / 全部{total}
                </span>
            </div>
        )
    }
}

index.css
  /*footer*/
  .check-checkall {
    height: 40px;
    line-height: 40px;
    padding-left: 6px;
    margin-top: 5px;
  }
  
  .check-checkall label {
    display: inline-block;
    margin-right: 20px;
    cursor: pointer;
  }
  
  .check-checkall label input {
    position: relative;
    top: -1px;
    vertical-align: middle;
    margin-right: 5px;
  }
  

Footer组件

index.jsx
import React, { Component } from 'react'
import './index.css'

// 已选择框组件
export default class Footer extends Component {
    render() {
        const { options } = this.props
        return (
            <div className='check-footer'>
                <span>已选择:{options.map((optionObj) => { return optionObj.checked === true ? optionObj.name + ' ' : null })}</span>
            </div>
        )
    }
}

index.css
无

渲染组件到页面 index.js

import React from 'react'
import ReactDOM from 'react-dom'
import App from './App'

ReactDOM.render(<App />,document.getElementById('root'))

输入 yarn start 启动项目

经典带复选框树形菜单实现与优化实战 htmltable {th, td {th {pre {简介:树形菜单是IT领域中常见的UI组件,用于展示具有层次结构的数据,如文件系统或网站导航。带复选框的树形菜单在节点上集成选择功能,支持多选操作,广泛应用于文件管理、权限配置等场景。本文介绍一个经过优化的“经典带复选框树形菜单”实现方案,通过简化交互逻辑、提升视觉设计和增加批量操作功能(如全选、反选),显著改善用户体验。 阅读详情

相关推荐

react实现复选框全选和反选组件效果

主要为大家详细介绍了react实现复选框全选和反选组件效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

react如何实现拖拽组件?如何实现拖拽排序功能呢(拖拽移动位置)?

在定义鼠标按下事件时(MouseDown)我们需要将它的x,y鼠标坐标改为我们的当前鼠标的坐标位置-元素位于我们页面的xy坐标位置,这样就可以获取我们鼠标在元素中的x,y坐标位置。首先实现拖拽必须定义定位为固定定位,我们在组件中定义一个盒子,设置为固定定位,并且设置top值以及left值,这两个由于是变化的因此我们需要定义state值从而拖过拖拽改变该值。移动时需要定义移动鼠标方法(onMouseMove),定义它的位置为当前坐标位置-在页面的坐标位置,这样减去偏移量可以获取到我们移动到的位置。

A_lose的博客 6779

ReactJS实现表单的单选多选和反选的示例

本文介绍了ReactJS实现表单的单选多选和反选的示例,分享给大家,希望对大家有所帮助。 需求是对列表实现单选,反选和多选,全部清除的操作 ...... this.state = { //初始化空数组,表示已经选择的 selectedStores:[], } ...... handleClick(e){ const newSelection = e.target.value;//拿到点击的具体一项 let newSelectionArray;//新建一个空数组 //判断点击项是否为选择状态,是的话清除选中状态 if(this.state.selectedStores.

antd react可拖拽,布局配置

import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';可拖拽的包 可拖拽:DraggableRow/index.jsx import React, { useState,useRef } from 'react'; import { Modal, Form, Select, Input, Button, Row, Col,Tooltip} from 'antd' import { DragDropConte

zhangyubababa的博客 2423

S4 HANA 1809+折旧过账(AFAB/AFABN)凭证行数据存储逻辑变迁:从BSEG到ACDOCA的深度解析

本文深度解析了S4 HANA 1809+版本中折旧过账(AFAB/AFABN)凭证行数据存储逻辑的变迁,从传统的BSEG表迁移到ACDOCA表。文章详细探讨了这一变更的技术背景、官方设计意图及实际影响,包括数据存储量减小和系统性能提升等优势。同时提供了升级项目的应对策略和最佳实践建议,帮助用户顺利过渡到新的数据存储模型。

weixin_28731223的博客 294

STM32G0——USB虚拟串口

STM32G0用cubeMX配置实现USB虚拟串口

阿昌 2322

React antd使用踩坑总结2

前端

CD2N_Queen的博客 2027

【物联网】探索NE555:一款经典的集成电路(超详细)

NE555是一种集成电路,其内部结构包括比较器、RS触发器、电压比较器和输出级三个主要功能模块,外部引脚则提供了与其他电路元件进行连接的接口。NE555的设计目的是为了提供一种简单方便的定时器解决方案,它广泛应用于模拟和数字电路中。NE555作为一款经典的集成电路,具备设计简单、易于使用和稳定可靠的特点,在电子领域发展了广泛的应用。从单稳态模式到多稳态模式,再到振荡器模式,NE555可以满足不同的需求,并且可以与其他电路元件灵活组合,扩展其功能。然而,需要注意的是NE555也有一些限制。

Goforyouqp的博客 6万+

你知道Compositionstart和Compositionend事件吗,react 组件库之Input组件的坑

Input组件大家都用过,是吧,但是你有没有想过这样一个场景,如下图,我正在搜索数据你组件上注册了onChange事件,然后边输入,底下会显示你搜索相关的内容,但是有一个问题就是,输入中文的时候,你比如打三国的三字,要先输入san然后才出现三可问题来了,onChange事件监听的是san,已经开始搜索了,其实我们根本不想这样,我们想的是中文的话,等中文显示在输入框,也就是输入完“三”这个字的时候,才搜索。这个咋办。

梅花寺 1527

ESP32-S3双模CMSIS-DAP调试器:USB+WiFi无线调试方案

CMSIS-DAP是ARM生态中标准化的嵌入式调试协议接口,广泛用于Keil、IAR、STM32CubeIDE等开发环境。其核心原理是通过SWD/JTAG物理层实现目标芯片寄存器访问、内存读写与断点控制,依赖确定性时序和低延迟通信。传统DAPLink调试器受限于USB线缆束缚,而WiFi-USB-DAPLink项目将完整CMSIS-DAP v2协议栈移植至ESP32-S3平台,同时支持USB CDC直连与WiFi TCP远程通道,兼顾实时性与网络化部署能力。该方案无需主机驱动、兼容主流IDE,并支持多机并发

weixin_31185473的博客 372

架构设计之架构治理

架构治理的本质是“用规则约束复杂性,用流程保障落地,用数据驱动优化”先定目标:明确量化的治理目标,避免盲目行动;立标准:建立覆盖分层、选型、接口、拆分的统一规范,奠定治理基础;强评审:通过架构评审把控设计环节,提前规避风险;全流程:将治理规则贯穿设计、开发、测试、部署、运维全生命周期;重保障:通过组织、流程、工具确保治理落地,而非“纸上谈兵”;持续迭代:随业务与技术演进优化治理规则,避免“一劳永逸”。

xiaolyuh的专栏 813

react-draggable前端实现元素拖拽的组件

react-draggable前端实现元素拖拽的组件;react-file-viewer 实现DOCX文档显示相关;draft-convert/draftjs-to-html富文本编辑器;WangEditor组件富文本编辑器

在职可交流前端开发,包括:web端、uniapp等,欢迎指教。 1558

GD32F303串口DMA发送数据避坑指南:为什么你的发送函数会卡住?

本文深入解析GD32F303单片机串口DMA发送数据时常见的卡死问题,提供详细的避坑指南。从DMA传输完成中断时序、发送状态管理到双通道DMA的特别注意事项,全面剖析问题根源并给出解决方案,帮助开发者构建健壮的DMA发送机制。

weixin_27038245的博客 298

用react的组件写单选框 多选框 下拉菜单并进行双向绑定(2018/12/10)

一、单选 App.js import React,{Component} from "react" class App extends Component{ constructor(){ super(); this.state={ radioVal:'男' } ...

baitong0848的博客 1872

费雪的未来增长评估:预测颠覆性技术的影响

本文旨在提供一个系统性的框架,用于评估和预测颠覆性技术的增长轨迹。我们将重点关注费雪增长模型(Fisher-Pry Model)这一经典技术扩散理论,探讨其在现代技术预测中的应用价值。文章首先介绍费雪增长模型的基本概念,然后深入其数学原理和算法实现。随后展示实际应用案例,讨论工具资源,最后探讨未来发展趋势。每个部分都包含详细的技术实现和理论分析。费雪增长模型(Fisher-Pry Model):一种描述技术替代过程的S型增长模型,用于预测新技术取代旧技术的速率。

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 929

基于CST的PCB通孔三维建模实例

本文简明扼要地描述了如何利用CST的参数化脚本快速生成PCB的通孔三维模型,非常适合于进行快速精准的PCB参数分析。

一只豌豆象的博客 1838

夺命雷公狗-----React---28--小案例之react经典案例todos(全选和反选)完

这个功能实现的步骤如下所示: 最终实现全选和反选,代码如下所示: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Docum...

weixin_30726161的博客 148

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【React Hooks 案例】封装Button组件、checkbox组件 实现checkbox复选功能

文章目录案例效果项目搭建编写组件组件入口MyButton组件使用MyButton组件MyCheckbox组件使用MyCheckbox组件MyCheckboxList组件功能逻辑梳理(实现全部选择、全部撤销逻辑)渲染列表内容实现逻辑功能 案例效果 项目搭建 项目使用cdn的方式搭建 新建项目文件夹 初始化文件夹npm init -y 安装依赖yarn add vite sass -D 修改项目package.json中的启动项目命令script下面的test为dev: vite 在根目录下新建inde

马云 2297

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【第三章-react 应用(基于 react 脚手架)】

1.脚手架: 用来帮助程序员快速创建一个基于 xxx 库的模板项目;2. 提供了一个用于创建 项目的脚手架库: ; 3.项目的整体技术架构为:; 4.使用脚手架开发的项目的特点:模块化,组件化,工程化。创建项目成功: 页面效果: favicon.icon ------ 网站页签图标(偏爱图标) index.html --------主页面 logo192.png ------- logo 图 logo512.png ------- logo 图 manifest.json ----- 应用加壳的配置文件

nunumaymax的博客 489

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【精通篇】打造React Native鸿蒙跨平台开发高级复合组件库开发系列:基于HarmonyOS API 24,Checkbox 复选框(用于在选中和非选中状态之间进行切换)

幸运的是,Python 标准库内置的 collections 模块提供了更多的选择。• defaultdict:字典子类,可以通过调用用户自定义的工厂函数来设置缺失值。• deque:双端队列,类似列表,是栈和队列的一般化,可以在两端快速添加或取出。法元素,我们会讲到这样的元素,它们不与任何特定的内置类型直接相关,而且在刚开始。迭代器本身是一个底层的特性和概念,在程序中可以不用它。• ChainMap:类似字典的类,用于创建多个映射的单一视图。• OrderedDict:字典子类,可以保存元素的添加顺序。

2301_77888392的博客 392

ReactJs实现树形结构的数据显示的组件

1、该组件树形显示数据 2、组件中数据的请求方式为fetch方式 3、点击对应的数据前面的小三角,fetch请求改数据下对应的子数据,并展开该节点。 4、将该组件的js、less文件放到kpiTree目录下,在kpiTree目录下创建images目录将组件需要的图片放入给目录,在kpiTree目录下创建json文件夹将该组件需要的json文件放入改文件夹中,组件便可正常运行。 kpiTre

wp12345666666的博客 1万+

react 最佳入门_详解React-Todos入门例子

最近学完React的最基本概念,闲下来的时候就自己写了一个Todo-List的小应用。这里做个简略的说明,给想好好学React的新手看。开始之前这里我用了webpackb做了babel和JSX预处理和模块打包。所以对React和一些ES2015(ES6)的语法要有一定的了解。我相信学习ES2015绝对是划算的,因为它是Js的规范。这里给出学习的地方,阮一峰老师的ECMAScript 6 入门或者b...

weixin_28741099的博客 2672

【React 全家桶】贯穿组件化设计模式,制作简易todo(内含源码)

【React 全家桶】贯穿组件化设计模式,制作简易todo(内含源码)

Dai的博客 1085

05_React应用(基于React脚手架,props案例todolist)

该案例通过props完成组件之间的数据传递,但是太过繁琐,需要一个传一个。由头部组件进行状态总操作,子组件则是操作的执行者,通过调用头部组件的方法,完成父子、兄弟、祖孙数据传递。

zyq的博客 655

探索 `use-selected-items-hook`:简化React项目中的选择逻辑

探索 use-selected-items-hook:简化React项目中的选择逻辑 在现代Web应用中,用户选择操作是常见的交互需求。无论是多选框、列表选择还是其他形式的选择操作,处理这些逻辑往往需要大量的代码和状态管理。为了简化这一过程,use-selected-items-hook 应运而生。本文将深入介绍这个开源项目,分析其技术实现,探讨其应用场景,并总结其独特特点。 项目介绍 use-s...

gitblog_00167的博客 987
上一篇: junyi PSLC 数据集处理 —— txt 转 csv
下一篇: LeeCode刷题记录(JavaScript版):88. 合并两个有序数组(简单)
APythonC
博客等级 码龄7年 23粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值