react--自定义列表字段

支持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)}
      />
相关推荐
sunny_26 分钟前
💥 Claude Code 源码泄露?我把这个最强 AI Coding Agent 的架构扒干净了
前端·agent·claude
西洼工作室31 分钟前
React轮播图优化:通过延迟 + 动画的组合,彻底消除视觉上的闪烁感
前端·react.js·前端框架
yaaakaaang40 分钟前
(八)前端,如此简单!---五组结构
前端·javascript
我是若尘44 分钟前
我的需求代码被主干 revert 了,接下来我该怎么操作?
前端·后端·代码规范
魁首1 小时前
Claude Code 源码泄露的背后,到底与Codex,Gemini 有啥不一样?
前端·openai·claude
攀登的牵牛花1 小时前
程序员失业论,被 SWE-CI 一组数据打醒:真正先被替代的是低质量交付
前端·github
EstherNi2 小时前
vue3仿照elementui样式的写法,并进行校验,并且有默认值的设置
javascript·elementui
BumBle2 小时前
Vue项目中实现路由守卫自动取消Pending请求
前端
gCode Teacher 格码致知2 小时前
Javascript提高:get和post等请求,对于汉字和空格信息进行编码的原则-由Deepseek产生
开发语言·前端·javascript·node.js·jquery
竹林8182 小时前
从ethers.js迁移到Viem:我在一个DeFi项目前端重构中踩过的坑
前端·javascript