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

React-Admin中List组件设置filterDefaultValues后自定义Empty组件不显示

解决React-Admin中filterDefaultValues与自定义Empty组件冲突的问题

问题原因

当给List组件设置filterDefaultValues后,React-Admin会将此判定为用户主动执行了过滤操作。此时即便数据为空,组件会优先展示默认的“No results found”提示,而非你自定义的<NoData />组件——这是框架默认的“过滤后无结果”逻辑。

解决方案

通过结合useListContext上下文,自定义一个空状态组件,根据当前过滤参数和数据状态决定显示内容:

1. 编写自定义空状态包装组件

import { useListContext } from 'react-admin';
import NoData from './NoData'; // 你的自定义空组件

const CustomEmpty = () => {
  const { data, filters } = useListContext();

  // 当数据为空且使用的是默认过滤条件时,显示自定义组件
  if (!data || data.length === 0) {
    // 匹配你的默认过滤规则,这里以statuses: ['All']为例
    const isDefaultFilter = filters.statuses?.length === 1 && filters.statuses[0] === 'All';
    if (isDefaultFilter) {
      return <NoData />;
    }
    // 非默认过滤时,显示框架默认提示
    return <span>No results found</span>;
  }

  return null;
};

2. 在List组件中使用该包装组件

<List 
  empty={<CustomEmpty />}
  filterDefaultValues={{ statuses: ['All'] }}
>
  {/* 你的List子组件,比如Datagrid等 */}
</List>

另一种简化方案(强制显示自定义组件)

如果你希望无论过滤状态如何,只要数据为空就显示自定义组件,可以直接在empty prop中传入<NoData />,同时通过逻辑判断绕过框架的过滤判定:

<List 
  empty={<NoData />}
  filterDefaultValues={{ statuses: ['All'] }}
>
  {/* 子组件 */}
</List>

注:如果上述方式不生效,可在自定义NoData组件内通过useListContext获取数据状态,强制渲染自身即可。

内容的提问来源于stack exchange,提问作者Rodder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 08:42:35