Filtro de pesquisa de grade React
O recurso Filtro de Pesquisa Ignite UI for React no React Grid permite o processo de localização de valores na coleta de dados. Facilitamos a configuração dessa funcionalidade e ela pode ser implementada com uma caixa de entrada de pesquisa, botões, navegação por teclado e outros recursos úteis para uma experiência de usuário ainda melhor. Embora os navegadores forneçam nativamente a funcionalidade de pesquisa de conteúdo, na maioria das vezes eles IgrGrid
virtualizam suas colunas e linhas que estão fora de exibição. Nesses casos, a pesquisa nativa do navegador não consegue pesquisar dados nas células virtualizadas, pois elas não fazem parte do DOM. Estendemos a grade baseada em tabela do React Material com uma API de pesquisa que permite pesquisar o conteúdo virtualizado do IgrGrid
.
React Search Example
O exemplo a seguir representa IgrGrid
uma caixa de entrada de pesquisa que permite pesquisar em todas as colunas e linhas, bem como opções de filtragem específicas para cada coluna.
React Search Usage
Grid Setup
Vamos começar criando nossa grade e vinculando-a aos nossos dados. Também adicionaremos alguns estilos personalizados para os componentes que usaremos!
.gridSize {
--ig-size: var(--ig-size-small);
}
<IgrGrid ref={gridRef} className="gridSize" autoGenerate={false} allowFiltering={true} data={data}>
<IgrColumn field="IndustrySector" dataType="string" sortable={true}></IgrColumn>
<IgrColumn field="IndustryGroup" dataType="string" sortable={true}></IgrColumn>
<IgrColumn field="SectorType" dataType="string" sortable={true}></IgrColumn>
<IgrColumn field="KRD" dataType="number" sortable={true}></IgrColumn>
<IgrColumn field="MarketNotion" dataType="number" sortable={true}></IgrColumn>
</IgrGrid>
Ótimo, e agora vamos nos preparar para a nossa IgrGrid
API de pesquisa! Podemos criar algumas propriedades, que podem ser usadas para armazenar o texto pesquisado no momento e se a pesquisa diferencia maiúsculas de minúsculas e/ou por uma correspondência exata.
const gridRef = useRef<IgrGrid>(null);
const [caseSensitiveSelected, setCaseSensitiveSelected] = useState<boolean>(false);
const [exactMatchSelected, setExactMatchSelected] = useState<boolean>(false);
const [searchText, setSearchText] = useState('');
React Search Box Input
Agora vamos criar nossa entrada de pesquisa! Ao vincular nossa searchText
propriedade à value
nossa entrada recém-criada e assinar o inputOccured
evento, podemos detectar todas as searchText
modificações do usuário. Isso nos permitirá usar os IgrGrid
métodos e findPrev
para destacar todas as ocorrências findNext
do searchText
e rolar para o próximo/anterior (dependendo de qual método invocamos).
Ambos os métodos e findNext
os findPrev
métodos têm três argumentos:
Text
: string (o texto que estamos procurando)- (opcional)
CaseSensitive
: boolean (a pesquisa deve diferenciar maiúsculas de minúsculas ou não, o valor padrão é false) - (opcional)
ExactMatch
: boolean (a busca deve ser por uma correspondência exata ou não, o valor padrão é false)
Ao pesquisar por uma correspondência exata, a API de pesquisa destacará como resultados apenas os valores de células que correspondem inteiramente ao SearchText
, levando em conta também a diferenciação entre maiúsculas e minúsculas. Por exemplo, as strings 'software' e 'Software' são uma correspondência exata, desconsiderando a diferenciação entre maiúsculas e minúsculas.
Os métodos acima retornam um valor numérico (o número de vezes que contém IgrGrid
a cadeia de caracteres fornecida).
const handleOnSearchChange = (event: IgrComponentValueChangedEventArgs) => {
setSearchText(event.detail);
nextSearch(event.detail, caseSensitiveSelected, exactMatchSelected);
}
<IgrInput name="searchBox" value={searchText} onInput={handleOnSearchChange}>
</IgrInput>
Add Search Buttons
Para pesquisar e navegar livremente entre nossos resultados de pesquisa, vamos criar alguns botões invocando o findNext
e os findPrev
métodos dentro dos respectivos manipuladores de eventos de clique dos botões.
const prevSearch = (text: string, caseSensitive: boolean, exactMatch: boolean) => {
gridRef.current.findPrev(text, caseSensitive, exactMatch);
}
const nextSearch = (text: string, caseSensitive: boolean, exactMatch: boolean) => {
gridRef.current.findNext(text, caseSensitive, exactMatch);
}
<IgrIconButton variant="flat" name="prev" collection="material" onClick={() => prevSearch(searchText, caseSensitiveSelected, exactMatchSelected)}>
</IgrIconButton>
<IgrIconButton variant="flat" name="next" collection="material" onClick={() => nextSearch(searchText, caseSensitiveSelected, exactMatchSelected)}>
</IgrIconButton>
Add Keyboard Search
Também podemos permitir que os usuários naveguem pelos resultados usando as teclas de seta do teclado e a Enter tecla. Para conseguir isso, podemos lidar com o evento keydown de nossa entrada de pesquisa, impedindo o movimento de acento circunflexo padrão da entrada com o PreventDefault
método e invocar os findNext
métodos / findPrev
, dependendo de qual tecla o usuário pressionou.
const searchKeyDown = (e: KeyboardEvent<HTMLElement>) => {
if (e.key === 'Enter') {
e.preventDefault();
nextSearch(searchText, caseSensitiveSelected, exactMatchSelected);
} else if (e.key === 'ArrowUp' || e.key === 'ArrowLeft') {
e.preventDefault();
prevSearch(searchText, caseSensitiveSelected, exactMatchSelected);
}
}
<div onKeyDown={searchKeyDown}>
<IgrInput name="searchBox" value={searchText} onInput={handleOnSearchChange}></IgrInput>
</div>
Case Sensitive and Exact Match
Agora vamos permitir que o usuário escolha se a pesquisa deve diferenciar maiúsculas de minúsculas e/ou por uma correspondência exata. Para isso, podemos usar o IgrChip
componente junto com uma variável de estado booleano para indicar se o IgrChip está selecionado.
const [caseSensitiveSelected, setCaseSensitiveSelected] = useState<boolean>(false);
const [exactMatchSelected, setExactMatchSelected] = useState<boolean>(false);
const handleCaseSensitiveChange = (event: IgrComponentBoolValueChangedEventArgs) => {
setCaseSensitiveSelected(event.detail);
nextSearch(searchText, event.detail, exactMatchSelected);
}
const handleExactMatchChange = (event: IgrComponentBoolValueChangedEventArgs) => {
setExactMatchSelected(event.detail);
nextSearch(searchText, caseSensitiveSelected, event.detail);
}
<IgrChip selectable={true} onSelect={handleCaseSensitiveChange}>
<span>Case Sensitive</span>
</IgrChip>
<IgrChip selectable={true} onSelect={handleExactMatchChange}>
<span>Exact Match</span>
</IgrChip>
Persistence
E se quisermos filtrar e classificar nosso IgrGrid
ou mesmo para adicionar e remover registros? Após essas operações, os destaques de nossa pesquisa atual são atualizados automaticamente e persistem sobre qualquer texto que corresponda ao SearchText
! Além disso, a pesquisa funcionará com paginação e persistirá os destaques por meio de alterações do IgrGrid
's PerPage
propriedade.
Adding icons
Usando alguns de nossos outros componentes, podemos criar uma interface de usuário enriquecida e melhorar o design geral de toda a nossa barra de pesquisa! Podemos ter um bom ícone de pesquisa ou exclusão à esquerda da entrada de pesquisa, alguns chips para nossas opções de pesquisa e alguns ícones de design de material combinados com belos botões de estilo ondulado para nossa navegação à direita.
Vamos começar criando os botões de navegação de pesquisa à direita da entrada, adicionando dois botões de estilo ondulado com ícones de material. Os manipuladores para os eventos de clique permanecem os mesmos - invocando os métodos / findNext
findPrev
.
- Para exibir alguns chips que alternam as
CaseSensitive
propriedades e .ExactMatch
Substituímos as caixas de seleção por dois chips elegantes. Sempre que um chip é clicado, invocamos seu respectivo manipulador.
const prevSearch = (text: string, caseSensitive: boolean, exactMatch: boolean) => {
gridRef.current.findPrev(text, caseSensitive, exactMatch);
}
const nextSearch = (text: string, caseSensitive: boolean, exactMatch: boolean) => {
gridRef.current.findNext(text, caseSensitive, exactMatch);
}
<div slot="suffix">
<IgrIconButton variant="flat" name="prev" collection="material" onClick={() => prevSearch(searchText, caseSensitiveSelected, exactMatchSelected)}>
<IgrRipple></IgrRipple>
</IgrIconButton>
<IgrIconButton variant="flat" name="next" collection="material" onClick={() => nextSearch(searchText, caseSensitiveSelected, exactMatchSelected)}>
<IgrRipple></IgrRipple>
</IgrIconButton>
</div>
Agora vamos adicionar os ícones de pesquisa e limpeza à esquerda da entrada:
const clearSearch = () => {
setSearchText('');
gridRef.current.clearSearch();
}
<div slot="prefix">
{searchText.length === 0 ? (
<IgrIconButton variant="flat" name="search" collection="material">
</IgrIconButton>
) : (
<IgrIconButton variant="flat" name="clear" collection="material" onClick={clearSearch}>
</IgrIconButton>
)}
</div>
Finalmente, este é o resultado final quando combinamos tudo:
useEffect(() => {
registerIconFromText("search", searchIconText, "material");
registerIconFromText("clear", clearIconText, "material");
registerIconFromText("prev", prevIconText, "material");
registerIconFromText("next", nextIconText, "material");
}, []);
<IgrInput name="searchBox" value={searchText} onInput={handleOnSearchChange}>
<div slot="prefix">
{searchText.length === 0 ? (
<IgrIconButton variant="flat" name="search" collection="material">
</IgrIconButton>
) : (
<IgrIconButton variant="flat" name="clear" collection="material" onClick={clearSearch}>
</IgrIconButton>
)}
</div>
<div slot="suffix">
<IgrIconButton variant="flat" name="prev" collection="material" onClick={() => prevSearch(searchText, caseSensitiveSelected, exactMatchSelected)}>
<IgrRipple></IgrRipple>
</IgrIconButton>
<IgrIconButton variant="flat" name="next" collection="material" onClick={() => nextSearch(searchText, caseSensitiveSelected, exactMatchSelected)}>
<IgrRipple></IgrRipple>
</IgrIconButton>
</div>
</IgrInput>
Known Limitations
Limitação | Descrição |
---|---|
Pesquisando em células com um modelo | Os destaques da funcionalidade de pesquisa funcionam apenas para os modelos de célula padrão. Se você tiver uma coluna com modelo de célula personalizado, os destaques não funcionarão, então você deve usar abordagens alternativas, como um formatador de coluna, ou definir osearchable propriedade na coluna como falsa. |
Virtualização Remota | A pesquisa não funcionará corretamente ao usar virtualização remota |
Células com texto cortado | Quando o texto na célula é muito grande para caber e o texto que estamos procurando é cortado pelas reticências, ainda rolaremos até a célula e a incluiremos na contagem de correspondências, mas nada será destacado |
API References
Neste artigo, implementamos nossa própria barra de pesquisa para o IgrGrid
com algumas funcionalidades adicionais quando se trata de navegar entre os resultados da pesquisa. Também usamos alguns componentes Ignite UI for React adicionais, como ícones, chips e entradas. A API de pesquisa está listada abaixo.
IgrGrid
methods:
IgrColumn
properties:
Componentes adicionais com APIs relativas que foram usadas:
Additional Resources
- Virtualização e desempenho
- Filtragem
- Paginação
- Classificação
- Resumos
- Movimentação de Colunas
- Fixação de coluna
- Redimensionamento de colunas
- Escolha
Nossa comunidade é ativa e sempre acolhedora para novas ideias.