繁体   English   中英

我如何过滤 Antd 中的列

[英]How I filter the column in Antd

我正在尝试根据输入过滤数组。 但由于某种原因,这不起作用......

我使用 React 并使用 Antd(Ant Design)依赖项。 React 版本是 16.9.0,Antd 版本是 3.23.1。 我使用反应挂钩来创建站点。

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

我希望通过输入输入它只会过滤那些具有指定名称的人。 但它显示了错误:

错误图像

这是我想做的一个例子:正在工作的示例代码

您可能已经找到了解决方案,但希望这对其他人有帮助

我在使用带有 antd 表的钩子时遇到了同样的问题。 this.searchInput变量不应该是 React state 的一部分,这就是它更新太频繁的原因。 使其成为一个简单的变量,如下所示:

let searchInput = null;

...

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

...

那应该可以解决您的问题

暂无
暂无

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

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