1.0.11 • Published 5 years ago

@rc-hooks/group v1.0.11

Weekly downloads
143
License
-
Repository
-
Last release
5 years ago

RcGroup - 分组类元素

可以支持RadioGroup、CheckboxGroup、Tabs、Tag List等组件。 方便进行父子之间通信。

API

RcGroup

分组容器,处于同一个容器下的组件会被当成是一组,支持所有div元素支持的属性。

  • 定义 function RcGroup<T, P>(props: IRcGroupProps<T, P>): React.ReactNode
  • 类型
    • IRcGroupProps type IRcGroupProps<T, P> = UnionOmit<IGroupOptions<T, P>, HTMLAttributes<HTMLDivElement>>
    • IGroupOptions interface IGroupOptions<T, P> {disabled: boolean;extraProps: P;value: T[];onChange: (value: T[]) => void;}
  • 泛型参数

    • T 表示分组中值可能为的类型
    • P 表示所有可以在容器和子项之间共享的属性,设置在P中的属性会进行容器和子项的合并(子项目高于容器)由于disabled影响行为,所以直接在IGroupOptions中做了定义
  • 用法

    import React, {useMemo, HTMLAttributes} from 'react'
    import {ComponentSize, UnionOmit} from '@co-hooks/util'
    import {RcGroup} from '@rc-hooks/group'

    interface ICheckboxButtonGroupShareOptions {
        size: ComponentSize; // 用于表示按钮大小
        type: string; // 用于表示按钮类型
    } 
    
    interface ICheckboxButtonGroup<T> extends Partial<ICheckboxButtonGroupShareOptions> {
        value: T[]
        onChange: (value: T[]) => void;
        disabled?: boolean;
    }
     
    type ICheckboxButtonGroupProps<T> = UnionOmit<ICheckboxButtonGroup<T>, HTMLAttributes<HTMLDivElement>>;

    function CheckboxButtonGroup<T>(props: ICheckboxButtonGroupProps<T>) {
        
        const {
            value,
            type = 'default',
            size = 'md',
            disabled = false,
            onChange,
            ...others
        } = props;
        
        const extraProps = useMemo(() => ({size, type}), [size, type]);
        
        return (
            <RcGroup<T, ICheckboxButtonGroupShareOptions>
                {...others}
                value={value}
                onChange={onChange}
                disabled={disabled}
                extraProps={extraProps}
            />
        )
    }

由于要支持单选、多选、混选等多种情况,所有数值都以数组的形式提供,如须单值,可以如下自行封装相关属性

    
    import {useCallback} from 'react'
    
    
    function RadioGroup<T>(props:{onChange: (value: T | null) => void}) {
    
         const onChange = useCallback((value: T[]) => {
              props.onChange(value.length ? value[0]: null);
          }, [props.onChange])
    }

useGroupItem

分组子项使用的钩子,可以用于获取子项目使用到的信息。

  • 定义 function useGroupItem<T, P>(props: IGroupItemOptions<T, P>): IGroupItemRenderProps<T, P>
  • 类型
    • IGroupItemRenderProps type IGroupItemRenderProps<T, P> = [UnionOmit<{checked: boolean; disabled: boolean}, P>, (checked: boolean) => void ]
    • IGroupItemOptions interface IGroupItemOptions<T, P> {disabled: boolean; extraProps: Partial<P>; group: string; free: boolean; value: T}
  • 泛型参数
    • T 表示分组中值可能为的类型
    • P 表示所有可以在容器和子项之间共享的属性,设置在P中的属性会进行容器和子项的合并(子项目高于容器)由于disabled影响行为,所以直接在IGroupOptions中做了定义
  • 用法
    import React, {ButtonHTMLAttributes, useCallback, MouseEventHandler} from 'react'
    import {ComponentSize, UnionOmit} from '@co-hooks/util'
    import {useGroupItem} from '@rc-hooks/group'

    interface ICheckboxButtonGroupShareOptions {
        size: ComponentSize; // 用于表示按钮大小
        type: string; // 用于表示按钮类型
    } 
    
    interface ICheckboxButton<T> extends Partial<ICheckboxButtonGroupShareOptions> {
        value: T[]
        disabled?: boolean;
    }
     
    type ICheckboxButtonProps<T> = UnionOmit<ICheckboxButton<T>, ButtonHTMLAttributes<HTMLButtonElement>>;

    function CheckboxButton<T>(props: ICheckboxButtonProps<T>) {
        
        const {
            value,
            type, 
            size,
            disabled = false,
            onClick, // Button没有onChange事件,用onClick来模拟
            ...others
        } = props;
        
        const [group, onItemChange] = useGroupItem<T, ICheckboxButtonGroupShareOptions>({
            disabled,
            value,
            group: 'checkbox', // 所有的项目都在一个分组,用同一个就可以了
            free: false,
            // 这里有个partial可以传递部分属性
            extraProps:{
                size, 
                type
            }
        });
        
        // 省略了type size等样式处理函数,也可以单独封装一个组件来处理
        
        const onButtonClick = useCallback((e: MouseEventHandler<HTMLButtonElement>) => {
            
            if(onClick) {
                onClick(e);
            }
            
            // 对于checkbox来说,点一下翻转
            onItemChange(!group.checked);
        }, [onClick, onItemChange, group.checked]);
        
        return (
            <button {...others} onClick={onButtonClick}/>
        )
    }
