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

如何在react-admin v4.x自定义页面单独使用Filter功能

在react-admin v4自定义页面中复用筛选功能的解决方案

react-admin v4把筛选功能封装在FilteringContext中,无需依赖List组件,只需手动提供上下文并结合持久化状态管理即可实现需求。以下是具体实现方案:

核心思路

  • 用react-admin提供的useStore钩子实现筛选条件的持久化存储(替代v2中的redux)
  • 通过FilteringProvider手动注入筛选上下文,让Filter组件正常工作
  • 将筛选条件传入react-query的useQuery钩子,实现数据请求的联动

完整代码示例

import { FilteringProvider, Filter, TextInput, SelectInput, useStore } from 'react-admin';
import { useQuery } from '@tanstack/react-query';

// 自定义数据请求函数,根据筛选条件获取数据
const fetchAnalyticsData = async (filters) => {
  const response = await fetch(`/api/analytics?${new URLSearchParams(filters)}`);
  if (!response.ok) throw new Error('数据请求失败');
  return response.json();
};

const AnalyticsPage = () => {
  // 用useStore持久化筛选条件,自定义存储key确保和其他页面不冲突
  const [filters, setFilters] = useStore('analytics-page-filters', {});

  // 处理筛选条件变化的回调
  const handleFilterUpdate = (updatedFilters) => {
    setFilters(updatedFilters);
  };

  // 结合react-query获取数据,筛选变化时自动重新请求
  const { data, isLoading, error } = useQuery({
    queryKey: ['analytics-dataset', filters],
    queryFn: () => fetchAnalyticsData(filters),
  });

  return (
    <div className="analytics-page">
      {/* 注入FilteringContext,让Filter组件能读取和更新筛选条件 */}
      <FilteringProvider value={{ filters, setFilters: handleFilterUpdate }}>
        <Filter>
          {/* 这里添加你的筛选组件,用法和List页面完全一致 */}
          <TextInput source="keyword" label="关键词" />
          <SelectInput 
            source="category" 
            label="分类" 
            choices={[
              { id: 'product', name: '产品类' },
              { id: 'operation', name: '运营类' }
            ]} 
          />
        </Filter>
      </FilteringProvider>

      {/* 页面内容区域 */}
      {isLoading && <p>数据加载中...</p>}
      {error && <p>数据加载失败:{error.message}</p>}
      {data && (
        <div className="analytics-content">
          {/* 渲染你的分析数据,比如图表、统计卡片等 */}
        </div>
      )}
    </div>
  );
};

export default AnalyticsPage;

补充说明

  • useStore会自动将筛选条件存储在浏览器的localStorage中,刷新页面后筛选状态不会丢失
  • 如果需要重置筛选,可添加按钮调用setFilters({})清空所有条件
  • Filter组件支持layout属性调整布局(如layout="horizontal"),用法与List页面一致
  • 所有react-admin的输入组件(如DateInput、BooleanInput)都可以直接在Filter中使用,自动适配筛选逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 05:18:19