React造轮子(reacthook实现一套自己的组件库)轮子公开课——第六课【Checkbox、CheckboxGroup】组件

本文详细介绍了React组件库中Checkbox与CheckboxGroup的实现原理,包括组件流程、代码解析及样式设计。CheckboxGroup用于管理Checkbox的选中状态,通过React.Children.map和React.cloneElement处理子组件变化。文章还展示了相关代码片段,如CheckBoxGroup.tsx和Checkbox.tsx,涉及事件处理、状态管理和CSS样式定制。

一、组件库介绍

有兴趣的同学 可以先着手看源码,之前写的一系列开源组件库项目(有帮助的同学也帮忙点个star👍)

名称 官网 github
tinkerbell-ui(vue2.0) http://tinkerbell.top https://github.com/hanbingxu82/tinkerbell-ui
tinkerbell-ui(vue3.0) https://github.com/hanbingxu82/tinkerbell-ui-next
tinkerbell-ui(react-hook) https://github.com/hanbingxu82/tinkerbell-ui-react

二、Checkbox、CheckboxGroup组件流程介绍

关于 CheckboxGroup 也就是用来包裹 Checkbox 的一个通用组件,用于处理 Checkbox 组件变化监听回调的这样一个组件,其实主要的也是如何使用父组件去监听子组件的变化这样一个点,所以我们要在 CheckboxGroup 组件当中去捕获 Checkbox 的一个value变化,所以我们给 Checkbox 一个 onChange,然后 CheckboxGroup 去抓取,因为 Checkbox、CheckboxGroup 是自定义组件所以我们使用React.Children.map、React.cloneElement 去对子组件内容进行捕获。

CheckBoxGroup
name?: string // 原生 name 属性
disabled: boolean // 是否统一禁用
options: any // js编程式组件列表
value: any // 绑定 value 值

CheckBox
type: string // 样式类型
checked: boolean // 是否选中
disabled: boolean // 是否禁用
checkGroupValue: any // 父 group 的 value 值
value: string | number // 单独 value 值
name?: string // 原生 name 属性
label: string // label 名称
indeterminate?: any // 是否为统一全选控制按钮组件

三、代码详解

3.1、CheckBoxGroup.tsx


import React from 'react'
import CheckBox from '../CheckBox/index'
interface Iprops {
   
   
  name?: string // 原生 name 属性
  disabled: boolean // 是否统一禁用
  options: any // js编程式组件列表
  value: any // 绑定 value 值
}
function CheckBoxGroup(props: any) {
   
   
  const {
   
    name, value = [], options = [] }: Iprops = props
  function handleChange(evt: any) {
   
   
    //  有就删除 没有就新增
    value.indexOf(evt.target.value) > -1
      ? value.splice(value.indexOf(evt.target.value), 1)
      : value.push(evt.target.value)
    //  判断check选中状态
    console.log(value)
    props.onChange && props.onChange(value, evt)
  }
  //  options 循环遍历
  const checkboxDom = options.map((item: any) => {
   
   
    return (
      <CheckBox
        key={
   
   item.value}
        value={
   
   item.value}
        checkGroupValue={
   
   value}
        name={
   
   name}
        disabled={
   
   item.disabled ? item.disabled : null}
        onChange={
   
   handleChange}
      >
        {
   
   item.label}
      </CheckBox>
    )
  })
  //  遍历dom子节点方式
  const checkboxItems = React.Children.map(props.children, (item) => {
   
   
    return React.cloneElement(item, {
   
   
      item,
      componentName: 'checkboxGroup',
      checkGroupValue: value,
      name,
      onChange: handleChange
    })
  })

  return (
    <div className='tb-checkbox-group'>
      {
   
   checkboxItems ? checkboxItems : checkboxDom}
    </div>
  )
}
export default CheckBoxGroup

3.2、Checkbox.tsx


import React, {
   
    useEffect, useState } from 'react'
import './index.scss'

const classnames = require('classnames')
interface Iprops {
   
   
  type: string // 样式类型
  checked: boolean // 是否选中
  disabled: boolean // 是否禁用
  checkGroupValue: any // 父 group 的 value 值
  value: string | number // 单独 value 值
  name?: string // 原生 name 属性
  label: string // label 名称
  indeterminate?: any // 是否为统一全选控制按钮组件
}
function CheckBox(props: any) {
   
   
  const {
   
   
    type = 'default',
    disabled
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

归来巨星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值