1.0.11

5 years ago

1.0.5

5 years ago

1.0.2

5 years ago

1.0.1

5 years ago

0.8.19

5 years ago

0.8.8

5 years ago

0.8.6

5 years ago

0.7.23

5 years ago

0.8.0

5 years ago

0.8.2

5 years ago

0.7.17

5 years ago

0.7.11

5 years ago

0.7.9

5 years ago

0.7.7

5 years ago

0.7.6

5 years ago

0.7.4

5 years ago

0.7.3

5 years ago

0.7.0

5 years ago

0.6.8

5 years ago

0.6.5

5 years ago

0.6.5-alpha.0

5 years ago

0.6.5-alpha.1

5 years ago

0.6.2

5 years ago

0.6.1

5 years ago

0.6.0

5 years ago

0.5.10

5 years ago

0.5.9

5 years ago

0.5.5

5 years ago

0.5.4

5 years ago

0.5.3

5 years ago

0.5.2

5 years ago

0.5.1

6 years ago

0.5.0

6 years ago

0.4.5

6 years ago

0.4.4

6 years ago

0.4.3

6 years ago

0.4.2

6 years ago

0.4.1

6 years ago

0.4.0

6 years ago

0.3.10

6 years ago

0.3.8

6 years ago

0.3.9

6 years ago

0.3.7

6 years ago

0.3.6

6 years ago

0.3.5

6 years ago

0.3.4

6 years ago

0.3.3

6 years ago

0.3.2

6 years ago

0.3.1

6 years ago

0.3.0

6 years ago

0.3.0-alpha.5

6 years ago

0.3.0-alpha.2

6 years ago

0.3.0-alpha.1

6 years ago

0.3.0-alpha.0

6 years ago

0.2.22

6 years ago

0.2.21

6 years ago

0.2.20

6 years ago

0.2.19

6 years ago

0.2.18

6 years ago

0.2.17

6 years ago

0.2.16

6 years ago

0.2.15

6 years ago

0.2.14

6 years ago

0.2.13

6 years ago

0.2.12

6 years ago

0.2.11

6 years ago

0.2.10

6 years ago

0.2.8

6 years ago

0.2.7

6 years ago

0.2.6

6 years ago

0.1.81

6 years ago

0.2.5

6 years ago

0.2.4

6 years ago

0.2.3

6 years ago

0.1.80

6 years ago

0.2.2

6 years ago

0.1.79

6 years ago

0.2.1

6 years ago

0.1.78

6 years ago

0.1.77

6 years ago

0.1.76

6 years ago

0.1.75

6 years ago

0.1.74

6 years ago

0.1.73

6 years ago

0.1.72

6 years ago

0.1.71

6 years ago

0.1.70

6 years ago

0.1.69

6 years ago

0.1.68

6 years ago

0.1.67

6 years ago

0.1.66

6 years ago

0.1.65

6 years ago

0.1.64

6 years ago

0.1.63

6 years ago

0.1.62

6 years ago

0.1.61

6 years ago

0.1.60

6 years ago

0.1.59

6 years ago

0.1.58

6 years ago

0.1.57

6 years ago

0.1.56

6 years ago

0.1.55

6 years ago

0.1.54

6 years ago

0.1.53

6 years ago

0.1.52

6 years ago

0.1.51

6 years ago

0.1.50

6 years ago

0.1.49

6 years ago

0.1.48

6 years ago

0.1.47

6 years ago

0.1.46

6 years ago

0.1.45

6 years ago

0.1.44

6 years ago

0.1.43

6 years ago

0.1.42

6 years ago

0.1.41

6 years ago

0.1.40

6 years ago

0.1.39

6 years ago

0.1.38

6 years ago

0.1.37

6 years ago

0.1.36

6 years ago

0.1.35

6 years ago

0.1.34

6 years ago

0.1.32

6 years ago

0.1.31

6 years ago

0.1.30

6 years ago

0.1.29

6 years ago

0.1.28

6 years ago

0.1.27

6 years ago

0.1.26

6 years ago

0.1.25

6 years ago

0.1.24

6 years ago

0.1.23

6 years ago

0.1.22

6 years ago

0.1.21

6 years ago

0.1.20

6 years ago

0.1.19

6 years ago

0.1.18

6 years ago

0.1.17

6 years ago

0.1.15

6 years ago

0.1.13

6 years ago

0.1.12

6 years ago

0.1.11

6 years ago

0.1.10

6 years ago

0.1.9

6 years ago

0.1.8

6 years ago

0.1.7

6 years ago

0.1.6

6 years ago

0.1.5

6 years ago