Usando e criando filtros com Vue.js

Filtros são usados, na maioria das vezes, para formatar valores de databind (aqueles com {{ e }}). O exemplo a seguir irá pegar todo o valor de msg e transformar a primeira letra para maiúscula.

 <div>
   {{ msg | capitalize }}
</div>  

O nome do filtro a ser aplicado deve estar após o caractere pipe |. captalize é somente um dos filtros disponíveis. Existem os seguintes filtros pré configurados, veja:

uppercase Converte todas as letras para maiúscula

lowercase Converte todas as letras para minúscula

currency Converte um valor para moeda, incluindo o símbolo '$' que pode ser alterado de acordo com o seguinte exemplo:

  {{ total | currency 'R$' }}

pluralize Converte um item para o plural de acordo com o valor do filtro. Suponha que tenhamos uma variável chamada amount com o valor 1. Ao realizarmos o filtro {{ amount | pluralize 'item'}} teremos a resposta "item". Se o valor amout for dois ou mais, teremos a resposta "items".

json Converte um objeto para o formato JSON, retornando a sua representação em uma string.

debounce Limitado para diretivas, adiciona um atraso em milisegundos no evento em questão, como por exemplo <input @keyup="onKeyup | debounce 500">

limitBy Limitado por diretivas, é usado para limitar os valores de um v-for, usado principalmente para prover paginações. O exemplo a seguir irá mostrar somente os 10 primeiros itens:

 <div v-for="item in items | limitBy 10"></div>

E este exemplo exibe os itens de 5 a 15:

 <div v-for="item in items | limitBy 10 5"></div>

filterBy Limitado a diretivas, realiza um filtro em loops, como o v-for. Vamos a alguns exemplos para exemplificar melhor este processo.

 <div v-for="item in items | filterBy 'hello'">

Neste exemplo, somente valores que contém hello serão exibidos. Geralmente, o array items é um array de objetos (e não de strings), então para que possamos fazer um filtro em uma propriedade de um item do objeto, podemos fazer da seguinte forma:

   <div v-for="user in users | filterBy 'Jack' in 'name'">

No caso acima, users é um array de objetos em que a propriedade name é filtrada pela string Jack.

No próximo exemplo, criamos uma lista de frutas e usamos o recurso de filtro para: 1) capitalizar os itens e 2) filtrar de acordo com o que for digitado em uma caixa de texto, veja:

<div id="app">  
  <input v-model="filterValue"/>
  <ul>
    <li v-for="fruit in fruits | filterBy filterValue in 'name'">
      {{fruit.name | capitalize}}
    </li>
  </ul>  
</div>  

e

new Vue({  
    el:'#app',
  data:{
      fruits:[
        {name:'apple'},
      {name:'banana'},
      {name:'orange'},
      {name:'lemon'},
      {name:'grape'},
      {name:'rapberry '},
      {name:'coconut '},
      {name:'pear '}
    ],
    filterValue:''
  }
})

Este exemplo pode ser acessado pelo jsFiddle clicando aqui. nele, temos a criação da lista usando o filtro filterBy filterValue in 'name' onde filterName é a caixa de texto ligada pelo v-model.

Se houver necessidade de filtrar por mais campos, pode-se utilizar a seguinte expressão:

 <li v-for="user in users | filterBy searchText in 'name' 'phone'"></li>

orderBy Limitada a diretivas, principalmente a v-for, é usada para ordenar os itens de um array. Os exemplos a seguir ilustram o processo:

 <ul>
  <li v-for="user in users | orderBy 'name'">
    {{ user.name }}
  </li>
</ul>  

Para ordenar de forma decrescente, use:

 <ul>
  <li v-for="user in users | orderBy 'name' -1">
    {{ user.name }}
  </li>
</ul>  

Pode-se ordenar com dois ou mais valores:

<ul>  
  <li v-for="user in users | orderBy 'lastName'
            'firstName'">
    {{ user.lastName }}, {{ user.firstName }}
  </li>
</ul>  

Filtros personalizados

É possível criar filtros personalizados através do comando Vue.filter. O exemplo a seguir cria um filtro que irá inverter os caracteres de posição.

Vue.filter('reverse', function (value) {  
  return value.split('').reverse().join('')
})

Após a criação do filtro, pode-se usá-lo da seguinte forma:

<span v-text="message | reverse"></span>  

Um exemplo:

Concatenar filtros

É possível concatenar filtros para que possam ser executados em série. A concatenação deve ser feita sempre utilizando o caracter pipe "|". O exemplo a seguir ilustra este processo:

<li v-for="fruit in fruits | filterBy filterValue in 'name' | limitBy 3">