qq_40723761 2024-07-26 17:52 采纳率: 0%
浏览 7

react protable 非dataSource提示分页问题

http://t.csdnimg.cn/RMR3x,您好,关于这篇文章,我使用的Protable,且未使用dataSource而是直接使用了request,但仍然出现分页问题,请问我这种情况该如何解决,也没法清空dataSource
以下是我的部分代码,希望作者看到能回复一下,感谢


```javascript
import { getwxacodeunlimit } from '@/pages/promotion/voucherTpl/service';
import { GOODS_MODE, GOODS_STATUS } from '@/utils/enum';
import { DownOutlined, ExclamationCircleFilled } from '@ant-design/icons';
import {
  ActionType,
  PageContainer,
  ProColumns,
  ProFormInstance,
  ProTable,
} from '@ant-design/pro-components';
import { FormattedMessage, history, Link } from '@umijs/max';
import { App, Button, Divider, Dropdown, Image, InputNumber, Tabs } from 'antd';
import { MessageInstance } from 'antd/es/message/interface';
import { ModalStaticFunctions } from 'antd/es/modal/confirm';
import _, { pick } from 'lodash';
import React, { useRef, useState } from 'react';
import { GoodsAddItem } from '../goodsAdd/data';
import AuditGoodsForm from './components/AuditGoodsForm';
import UpdateStorageForm from './components/UpdateStorageForm';
import { GoodsItem, GoodsListParam } from './data';
import { getGoodsList, soldOutManyGoods, updateGoods, updateGoodsStatus } from './service';

let message: MessageInstance;
let Modal: Omit<ModalStaticFunctions, 'warn'>;
const goodsTypeMap: { label: string; key: string }[] = [
  { label: '商品', key: '-1' },
  { label: '积分', key: '3' },
  { label: '报名', key: '8' },
];
const GoodsTable: React.FC = () => {
  const tableRef = useRef<ActionType>();
  const formRef = useRef<ProFormInstance>();
  const staticFunction = App.useApp();
  message = staticFunction.message;
  Modal = staticFunction.modal;
  const [selectedRows, setSelectedRows] = useState<GoodsItem[]>([]);

  const [searchParam, setSearchParam] = useState<GoodsListParam>({} as GoodsListParam);

  const [goodsMode, setGoodsMode] = useState<string>(localStorage.getItem('goodsMode') ?? '-1');
  const fetchData = async (
    params: Record<string, any>,
    sorter: Record<string, any>,
    filter: Record<string, any>,
  ) => {
    // 处理商品类型
    if (goodsMode === '-1') {
      // 如果goodsMode为'-1',则保留params.goods_mode的值,如果它存在且非空;
      // 否则,删除该属性
      params.goods_mode =
        params.goods_mode && params.goods_mode !== '' ? params.goods_mode : undefined;
    } else {
      // 如果goodsMode不是'-1',则直接设置params.goods_mode为goodsMode的值
      params.goods_mode = goodsMode;
    }

    // 处理排序
    if (sorter.hasOwnProperty('storage_all')) {
      params.group = 0;
      params.orderBy = 'storage';
      if (sorter.storage_all) {
        params.order = sorter.storage_all === 'ascend' ? 'ASC' : 'DESC';
      } else {
        delete params.order;
        delete params.orderBy;
        if (!formRef.current?.getFieldValue('goods_name')) {
          delete params.group;
        }
      }
    }
    setSearchParam(params);
    try {
      const response = await getGoodsList(params);
      return response;
    } catch (error) {
      return {
        data: [],
        success: false,
        total: 0,
      };
    } finally {
    }
  };

  const columns: ProColumns<GoodsItem>[] = [
    {
      title: 'ID',
      dataIndex: 'goods_id',
      search: false,
      width: 100,
    },
    {
      title: '主图',
      dataIndex: 'oss_url',
      search: false,
      render: (_, record: GoodsItem) => {
        return (
          <Image
            width={70}
            src={`${record.oss_url}?x-oss-process=image/resize,m_fill,w_100,h_100,quality,q_80`}
            preview={{
              src: record.oss_url + '?x-oss-process=image/format,webp',
            }}
          />
        );
      },
      width: 100,
    },
    {
      title: '商品名称',
      dataIndex: 'goods_name',
      render: (_, record: GoodsItem) => {
        return <span style={{ wordBreak: 'break-all' }}>{record.goods_name}</span>;
      },
      width: 260,
    },
    {
      title: '商品类型',
      dataIndex: 'goods_mode',
      valueEnum: pick(GOODS_MODE, [1, 2]),
      width: 100,
      search: goodsMode === '-1',
    },
    {
      title: 'sku',
      dataIndex: 'sku',
      render: (_, record: GoodsItem) => {
        return record.sku || '无';
      },
      search: false,
      width: 100,
    },
    {
      title: '店铺名称',
      dataIndex: 'store_name',
      search: false,
      width: 130,
    },
    {
      title: '排序',
      dataIndex: 'good_sort',
      search: false,
      width: 80,
      render: (_: any, record: GoodsItem) => (
        <InputNumber
          style={{ width: '50px' }}
          value={record?.good_sort}
          onChange={(e) => handleUpdateSort(record, e ?? 0)}
        />
      ),
    },
    {
      title: '商品价格(元)',
      dataIndex: 'price',
      search: false,
      width: 130,
      render: (_, record: GoodsItem) => (
        <>
          <div
            style={{ display: record.goods_mode === 3 || record.goods_mode === 8 ? '' : 'none' }}
          >
            <div>
              {record.goods_mode === 3 ? '兑换积分:' : '活动积分:'}
              {record.points}
            </div>
            <div
              style={{
                display: record.goods_mode === 3 && record.points_price !== '0.00' ? '' : 'none',
              }}
            >
              兑换金:{record.points_price}
            </div>
            <div
              style={{
                display: record.goods_mode === 8 && record.price !== '0.00' ? '' : 'none',
              }}
            >
              活动金额:{record.price}
            </div>
          </div>
          <div
            style={{ display: record.goods_mode === 3 || record.goods_mode === 8 ? 'none' : '' }}
          >
            {record.price}
          </div>
        </>
      ),
      align: 'right',
    },
    {
      title: '总库存',
      dataIndex: 'storage_all',
      search: false,
      render: (_, record) => {
        return searchParam?.group === 0
          ? record.storage
          : record.storage_all
            ? record.storage_all
            : record.storage;
      },
      sorter: true,
      align: 'center',
      width: 100,
    },
    {
      title: '状态',
      dataIndex: 'goods_status',
      search: true,
      valueEnum: GOODS_STATUS,
      width: 100,
    }
  ];

  return (
    <PageContainer>
      <Tabs
        items={goodsTypeMap}
        activeKey={goodsMode}
        onChange={(e) => {
          localStorage.setItem('goodsMode', e);
          setGoodsMode(e);
          tableRef.current && tableRef.current.reload();
        }}
      />
      <ProTable<GoodsItem, GoodsListParam>
        columns={columns}
        request={(params, sorter, filter) => fetchData(params, sorter, filter)}
        rowKey={(record) => record.goods_id}
        actionRef={tableRef}
        formRef={formRef}
        pagination={{ showSizeChanger: true, size: 'default' }}
        rowSelection={rowSelection}
      />
    </PageContainer>
  );
};

export default GoodsTable;



```

  • 写回答

