Quando usamos o AG Grid em uma aplicação React, é comum querer exibir dados complexos, como objetos aninhados, diretamente nas células da tabela. Muitas vezes, também queremos renderizar essas informações com componentes personalizados e, ao mesmo tempo, manter a funcionalidade de filtros da tabela. Mas como fazer isso quando a célula recebe um objeto?
Neste artigo, vamos mostrar como aplicar filtros mesmo quando a célula contém um objeto complexo, utilizando valueGetter para extrair o valor a ser filtrado, sem abrir mão de componentes personalizados com cellRenderer.
Estrutura dos dados
Imagine que você tem um dataset assim:
{
"volume": {
"foo": 123,
"bar": 321
},
"outro": {``
"foo": 344,
"bar": 76
}
}
E deseja exibir volume.foo em uma célula com um componente React, mantendo a capacidade de filtrar por esse valor.
valueGetter + cellRenderer
A chave está em separar a lógica de exibição da lógica de filtro. O valueGetter serve para informar ao AG Grid qual valor deve ser usado internamente — inclusive nos filtros — enquanto o cellRenderer trata apenas da exibição visual.
Exemplo:
const columnDefs = [
{
headerName: 'Volume Foo',
field: 'volume',
valueGetter: (params) => params.data.volume?.foo,
cellRenderer: VolumeFooRenderer,
filter: 'agNumberColumnFilter'
}
];
Nesse exemplo:
valueGetter: extrai volume.foo do objeto
cellRenderer: renderiza um componente React personalizado
filter: aplica um filtro numérico sobre o valor retornado
Exemplo de componente cellRenderer
const VolumeFooRenderer = (props) => {
const value = props.value; // Recebe o volume.foo já extraído
return <span style={{ color: 'blue' }}>{value}</span>;
};
Simples e funcional!
Filtrando múltiplos campos
Se você quiser que o filtro considere mais de um campo (por exemplo, volume.foo e volume.bar), pode retornar uma string concatenada:
valueGetter: (params) => {
const { foo, bar } = params.data.volume || {};
return `${foo ?? ''} ${bar ?? ''}`;
},
filter: 'agTextColumnFilter'
Dessa forma, qualquer termo digitado que corresponda a foo ou bar será encontrado pelo filtro.
🚀 Conclusão
Mesmo com colunas que recebem objetos ou renderizam componentes personalizados, é totalmente possível manter a funcionalidade de filtros no AG Grid. Com o uso de valueGetter, podemos extrair os dados relevantes para o filtro sem afetar a experiência visual da tabela
Top comments (0)