支持react表格自由选择展示的字段,支持全选
1、组件代码如下
import type { ModalProps } from "antd";
import type { CheckboxChangeEvent } from "antd/lib/checkbox";
import type { CheckboxValueType } from "antd/lib/checkbox/Group";
import type { FC, ReactNode } from "react";
import { Alert, Checkbox, Modal } from "antd";
import { useEffect, useState } from "react";
import style from "./style.module.less";
/**
* @description 自定义table column列选择
* @param title {string|ReactNode} modal title
* @param alert {string|ReactNode} alert message
* @param options {Array<CheckboxOptionType|string>} 可选字段
* @param value {Array<string>} 已选中的值
* @param onOk {(checked) => void} 确认回调
* @param className {string} class
* @param open {boolean} 是否显示modal
* @param props {ModalType} modal 属性值
* @param defaultCheckAll {boolean} 是否含有全选
* @return {ReactNode} Modal
*/
interface CustomColumnsProps extends ModalProps {
alert?: string | ReactNode;
options: any[];
value: CheckboxValueType[];
defaultCheckAll?: boolean;
handleOk: (value: CheckboxValueType[]) => void;
}
const CustomColumns: FC<CustomColumnsProps> = ({
title = "自定义列表字段",
alert,
options = [],
value = [],
className,
open,
handleOk,
...props
}) => {
const [checked, setChecked] = useState<CheckboxValueType[]>(value);
const [indeterminate, setIndeterminate] = useState(true);
const [checkAll, setCheckAll] = useState(false);
const onCheckAllChange = (e: CheckboxChangeEvent) => {
const result = e.target?.checked;
const selectValue = options?.map((item) => item.value);
setIndeterminate(false);
setCheckAll(result);
setChecked(
result
? (selectValue as string[])
: (options?.filter((item) => item?.disabled)?.map((item) => item.value) as string[]),
);
};
const onChange = (e: CheckboxValueType[]) => {
setChecked(e as string[]);
if (props?.defaultCheckAll) {
setIndeterminate(!!e?.length && e?.length < options?.length);
}
};
useEffect(() => {
if (!checked?.length) {
setCheckAll(false);
} else if (checked?.length === options?.length) {
setCheckAll(true);
}
}, [checked]);
useEffect(() => {
if (open) {
setChecked(value);
}
}, [open, value]);
return (
<Modal
width={600}
title={title}
className={`${className} ${style.modal}`}
maskClosable={false}
open={open}
{...props}
onOk={() => {
handleOk && handleOk(checked);
}}
>
<Alert
type="info"
message={
alert || `请选择您想显示的列表表头信息,最多可勾选${options.length}个字段,已勾选${checked.length}个字段`
}
/>
{props?.defaultCheckAll && (
<Checkbox
indeterminate={indeterminate}
onChange={onCheckAllChange}
checked={checkAll}
style={{ margin: "16px 0 8px 0" }}
>
选择所有的字段
</Checkbox>
)}
<Checkbox.Group options={options} value={checked} onChange={onChange} />
</Modal>
);
};
export default CustomColumns;
2、组件使用
页面导入 import CustomColumns from "@/components/CustomColumns";
设置默认状态:
const preset = useStore("presetStore");
const [customColumnsVisible, setCustomColumnsVisible] = useState(false);
const [columnsChecked, setColumnsChecked] = useState<CheckboxValueType[]>(
preset?.customList?.order || [
"orderNo",
"account",
"statusDesc",
"amount",
"paid",
"contractPrice",
"createdAt",
"station",
"chargingMode",
],
);
3、定义tableColumns
4、在table组件中过滤出操作选项和默认项
5、组件调用
<CustomColumns
options={tableColumns
.map(({ dataIndex, title, disabled }) => ({
value: dataIndex,
label: title,
disabled,
})).filter(({ value }) => value !== "action")}
value={columnsChecked}
defaultCheckAll
open={customColumnsVisible}
handleOk={(value) => {
setColumnsChecked(value);
setCustomColumnsVisible(false);
preset.updateCustomList("order", value);
}}
onCancel={() => setCustomColumnsVisible(false)}
/>