Vue.js 2 - Filtros em Listas

Com a nova versão do Vue.js a possibilidade de aplicar filtros no v-for deixou de existir. Porém esse recurso sempre trouxe certa confusão e até mesmo perda de performance.

Isso não é motivo de pânico para ninguém, a alternativa já existia muito antes da remoção desse recurso: computeds properties

Com computeds properties você ganha a habilidade de criar propriedades baseadas em outras propriedades do componente.

Nesse exemplo criamos a propriedade fullName a partir de firstName e lastName. Este é um recurso muito útil e poderoso, além de performático. O Vue.js faz cache do resultado, só alterando ele quando as dependências dele são alteradas (firstName e lastName).

O mesmo procedimento pode ser feito com listas, criando listas dinâmicas a partir de outros dados.

Ordenando

Consumir uma API com Vue.js é muito simples. Dessa vez vamos usar o axios, saiba mais sobre ele em Vue.js e Serviços

Porém essa lista não possui uma ordem definida, nesse momento vamos combinar o poder das computeds properties com a simplicidade e do javascript.

Vamos também usar o lodash para ajudar na tarefa, mesmo que essa seja uma tarefa simples para o um script javascript puro, no dia-a-dia você vai usar bastante esta lib, então vamos praticar com ela.

Foi criada a computed property list e trocamos repos por ela na nossa template. Agora a lista esta esta ordenada por nome, porém podemos deixar isso mais dinâmico.

Agora temos um controle dinâmico da ordenação da lista.

Filtrando

Temos a ordem do nossa lista pronta, agora vamos pesquisar dentro dela.

Agora nós temos a habilidade de ordenar e filtrar nossa lista.

Reaproveitamento

No começo isso pode parecer difícil, até mesmo ruim, porém com um pouco mais de abstração fica bem mais simples.

// helpers/strings.js
import { deburr, isEmpty } from 'lodash';  
export const sanitize = deburr;  
export const sanitizeAndLower = value => sanitize(value).toLowerCase();  
export const contains = (st, value) => sanitizeAndLower(st).indexOf(sanitizeAndLower(value)) > -1;  
// helpers/filters/by-prop.js
import { filter } from 'lodash';  
import { contains } from '../strings';

export const makeFilterByProp = key => (list, st) => filter(list, row => contains(row[key], st));  
export default (key, list, st) => filter(list, row => contains(row[key], st));  
// helpers/by-name.js
import { makeFilterByProp } from './by-prop';

export default makeFilterByProp('name');  
// an component
import { orderBy, isEmpty } from 'lodash';  
import filterByName from '../helpers/filters/by-name';

// omit

computed: {  
  listOrdened() {
    const { orderBy as by, order } = this.configs;

    return orderBy(this.repos, by, order);
  },
  list() {
    const filter = this.configs.filter;
    if (isEmpty(filter)) {
      return this.listOrdened;
    }

    return filterByName(this.listOrdened, filter);
  },
},

Esse conjunto de scripts prevê os principais problemas na hora de filtrar uma coleção, e deixa tudo abstraído para facilitar o uso em vários locais. Tudo isso é javascript puro e agnóstico, pode ser utilizado em vários locais e situações. Link para o gist aqui.


Participe da comunidade


Se quiser saber mais sobre meu trabalho visite codecasts.com.br. Lá você vai ver vídeos sobre Javascript, jQuery, Gulp, ES6, Vue.JS, Docker e muito mais.