首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跨react-table实现全局搜索过滤器: React+ react-table

跨react-table实现全局搜索过滤器: React+ react-table
EN

Stack Overflow用户
提问于 2019-07-01 18:01:53
回答 1查看 17K关注 0票数 0

我正在尝试实现一个全局搜索过滤器,它可以在整个表中搜索关键字。我附加了一个更改处理程序,并且在每个输入上都触发了一个回调,该回调在整个数据中搜索关键字,值在我键入字符时被过滤-但是我希望当我在搜索输入中输入多个搜索值(如string1,string2 )时,搜索能够正常工作

代码沙盒:https://codesandbox.io/s/jolly-bhabha-iqcx1

代码

代码语言:javascript
复制
import React from "react";
import ReactDOM from "react-dom";
import { Input } from "semantic-ui-react";
import ReactTable from "react-table";
import "react-table/react-table.css";
import "./styles.css";

export default class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      data: [
        { firstName: "aaaaa", status: "Pending", visits: 155 },
        { firstName: "aabFaa", status: "Pending", visits: 155 },
        { firstName: "adaAAaaa", status: "Approved", visits: 1785 },
        { firstName: "aAaaaa", status: "Approved", visits: 175 },
        { firstName: "adaSaaa", status: "Cancelled", visits: 165 },
        { firstName: "aasaaa", status: "Cancelled", visits: 157 },
        { firstName: "aweaaaaaewea", status: "Approved", visits: 153 },
        { firstName: "aaaaaa", status: "Submitted", visits: 155 }
      ],
      columns: [],
      searchInput: ""
    };
  }

  componentDidMount() {
    let columns = [
      {
        Header: "First Name",
        accessor: "firstName",
        sortable: false,
        show: true,
        displayValue: " First Name"
      },
      {
        Header: "Status",
        accessor: "status",
        sortable: false,
        show: true,
        displayValue: "Status "
      },
      {
        Header: "Visits",
        accessor: "visits",
        sortable: false,
        show: true,
        displayValue: " Visits "
      }
    ];
    this.setState({ columns });
  }

  handleChange = event => {
    this.setState({ searchInput: event.target.value }, () => {
      this.globalSearch();
    });
  };

  globalSearch = () => {
    let { data, searchInput } = this.state;
    if (searchInput) {
      let filteredData = data.filter(value => {
        return (
          value.firstName.toLowerCase().includes(searchInput.toLowerCase()) ||
          value.status.toLowerCase().includes(searchInput.toLowerCase()) ||
          value.visits
            .toString()
            .toLowerCase()
            .includes(searchInput.toLowerCase())
        );
      });
      this.setState({ data: filteredData });
    }
  };

  render() {
    let { data, columns, searchInput } = this.state;
    return (
      <div>
        <br />
        <Input
          size="large"
          name="searchInput"
          value={searchInput || ""}
          onChange={this.handleChange}
          label="Search"
        />
        <br />
        <br />
        <ReactTable
          data={data}
          columns={columns}
          defaultPageSize={10}
          className="-striped -highlight"
        />
      </div>
    );
  }
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-01 18:16:43

这不是react-table的问题。在当前的实现中,

  1. 第一次,你可以从原始数据中进行过滤。
  2. 第二次尝试筛选时,您是在尝试从先前筛选的数据中筛选结果(状态对象中的当前数据是上次尝试的筛选结果)。

我建议尝试一下(这是从你的派生的):https://codesandbox.io/s/eloquent-clarke-w1ehv

将原始数据作为不可变源进行维护,并在每次更改搜索输入时从中进行过滤,而不是从状态中的当前数据对象进行过滤。看一下我连接的叉子。

如果数据来自ajax调用,则可能需要维护两个状态变量:

代码语言:javascript
复制
this.state = {
   data: [],
   filteredData: [],
   columns: [],
   searchInput: ""
};

componentDidMount() {
  yourapicall.then(data => {
    this.setState({
      data // whatever data you get.
    });
  });
}

// And in your global search

globalSearch = () => {
    let { searchInput, data } = this.state;
    let filteredData = data.filter(value => {
    return (
        value.firstName.toLowerCase().includes(searchInput.toLowerCase()) ||
        value.status.toLowerCase().includes(searchInput.toLowerCase()) ||
        value.visits
          .toString()
          .toLowerCase()
          .includes(searchInput.toLowerCase())
      );
    });
    this.setState({ filteredData });
};

并有条件地呈现您的反应表

代码语言:javascript
复制
<ReactTable
   data={filteredData && filteredData.length ? filteredData : data}
   columns={columns}
   defaultPageSize={10}
   className="-striped -highlight"
/>

希望这能对你有所帮助!

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56833671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档