настроить функцию поиска в таблице ant ant, чтобы числовой поиск возвращал меньше или больше, а не только равнялся - PullRequest
0 голосов
/ 27 июня 2019

Насколько я вижу, таблица ant design в настоящее время не поставляется с определенным числовым поиском, где я могу возвращать результаты в определенном диапазоне, например> 10 или <= 50. </p>

Учитывая приведенный ниже пример: codesandbox

import React from 'react';
import ReactDOM from 'react-dom';
import 'antd/dist/antd.css';
import './index.css';
import { Table, Input, Button, Icon } from 'antd';
import Highlighter from 'react-highlight-words';

const data = [
  {
    key: '1',
    name: 'John Brown',
    age: 32,
    address: 'New York No. 1 Lake Park',
  },
  {
    key: '2',
    name: 'Joe Black',
    age: 42,
    address: 'London No. 1 Lake Park',
  },
  {
    key: '3',
    name: 'Jim Green',
    age: 32,
    address: 'Sidney No. 1 Lake Park',
  },
  {
    key: '4',
    name: 'Jim Red',
    age: 32,
    address: 'London No. 2 Lake Park',
  },
];

class App extends React.Component {
  state = {
    searchText: '',
  };

  getColumnSearchProps = dataIndex => ({
    filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters }) => (
      <div style={{ padding: 8 }}>
        <Input
          ref={node => {
            this.searchInput = node;
          }}
          placeholder={`Search ${dataIndex}`}
          value={selectedKeys[0]}
          onChange={e => setSelectedKeys(e.target.value ? [e.target.value] : [])}
          onPressEnter={() => this.handleSearch(selectedKeys, confirm)}
          style={{ width: 188, marginBottom: 8, display: 'block' }}
        />
        <Button
          type="primary"
          onClick={() => this.handleSearch(selectedKeys, confirm)}
          icon="search"
          size="small"
          style={{ width: 90, marginRight: 8 }}
        >
          Search
        </Button>
        <Button onClick={() => this.handleReset(clearFilters)} size="small" style={{ width: 90 }}>
          Reset
        </Button>
      </div>
    ),
    filterIcon: filtered => (
      <Icon type="search" style={{ color: filtered ? '#1890ff' : undefined }} />
    ),
    onFilter: (value, record) =>
      record[dataIndex]
        .toString()
        .toLowerCase()
        .includes(value.toLowerCase()),
    onFilterDropdownVisibleChange: visible => {
      if (visible) {
        setTimeout(() => this.searchInput.select());
      }
    },
    render: text => (
      <Highlighter
        highlightStyle={{ backgroundColor: '#ffc069', padding: 0 }}
        searchWords={[this.state.searchText]}
        autoEscape
        textToHighlight={text.toString()}
      />
    ),
  });

  handleSearch = (selectedKeys, confirm) => {
    confirm();
    console.log(selectedKeys);
    this.setState({ searchText: selectedKeys[0] });
  };

  handleReset = clearFilters => {
    clearFilters();
    this.setState({ searchText: '' });
  };

  render() {
    const columns = [
      {
        title: 'Name',
        dataIndex: 'name',
        key: 'name',
        width: '30%',
        ...this.getColumnSearchProps('name'),
      },
      {
        title: 'Age',
        dataIndex: 'age',
        key: 'age',
        width: '20%',
        ...this.getColumnSearchProps('age'),
      },
      {
        title: 'Address',
        dataIndex: 'address',
        key: 'address',
        ...this.getColumnSearchProps('address'),
      },
    ];
    return <Table columns={columns} dataSource={data} />;
  }
}

ReactDOM.render(<App />, document.getElementById('container'));

Давайте посмотрим на столбец возраста, если мы укажем точный возраст, будут возвращены точные результаты.На элементе input , когда значение введено, при вводе нажмите или onClick, запускается handleSearch , handleSearch затем устанавливает состояние реакции, затем компонентперерисовывается, все основные функциональные возможности реагируют.

Я не уверен, где находится логика, которая устанавливает то, что должно быть возвращено, так что неуверен, где и как я должен реализовать собственную логику для проверки определенного диапазона чисел, а неточное число.Любые идеи?

Кроме того, я проверил, существует ли числовой поиск / фильтр для ant-design, но я ничего не смог найти.

Для получения дополнительной информации см. Ant-designs таблица документации

1 Ответ

0 голосов
/ 28 июня 2019

Вы можете сделать любой фильтр, который вам нравится, , например , используя комбинацию Slider и InputNumber:

enter image description here

filterDropdown: ({ setSelectedKeys, selectedKeys, confirm }) => (
  <div style={{ padding: 8 }}>
    <Row
      type="flex"
      gutter={10}
      style={{ marginBottom: 8, alignItems: "center" }}
    >
      <Col>Range:</Col>
      <Col>
        <InputNumber
          value={this.state.left}
          onChange={e => {
            this.setState({ left: e });
            setSelectedKeys(data.filter(d => e <= d.age).map(d => d.key));
          }}
        />
      </Col>
      <Col>
        <InputNumber
          value={this.state.right}
          onChange={e => {
            this.setState({ right: e });
            setSelectedKeys(data.filter(d => d.age <= e).map(d => d.key));
          }}
        />
      </Col>
    </Row>
    <Row>
      <Slider
        range
        value={[this.state.left, this.state.right]}
        onChange={e => this.setState({ left: e[0], right: e[1] })}
      />
    </Row>
    <Row>
      <Button
        type="primary"
        block
        size="small"
        onClick={() => {
          this.handleSearchAge(selectedKeys, confirm);
          setSelectedKeys(
            data
              .filter(
                d => this.state.left <= d.age && d.age <= this.state.right
              )
              .map(d => d.key)
          );
        }}
      >
        Confirm
      </Button>
    </Row>
  </div>
);

Edit Q-56781764-SliderInTableFilter

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...