You need to enable JavaScript to run this app. 在React Admin自定义列表中使用ListContextProvider如何实现筛选功能
优惠活动
大模型
产品
解决方案
定价
更多

在React Admin自定义列表中使用ListContextProvider如何实现筛选功能

React Admin 自定义ListContextProvider实现筛选的方案

核心修改点如下:

  • 新增独立的筛选状态管理,将筛选值同步到接口请求参数中
  • 在ListContextProvider的value中注入筛选相关的状态与方法,兼容React Admin内置筛选组件的上下文消费要求
  • 筛选值变更时自动重置页码到第一页,避免筛选后出现空页问题

修改后的完整代码:

import React, { useState } from 'react'
import {
  Datagrid,
  TextField,
  Pagination,
  Loading,
  ListContextProvider,
  useQuery,
  Filter, // 新增导入内置筛选组件
  TextInput // 新增导入筛选输入组件
} from 'react-admin';
import keyBy from 'lodash/keyBy'
import Button from '@material-ui/core/Button';
import "../../css/styles.css";

function CustomList(props) {
  const [page, setPage] = useState(1);
  const [perPage, setPerPage] = useState(50);
  const [sort, setSort] = useState({ field: 'id', order: 'DESC' })
  // 新增筛选状态,默认包含props.id的固定筛选
  const [filter, setFilter] = useState({ id: props.id });

  // 自定义筛选变更方法,筛选修改后自动回到第一页
  const handleFilterChange = (newFilter) => {
    setFilter(newFilter);
    setPage(1);
  }

  const { data, total, loading, error } = useQuery({
    type: 'getList',
    resource: 'list',
    payload: {
      pagination: { page, perPage },
      sort,
      filter: filter, // 替换为动态筛选值
    }
  });

  if (loading) {
    return <Loading />
  }
  if (error) {
    window.location.reload(false);
  }

  return (
    <div>
      <ListContextProvider value={{
        data: keyBy(data, 'id'),
        ids: data.map(({ id }) => id),
        total,
        page,
        perPage,
        setPage,
        setPerPage,
        setSort: (field, order) => {
          setSort({ field, order });
        },
        currentSort: sort,
        basePath: "/list",
        resource: 'lists',
        selectedIds: [],
        // 新增注入筛选相关的上下文字段
        filter,
        setFilter: handleFilterChange,
        showFilter: () => {},
        hideFilter: () => {}
      }}>
        {/* 新增筛选表单,alwaysOn代表默认展示,无需点击筛选按钮 */}
        <Filter>
          <TextInput source="name" label="名称" alwaysOn />
          <TextInput source="id" label="记录ID" />
        </Filter>
        <Datagrid style={{ tableLayout: 'fixed', wordWrap: "break-word" }}>
          <TextField source="id" />
          <TextField source="name" />
        </Datagrid>
        <Pagination rowsPerPageOptions={[10, 25, 50, 100]} />
      </ListContextProvider>
    </div>
  );
}

export default CustomList;

如果你不需要使用React Admin内置的Filter组件,也可以完全自定义筛选表单,只需要自行维护filter状态,状态变更后触发useQuery重新请求即可,不需要额外注入上下文的筛选字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 09:12:01