Skip to content
On this page

常见问题

1. 如何将多个字段传入原件?

比如我需要在一个表格列中展示头像加上姓名.

解决办法有两种:

  • FatTable 完全支持自定义单元格的渲染
  • 通过 getter 方法组装传递给原件的属性



我们详细来看下:

1. 自定义单元格渲染

查看代码
tsx
import { defineFatTable } from '@wakeadmin/components';
import { ElAvatar, ElSpace } from 'element-plus';

/**
 * 列表项定义
 */
interface Item {
  id: number;
  name: string;
  avatar: string;
}

/**
 * 表单查询
 */
interface Query {
  name: string;
}

export default defineFatTable<Item, Query>(({ column }) => {
  return () => ({
    title: '自定义单元格',
    rowKey: 'id',
    async request(params) {
      const { pagination, query } = params;

      // 模拟请求
      const mockData: Item[] = new Array(pagination.pageSize).fill(0).map((_, idx) => {
        const r = Math.floor(Math.random() * 1000);
        return {
          id: idx,
          name: `${r}-${pagination.page}-${query?.name ?? ''}`,
          avatar: 'https://avatars.githubusercontent.com/u/15975785?v=4&size=64',
        };
      });

      return {
        list: mockData,
        total: 100,
      };
    },
    columns: [
      // 🔴 纯查询表单
      // 假设我们这里支持名称搜索
      column({
        type: 'query', // 🔴 设置为 query 表示不会作为单元格
        queryable: 'name',
        valueType: 'search',
      }),

      // 🔴 自定义单元格渲染
      column({
        label: '用户',
        render(_v, row) {
          return (
            <ElSpace>
              <ElAvatar src={row.avatar}></ElAvatar>
              <span>{row.name}</span>
            </ElSpace>
          );
        },
      }),
    ],
  });
});



2. 使用 getter 组装数据传入原件

TIP

原件是严格遵循 value/onChange 协议, 也就是说,它就是一个原子的表单,类似 Input。你无法给他传递多个字段。

为此,FatTable 也提供了 getter/setter props 来满足这种使用场景。


查看代码
tsx
import { defineFatTable } from '@wakeadmin/components';
import { ElAvatar, ElSpace } from 'element-plus';

/**
 * 列表项定义
 */
interface Item {
  id: number;
  name: string;
  avatar: string;
}

/**
 * 表单查询
 */
interface Query {}

export default defineFatTable<Item, Query>(({ column }) => {
  return () => ({
    title: '组装原件数据',
    rowKey: 'id',
    async request(params) {
      const { pagination, query } = params;

      // 模拟请求
      const mockData: Item[] = new Array(pagination.pageSize).fill(0).map((_, idx) => {
        const r = Math.floor(Math.random() * 1000);
        return {
          id: idx,
          name: `${r}-${pagination.page}`,
          avatar: 'https://avatars.githubusercontent.com/u/15975785?v=4&size=64',
        };
      });

      return {
        list: mockData,
        total: 100,
      };
    },
    columns: [
      column({
        label: '用户',
        valueType: 'avatar',
        // 🔴 按照 avatar 的 value 类型传值
        getter(row) {
          return {
            avatar: row.avatar,
            title: row.name,
            description: '13732332333',
          };
        },
      }),
    ],
  });
});




2. 如何在表格实现开关切换的需求?

查看代码
tsx
import { defineFatTable } from '@wakeadmin/components';
import { ElAvatar, ElMessageBox, ElSpace } from 'element-plus';

/**
 * 列表项定义
 */
interface Item {
  id: number;
  name: string;
  open: boolean;
}

/**
 * 表单查询
 */
interface Query {
  name: string;
  open: boolean;
}

