可以支持RadioGroup、CheckboxGroup、Tabs、Tag List等组件。 方便进行父子之间通信。
npm install @rc-hooks/group* 定义 function RcGroup
* 类型
- IRcGroupProps type IRcGroupProps
- IGroupOptions interface IGroupOptions
* 泛型参数
- T 表示分组中值可能为的类型
- P 表示所有可以在容器和子项之间共享的属性,设置在P中的属性会进行容器和子项的合并(子项目高于容器)由于disabled影响行为,所以直接在IGroupOptions中做了定义
* 用法
``typescript jsx
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
value: T[]
onChange: (value: T[]) => void;
disabled?: boolean;
}
type ICheckboxButtonGroupProps
function CheckboxButtonGroup
const {
value,
type = 'default',
size = 'md',
disabled = false,
onChange,
...others
} = props;
const extraProps = useMemo(() => ({size, type}), [size, type]);
return (
{...others}
value={value}
onChange={onChange}
disabled={disabled}
extraProps={extraProps}
/>
)
}
``
由于要支持单选、多选、混选等多种情况,所有数值都以数组的形式提供,如须单值,可以如下自行封装相关属性typescript jsx`
import {useCallback} from 'react'
function RadioGroup
const onChange = useCallback((value: T[]) => {
props.onChange(value.length ? value[0]: null);
}, [props.onChange])
}
* 参考
- UnionOmit
- ComponentSize
* 类型
- IGroupItemRenderProps type IGroupItemRenderProps
- IGroupItemOptions interface IGroupItemOptions; group: string; free: boolean; value: T}`
* 泛型参数
- T 表示分组中值可能为的类型
- P 表示所有可以在容器和子项之间共享的属性,设置在P中的属性会进行容器和子项的合并(子项目高于容器)由于disabled影响行为,所以直接在IGroupOptions中做了定义
* 用法typescript jsx
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
value: T[]
disabled?: boolean;
}
type ICheckboxButtonProps
function CheckboxButton
const {
value,
type,
size,
disabled = false,
onClick, // Button没有onChange事件,用onClick来模拟
...others
} = props;
const [group, onItemChange] = useGroupItem
disabled,
value,
group: 'checkbox', // 所有的项目都在一个分组,用同一个就可以了
free: false,
// 这里有个partial可以传递部分属性
extraProps:{
size,
type
}
});
// 省略了type size等样式处理函数,也可以单独封装一个组件来处理
const onButtonClick = useCallback((e: MouseEventHandler
if(onClick) {
onClick(e);
}
// 对于checkbox来说,点一下翻转
onItemChange(!group.checked);
}, [onClick, onItemChange, group.checked]);
return (
* 参考
- UnionOmit
- ComponentSize