1条回答 默认 最新

  • 专家-司宇[在线] 2024-07-26 17:59
    关注

    引自免费微信小程序:皆我百晓生

    你好,你的问题与代码相关,我会尽力帮助你解决。

    从你给出的代码和描述来看,你在使用ProTable组件时遇到了分页问题,并且没有使用dataSource属性而是直接使用了request方法来获取数据。要解决这个问题,我们可以从以下几个方面入手:

    1. 确保请求数据的格式正确:你的fetchData函数应该返回符合ProTable要求的数据格式。通常,这包括一个包含数据数组的data属性,以及total属性表示总数据数量。确保你的响应数据与这个格式匹配。
    2. 检查分页参数的处理:在请求数据时,确保正确处理分页参数(如当前页码和每页数据量)。这些参数应该传递给fetchData函数,并在服务端正确实现。
    3. 使用ProTable的分页功能:确保正确使用ProTable的分页功能。在你的代码中,你已经设置了pagination={{ showSizeChanger: true, size: 'default' }},这是正确的。但如果更改了分页设置或者进行了额外的配置,可能会导致问题。请检查其他与分页相关的配置是否正确。
    4. 清空数据源问题:如果你想要清空数据源并重新加载数据,你可以尝试在清空操作后调用tableRef.current?.reload()来重新加载表格数据。这样,ProTable将会重新发起请求并更新数据。
    5. 检查服务端响应:确保服务端正确处理分页请求并返回正确的数据格式。有时服务端可能没有正确处理分页参数或返回的数据格式不正确,这也可能导致前端分页显示不正常。

    为了更好地帮助你解决问题,我需要更多关于你的数据响应格式和你是如何配置分页的详细信息。另外,请确认是否有任何控制台错误或警告信息,这些信息可能会提供更多线索来帮助诊断问题。

    如果你能提供更多具体的信息或错误消息,我会更有可能为你提供更具体的解决方案或代码示例。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 7月26日
  • 创建了问题 7月26日

悬赏问题

  • ¥15 mySQL5.7.34安装遇到的问题
  • ¥15 结构功能耦合指标计算
  • ¥20 visual studio中c语言用ODBC链接SQL SERVER
  • ¥50 AI大模型精调(百度千帆、飞浆)
  • ¥15 非科班怎么跑代码?如何导数据和调参
  • ¥15 福州市的全人群死因监测点死亡原因报表
  • ¥15 Altair EDEM中生成一个颗粒,并且各个方向没有初始速度
  • ¥15 系统2008r2 装机配置推荐一下
  • ¥15 悬赏Python-playwright部署在centos7上
  • ¥15 psoc creator软件有没有人能远程安装啊