export default defineFatTable<Item, Query>(({ column }) => {
  return () => ({
    title: 'Switch 开关示例',
    rowKey: 'id',
    async request(params) {
      const { pagination, query } = params;

      // 模拟请求
      const mockData: Item[] = new Array(pagination.pageSize).fill(0).map((_, idx) => {
        const r = Math.floor(Math.random() * 1000);
        return {
          id: idx,
          name: `${r}-${pagination.page}-${query?.name ?? ''}`,
          open: false,
        };
      });

      return {
        list: mockData,
        total: 100,
      };
    },
    columns: [
      column({
        label: '名称',
        prop: 'name',
        queryable: true,
        valueType: 'search',
      }),

      // 开关状态搜索
      column({
        label: '状态',
        type: 'query',
        prop: 'open',
        valueType: 'select',
        valueProps: {
          options: [
            { label: '', value: true },
            { label: '', value: false },
          ],
        },
      }),

      // 开关列
      column({
        label: '状态',
        prop: 'open',
        valueType: 'switch',
        // 🔴 强制设置为编辑模式
        columnMode: 'editable',
        valueProps: {
          beforeChange: async value => {
            await ElMessageBox.confirm('确定切换?');

            // 🔴 在这里请求后端接口

            return true;
          },
        },
      }),
    ],
  });
});





3. 如何控制表格的单元格换行

查看代码
tsx
import { defineFatTable } from '@wakeadmin/components';
import { ElAvatar, ElMessageBox, ElSpace } from 'element-plus';

/**
 * 列表项定义
 */
interface Item {
  one: string;
  two: string;
  three: string;
  four: number;
}

export default defineFatTable<Item>(({ column }) => {
  return () => ({
    title: '表格换行控制',
    rowKey: 'id',
    async request(params) {
      const { pagination, query } = params;

      // 模拟请求
      const mockData: Item[] = new Array(pagination.pageSize).fill(0).map((_, idx) => {
        const r = Math.floor(Math.random() * 1000);
        return {
          id: idx,
          one: '1' + '数据'.repeat(r % 100),
          two: '2' + '数据'.repeat(r % 100),
          three: '3' + '数据'.repeat(r % 100),
          four: 1,
        };
      });

      return {
        list: mockData,
        total: 100,
      };
    },
    columns: [
      column({
        label: '单行省略',
        prop: 'one',
        // 🔴 单行省略, 使用 el-table-column 自带的 showOverflowTooltip
        showOverflowTooltip: true,
      }),
      column({
        label: '多行省略',
        prop: 'two',
        valueProps: {
          // 🔴 多行省略, 使用默认文本类型、select 类型原件都支持
          ellipsis: 3,
        },
      }),
      column({
        label: '单行省略',
        prop: 'three',
        showOverflowTooltip: true,
      }),
      column({
        label: '下拉选择器',
        prop: 'four',
        valueType: 'select',
        valueProps: {
          ellipsis: 2,
          options: [
            {
              label: '很长很长很长很长很长很长很长很长很长很长很长很长很长很长',
              value: 1,
            },
          ],
        },
      }),
      column({
        label: '输入框',
        prop: '_',
        width: 200,
        showOverflowTooltip: true,
        columnMode: 'editable',
      }),
    ],
  });
});





4. 如何自定义表格渲染

查看代码
tsx
import { defineFatTable } from '@wakeadmin/components';

interface T {
  id: number;
  name: string;
  age: number;
  address: string;
}

export default defineFatTable<T>(({ column, p }) => {
  return () => {
    return {
      async request() {
        return {
          total: 100,
          list: new Array(100).fill(0).map((_, index) => ({
            id: index,
            name: 'name' + index,
            age: index,
            address: 'address' + index,
          })),
        };
      },
      columns: [
        column({
          prop: p('name'),
          label: '名称',
          queryable: true,
        }),
        column({
          prop: p('address'),
          label: '地址',
          queryable: true,
        }),
      ],
      // 自定义表格渲染
      renderTable(scope) {
        return (
          <div>
            {scope.list.map(item => {
              return (
                <div key={item.id}>
                  {item.name} - {item.address}
                </div>
              );
            })}
          </div>
        );
      },
    };
  };
});