如何在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
相关产品推荐
相关产品推荐

