Concis组件库封装——CheckBox多选框/多选组

简介: Concis组件库封装——CheckBox多选框/多选组组件封装

您好,如果喜欢我的文章,可以关注我的公众号「量子前端」,将不定期关注推送前端好文~

很高兴今天看了下npm的数据,周下载量竟然有700+,也是很感谢不论是使用和学习都是对我的一种支持......

在这里插入图片描述
贴一下npm的地址~ https://www.npmjs.com/package/react-view-ui

多选框的组件文档如下:

在这里插入图片描述
在这里插入图片描述
组件源码如下:

import React, {
   
    FC, memo, ReactNode, useState, useCallback, useMemo, Fragment } from 'react'
import {
   
    CheckOutlined } from '@ant-design/icons';
import "./index.module.less";

type checkGroup = {
   
   
  label: string;
  value: string | number;
  checked?: boolean;
  disabled?: boolean;
}
interface checkBoxProps {
   
   
  children?: ReactNode
  /**
   * @description 默认选中状态
   * @default boolean
   */
  checked?: boolean
  /**
   * @description 禁用
   * @default boolean
   */
  disabled?: boolean
  /**
   * @description 多选组配置
   * @default Array
   */
  group?: Array<checkGroup>
  /**
   * @description 多选框选中回调函数
   */
  checkCallback?: Function;
  /**
   * @description 多选组改变回调函数
   */
  checkGroupCallback?: Function;
}

const CheckBox: FC<checkBoxProps> = (props) => {
   
   
  const {
   
    children, checked, disabled, group, checkCallback, checkGroupCallback } = props;

  const [checkStatus, setCheckStatus] = useState<boolean>(checked || false);
  const [checkGroup, setCheckGroup] = useState<Array<checkGroup>>(group || []);

  const toggleCheckedStatus = () => {
   
                  //多选单组件切换状态
    if (disabled) return;
    setCheckStatus(!checkStatus);
    checkCallback && checkCallback(!checkStatus)
  }
  const toggleGroupCheckedStatus = (index: number) => {
   
        //切换多选组状态
    const oldCheckGroup = [...checkGroup];
    oldCheckGroup[index].checked = oldCheckGroup[index]?.checked ? !oldCheckGroup[index].checked : true;
    setCheckGroup(oldCheckGroup);
    checkGroupCallback && checkGroupCallback(oldCheckGroup);
  }
  const renderCheckBoxDom = useMemo(() => {
   
            //渲染单check状态
    if (disabled) {
   
   
      return (
        <div className="disblaed-checkBox"></div>
      )
    } else if (checkStatus) {
   
   
      return (
        <div className="checkBox-actived">
          <CheckOutlined />
        </div>
      )
    } else {
   
   
      return (
        <div className="checkBox-noActived"></div>
      )
    }
  }, [checkStatus, checked])
  const renderCheckGroupDom = useCallback((checkBoxOptions: checkGroup) => {
   
         //渲染checkbox组状态   
    if (checkBoxOptions.disabled) {
   
   
      return (
        <div className="disblaed-checkBox"></div>
      )
    } else if (checkBoxOptions.checked) {
   
   
      return (
        <div className="checkBox-actived">
          <CheckOutlined />
        </div>
      )
    } else if (!checkBoxOptions.checked) {
   
   
      return (
        <div className="checkBox-noActived"></div>
      )
    }
  }, [group])

  return (
    <Fragment>
      {
   
   
        group && group.length
          ?
          <div className="checkGroup">
            {
   
   
              group.map((c: checkGroup, i: number) => {
   
   
                return (
                  <div className="checkbox groupBox" key={
   
   i} onClick={
   
   () => toggleGroupCheckedStatus(i)}>
                    {
   
   
                      renderCheckGroupDom(c)
                    }
                    <div className="text">{
   
   c.label}</div>
                  </div>
                )
              })
            }
          </div>
          :
          <div className="checkbox" onClick={
   
   toggleCheckedStatus}>
            {
   
   
              renderCheckBoxDom
            }
            <div className="text">{
   
   children}</div>
          </div>
      }

    </Fragment>

  )
}

export default memo(CheckBox);

如果有喜欢的,学习或者使用的觉得好的,点个小星星哦~,组件有任何bug或者疑问、功能建议欢迎留言。

目录
相关文章
|
8月前
|
移动开发 JavaScript 小程序
uniapp中组件库的Radio 单选框丰富的使用方法
uniapp中组件库的Radio 单选框丰富的使用方法
823 0
|
8月前
|
移动开发 JavaScript 小程序
uniapp中组件库的Checkbox 复选框 的丰富使用方法
uniapp中组件库的Checkbox 复选框 的丰富使用方法
997 0
|
6月前
|
JavaScript
【奇葩问题】vue 多个el-drawer 嵌套遮罩混乱问题解决方案,vue在<el-drawer>中嵌套<el-drawer>时遮罩bug 为了解决问题自己封装了一个简易的抽屉组件
【奇葩问题】vue 多个el-drawer 嵌套遮罩混乱问题解决方案,vue在<el-drawer>中嵌套<el-drawer>时遮罩bug 为了解决问题自己封装了一个简易的抽屉组件
417 0
|
8月前
|
移动开发 小程序 API
uniapp组件库Modal 模态框 的使用方法
uniapp组件库Modal 模态框 的使用方法
545 1
|
8月前
uniapp中组件库的Checkbox 复选框的使用方法
uniapp中组件库的Checkbox 复选框的使用方法
|
8月前
|
移动开发 小程序 JavaScript
uniapp中组件库的Textarea 文本域的丰富使用方法
uniapp中组件库的Textarea 文本域的丰富使用方法
308 0
|
8月前
|
JavaScript 开发者 UED
uniApp中uView组件库的丰富单元格方法
uniApp中uView组件库的丰富单元格方法
269 0
|
前端开发 JavaScript API
Concis组件库封装——TreeView树形控件
Concis组件库封装——TreeView树形控件组件封装
145 1
Concis组件库封装——TreeView树形控件
|
前端开发 JavaScript API
Concis组件库封装——Popover气泡卡片
Concis组件库封装——Popover气泡卡片组件记录
162 1
antd组件库封装47-button组件编写1
antd组件库封装47-button组件编写1
79 0
antd组件库封装47-button组件编写1