简体   繁体   English

我如何过滤 Antd 中的列

[英]How I filter the column in Antd

I am trying to filter an array according to an input.我正在尝试根据输入过滤数组。 But for some reason this is not working...但由于某种原因,这不起作用......

I use React and use the Antd (Ant Design) dependency.我使用 React 并使用 Antd(Ant Design)依赖项。 React version is 16.9.0 and Antd version is 3.23.1. React 版本是 16.9.0,Antd 版本是 3.23.1。 I use the reaction hooks to create the site.我使用反应挂钩来创建站点。

import React, { useState, useEffect } from 'react'
import { Link } from 'react-router-dom'
import { Input, Icon, Button } from 'antd'
import Highlighter from 'react-highlight-words'
import { Button as ButtonCustom, message, HttpRequest, Icon as IconCustom, Table, Footer, Menu, formatDate, store } from '~/routes'

const Permission = props => {

    const [permission, setPermission] = useState([])

    const [searchText, setSearchText] = useState('')

    const [searchInput, setSearchInput] = useState('')

    const handleSearch = (selectedKeys, confirm) => {
        confirm()
        setSearchText(selectedKeys[0])
    }

    const handleReset = clearFilters => {
        clearFilters()
        setSearchText('')
    }

    const getColumnSearchProps = (dataIndex, name) => ({
        filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters }) => (
            <div style={{ padding: 8 }}>
                <Input
                    ref={node => { setSearchInput(node) }}
                    placeholder={`Buscar ${name}`}
                    value={selectedKeys[0]}
                    onChange={e => setSelectedKeys(e.target.value ? [e.target.value] : [])}
                    onPressEnter={() => handleSearch(selectedKeys, confirm)}
                    style={{ width: 188, marginBottom: 8, display: 'block' }}
                />
                <Button
                    type="primary"
                    onClick={() => handleSearch(selectedKeys, confirm)}
                    icon="search"
                    size="small"
                    style={{ width: 90, marginRight: 8 }}
                >
                    Buscar
                </Button>
                <Button onClick={() => handleReset(clearFilters)} size="small" style={{ width: 90 }}>
                    Limpar
                </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(() => searchInput.select()) },
        render: text => (
            <Highlighter
                highlightStyle={{ backgroundColor: '#ffc069', padding: 0 }}
                searchWords={[searchText]}
                autoEscape
                textToHighlight={text.toString()}
            />
        )
    })

    useEffect(() => {
        setPermission(store.getState().states.permissions)
    }, [])

    const returnInclusion = data => {
        if (data) return 'Habilitado'
        return 'Desabilitado'
    }

    const returnRead = data => {
        if (data) return 'Habilitado'
        return 'Desabilitado'
    }

    const returnModification = data => {
        if (data) return 'Habilitado'
        return 'Desabilitado'
    }

    const columns = [
        {
            title: 'Modulo',
            dataIndex: 'module',
            key: 'module'
        },
        {
            title: 'Nome',
            dataIndex: 'user',
            key: 'user',
            ...getColumnSearchProps("user", "Usuário")
        },
        {
            title: 'Inclusão',
            dataIndex: 'inclusion',
            key: 'inclusion',
            filters: [
                {
                    text: 'Habilitado',
                    value: 'Habilitado'
                },
                {
                    text: 'Desabilitado',
                    value: 'Desabilitado'
                }
            ],
            filterMultiple: false,
            onFilter: (value, record) => record.inclusion.indexOf(value) === 0
        },
        {
            title: 'Leitura',
            dataIndex: 'read',
            key: 'read',
            filters: [
                {
                    text: 'Habilitado',
                    value: 'Habilitado'
                },
                {
                    text: 'Desabilitado',
                    value: 'Desabilitado'
                }
            ],
            filterMultiple: false,
            onFilter: (value, record) => record.read.indexOf(value) === 0
        },
        {
            title: 'Modificação',
            dataIndex: 'modification',
            key: 'modification',
            filters: [
                {
                    text: 'Habilitado',
                    value: 'Habilitado'
                },
                {
                    text: 'Desabilitado',
                    value: 'Desabilitado'
                }
            ],
            filterMultiple: false,
            onFilter: (value, record) => record.modification.indexOf(value) === 0
        },
        {
            title: 'Ultima atualização',
            key: 'datalog',
            dataIndex: 'datalog'
        },
        {
            title: 'Ação',
            key: 'action',
            dataIndex: 'icon'
        }
    ]

    return (
        <>
            <Menu />
            <Table columns={columns}>
                {
                    permission.map(data => (
                        {
                            key: data.ax_permissao_usuarioid,
                            user: data.ax_permissao_usuario_name,
                            module: data.ax_permissao_name_modulo,
                            // inclusion: (data.ax_permissao_inclusao ? "Habilitado" : "Desabilidado"),
                            inclusion: (returnInclusion(data.ax_permissao_inclusao)),
                            // read: (data.ax_permissao_leitura ? "Habilitado" : "Desabilidado"),
                            read: (returnRead(data.ax_permissao_leitura)),
                            // modification: (data.ax_permissao_modificacao ? "Habilitado" : "Desabilidado"),
                            modification: (returnModification(data.ax_permissao_modificacao)),
                            datalog: formatDate(data.ax_permissao_dataregistro),
                            icon: (
                                <span
                                    title={`Editar permissão de ${data.ax_permissao_usuarioid}`}
                                    onClick={() => localStorage.setItem("EditItem", data.ax_permissao_codmodulo)}
                                    onKeyDown={() => localStorage.setItem('EditItem', data.ax_permissao_codmodulo)}
                                    tabIndex="0"
                                    role="menuitem"
                                >
                                    <Link to="/updateuser" role="link">
                                        <IconCustom type="edit" role="menuitem" />
                                    </Link>
                                </span>
                            )
                        }))
                }
            </Table>
            <ButtonCustom tipo="main" description="Criar uma nova Permissão" handle={() => props.history.push("/createpermission")}>
                Cadastrar permissão
            </ButtonCustom>
            <Footer />
        </>
    )
}

export default Permission

I hope that by typing in input it will filter only those that have the specified name.我希望通过输入输入它只会过滤那些具有指定名称的人。 But it shows the error:但它显示了错误:

error image错误图像

This is an example of what I would like to do: Sample code that is working这是我想做的一个例子:正在工作的示例代码

You've probably found a solution already, but hopefully this will help someone else您可能已经找到了解决方案,但希望这对其他人有帮助

I had this same issue with using hooks with antd tables.我在使用带有 antd 表的钩子时遇到了同样的问题。 The this.searchInput variable is not supposed to be part of React state, that's why it updates too frequently. this.searchInput变量不应该是 React state 的一部分,这就是它更新太频繁的原因。 Make it a simple variable, like this:使其成为一个简单的变量,如下所示:

let searchInput = null;

... ...

<Input
    ref={node => { searchInput = node }}
    ...
/>

... ...

That should fix your issues那应该可以解决您的问题

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM