You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中如何生成可共享的动态列数组

解决方案:封装为自定义Hook

React 允许创建自定义Hook来复用包含内置Hook的逻辑,自定义Hook仅要求命名以use开头,可返回任意类型的值(包括你需要的列数组),完全满足你的需求。

封装后的代码

新建文件比如useActivityTableColumns.ts,写入以下内容:

import { useContext, useCallback } from 'react';
import CategoryDropdown from '../common/CategoryDropdown';
// 替换为你实际的上下文导入路径
import { Activities } from '@/contexts/Activities';

const useActivityTableColumns = () => {
  const {
    data: [data, setData],
    categories: [categories, setCategories]
  } = useContext(Activities);

  // 用useCallback包裹事件处理函数,避免不必要的组件重渲染
  const handleCategoryChange = useCallback(
    (event: React.ChangeEvent<HTMLInputElement>) => {
      // 保留你原有的事件处理逻辑
    },
    [setData, setCategories]
  );
 
  if (!(data && categories)) return [];

  return [
    {
      field: 'name',
      fieldName: 'Name',
      headerName: `Name`,
      type: 'string',
      template: (dataItem) => {
        const { name } = dataItem;
        return name;
      }
    },
    {
      field: 'categoryId',
      fieldName: 'Category',
      headerName: 'Category',
      type: 'string',
      template: (dataItem) => {
        const { categoryId } = dataItem;
        return (
          <CategoryDropdown
            categoryId={categoryId}
            onChange={handleCategoryChange}
          />
        );
      }
    }
  ];
};

export default useActivityTableColumns;

使用方式

在任意需要该列配置的表格组件中,直接在组件顶层调用该Hook即可拿到列数组:

import useActivityTableColumns from '@/hooks/useActivityTableColumns';

const BusinessTable = () => {
  const tableColumns = useActivityTableColumns();
  // 直接将列数组传给表格组件即可
  return <BaseTable columns={tableColumns} /* 其他表格属性 */ />
};

扩展说明

如果不同表格需要定制部分列配置,可以给自定义Hook增加入参,比如传入额外列配置、是否隐藏某列的标识,返回合并后的数组即可实现灵活复用。

内容的提问来源于stack exchange,提问作者D. Messier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 06:15:03