【问题标题】:mui-datatables filter from outsidemui-datatables 从外部过滤
【发布时间】:2021-04-01 12:57:01
【问题描述】:

我正在尝试从 mui 数据表外部设置一个过滤器。我想从表外的操作中传递过滤器的值。例如,单击具有预设过滤器的按钮。有没有一个api可以接受外部事件并改变表的过滤状态?

...

    const options = {
      filter: true,
      selectableRows: 'multiple',
      filterType: 'dropdown',
      responsive: 'vertical',
      rowsPerPage: 10,

      //* pass filter somehow here
      receiveSomeFilter:this.state.tableFilter
    };
    const ageFilter = (age)=> {
        this.setState({tableFilter:age})
    }

    return (
        <div>
        <Button onClick = {ageFilter(28)}>Filter by age 28</Button>
      <MUIDataTable title={"ACME Employee list"} data={data} columns={columns} options={options} />
      </div>
    );

  }
}

export default Example;

【问题讨论】:

  • 欢迎来到 SO!这个论坛的独特之处在于它能够帮助您解决特定的代码问题,但是如果您发布代码段和您尝试过的其他内容,我们会更有帮助。如果我们看到什么不起作用,答案通常会变得更加集中和有用。祝你好运!

标签: reactjs mui-datatable


【解决方案1】:

您可以通过更新每列的选项并更新列选项的filterList 数组来设置从外部过滤。

一个简单的例子 (CodeSandbox here)

import MUIDataTable from "mui-datatables";
import { Select, MenuItem } from "@material-ui/core";
import { useState } from "react";

export default function App() {
  const initCols = [
    {
      name: "name",
      label: "Name",
      options: {
        filterList: []
      }
    }
  ];
  const [cols, setCols] = useState(initCols);
  const [selectedFilter, setSelectedFilter] = useState("All");

  const data = [
    { name: "Joey Tribbiani" },
    { name: "Phoebe Buffay" },
    { name: "Rachel Green" },
    { name: "Ross Geller" },
    { name: "Monica Geller" },
    { name: "Chandler Bing" }
  ];

  const onFilter = ({ target: { value } }: any) => {
    setSelectedFilter(value);
    const filteredCols = [...cols];
    let filterList = [];
    if (value !== "All") {
      filterList = [value];
    }
    // Target the column to filter on.
    filteredCols[0].options.filterList = filterList;
    setCols(filteredCols);
  };

  const options = {
    filter: false
  };

  return (
    <div className="App">
      <Select onChange={onFilter} value={selectedFilter}>
        <MenuItem value="All">All</MenuItem>
        {data.map((x) => (
          <MenuItem key={x.name} value={x.name}>
            {x.name}
          </MenuItem>
        ))}
      </Select>
      <MUIDataTable
        title="Filter"
        columns={cols}
        data={data}
        options={options}
      />
    </div>
  );
}

关键在于onFilter 函数,它是我的外部控件的onChange 侦听器(本例中为Select)。您需要将相应列的options.filterList 更新为一个数组,该数组包含该列的行可能具有的确切值。 filterList 可以包含多个值,因此是 Array。将其设置为空数组以删除该列的过滤。当然你需要useState来控制列,否则它不会更新。

【讨论】:

  • 这行得通。我能够以这种方式设置过滤器。非常感谢你:)
  • 是否可以在不进行完全重新渲染的情况下更新过滤器?因为当我从标准 filterMenu 更新过滤器时,它不会对我的整个页面进行完整的重新渲染(只有表格被更新/重新渲染)。我在文档中搜索了可能是“updateFilters”函数或类似的东西,但我找不到任何东西:(
猜你喜欢
  • 1970-01-01
  • 2021-03-26
  • 2020-12-06
  • 2021-03-25
  • 2022-11-09
  • 2021-11-04
  • 1970-01-01
  • 2016-10-07
  • 2021-10-28
相关资源
最近更新 更多