fbpx

Vue.js 3.x – 08 – Criando uma aplicação “To-do List”

Vue.js 3.x – 08 – Criando uma aplicação “To-do List”
ATENÇÃO! Para compreender completamente o código explicado neste post, recomendamos ler o post anterior, em que são aborados métodos e eventos. Clique aqui!

Saudações! Neste post, vamos desenvolver passo-a-passo uma aplicação “To-do List”, que é uma aplicação simples, mas com grande poder didático. Assim, vamos reforçar o que vimos sobre o Vue.js nos posts anteriores, além de ver algumas coisas novas!

Let’s code!

Passo 1 – Criar um novo projeto

Com o Vue devidamente instalado e configurado (não saber como instalar e configurar o Vue? Clique aqui!), abra o prompt de comando e crie um novo projeto em uma pasta de sua preferência. Para isso, digite o comando: vue create todo-list. No menu, selecione a a opção “Default (Vue 3) … e aguarde a criação do projeto.

Selecione a segunda opção no menu de criação do projeto.

Agora basta acessar a pasta criada e iniciar o servidor de desenvolvimento usando o comando npm run serve. Agora temos um servidor respondendo no localhost, na porta 8080.

Servidor de desenvolvimento do Vue

Ao abrir o endereço http://localhost:8080/ será exibido a aplicação:

Pronto! Projeto criado, agora vamos mexer no código!

Para fins didáticos, vamos deixar nossa aplicação o mais simples possível, ok? Para isso, vamos abrir o arquivo src/components/App.vue, que é o ponto de entrada de nossa aplicação, e vamos retirar todo o código padrão que foi criado. O código deve ficar como a seguir.

<template>
  <div>
    <!-- código HTML aqui -->
  </div>
</template>

<script>
//..aqui vai a lógica da aplicação ou componente

export default {
  //..nome da aplicação
  name: 'Todo List',
    
}
</script>
<style>
/* estilos CSS aqui */

</style>

Parte 2 – Codificando o HTML e o CSS

Nossa aplicação terá basicamente 3 elementos:

  • Um campo de entrada do tipo texto para digitar a to-do (tarefa);
  • Um botão para inserir a to-do numa lista
  • Umal lista para exibir as tarefas

Assim, o código HTML (bloco template) deve ficar inicialmente assim:

<template>
  <div>
    <!-- código HTML aqui -->
    <h1>Aplicação To-do List</h1>
    <hr>
    <input type="text" name="todo" id="todo">
    <button>Inserir</button>
    <ul>
      <li>As tarefas aparecerão aqui</li>
    </ul>
  </div>
</template>
Aparência da aplicação

Agora vamos definir os estilos CSS para nossa aplicação (bloco style).

<style>
/* estilos CSS aqui */
li {
  cursor: pointer; /* altera o cursor */
  user-select: none; /* impede que o item seja selecionado */
}
/* classe para mudar a aparência de uma tarefa quando ela for completada */
.complete {
  text-decoration: line-through; /* coloca um traço no texto */
  color: green; /* altera a cor */
}
</style>

Parte 3 – Entendendo a lógica da aplicação

Agora iremos definir os métodos da aplicação, consirando os seguintes casos de uso:

  • Adicionar uma nova tarefa: digitar o nome da tarefa e clicar no botão inserir;
  • Excluir uma tarefa: dar duplo clique no nome da tarefa;
  • Finalizar/Ativar uma tarefa: dar um clique na tarefa.

Entretanto, antes de definir os métodos, vamos definir os dados (bloco script) que serão manipulado. O código comentado a seguir a seguir mostra 3 data properties que iremos usar na aplicação: id, todo e todos.

<script>
//..aqui vai a lógica da aplicação ou componente
export default {
  //..nome da aplicação
  name: 'Todo List',
  //..lifecycle rook - após o documento ser criado
  created(){
    //..seta o título da aplicação
    document.title = 'Aplicação To-do List'
  },
  data() {
    return {
      id : 0, //..id das tarefas
      todo : '', //..nome do todo que será vinculado ao input
      todos : [] //..array vazio em que serão armazenados as tarefas
    }
  }, //..não esqueça essa vírgula! 
}
</script>

O próximo passo é vincular a data property todo ao campo input. Para isso, vamos usar a diretiva v-model, como mostra o código comentado a seguir (bloco HTML) na linha7.

 <template>
  <div>
    <!-- código HTML aqui -->
    <h1>Aplicação To-do List</h1>
    <hr>
    <!-- a diretiva v-model faz o binding com a data property -->
    <input type="text" v-model="todo" name="todo" id="todo">
    <button>Inserir</button>
    <ul>
      <li>As tarefas aparecerão aqui</li>
    </ul>
  </div>
</template>

Quando vinculamos um input a uma data property via diretiva v-model, a reatividade do Vue entra em ação. Portanto, ao usar a ferramenta Vue.js Dev Tools, é possível verificar que o que é digitado no campo já altera o valor da data property todo“.

A reatividade do Vue.js em ação.

Lembre-se que a diretiva v-model cria um vínculo do tipo two-way binding, ou seja, se você alterar os dados do objeto data diretamente, ao confirmar a entrada, o input será atualizado. Faça o teste! 😉

Parte 04 – Definindo os métodos

A seguir, temos o código comentados dos 5 métodos necessários (inseridos após a propriedade data, no bloco script) para que nossa aplicação funcione como planejada.

methods: {
    //..método para gerar um id
    genId() {
      return (this.id += 1); //..incrementa a data property 'id'
    },
    // ----------------------------------------------------
    add(todo) {
      //..adiciona um novo to-do ao array todos usando push (função JS)
      this.todos.push({
        id: this.genId(), //..gera um novo id
        name: todo, //..o nome da tarefa
        done: false, //..inicialmente uma tarefa não está concluída
      });
      this.todo = ""; //..limpa os dados
    },
    // ----------------------------------------------------
    //..pega o index do to-do corrente - para excluir depois
    getIndex(todo) {
      //..recebe o todo como parâmetro, procura ele e retorna o seu index
      let index = this.todos.findIndex( item => item.id === todo.id );
      return index;      
    },
    // ----------------------------------------------------
    //..exclui um todo - pega o index e faz um splice (função JS)
    remove(todo) {
      let index = this.getIndex(todo);
      this.todos.splice(index, 1);
    },
    // ----------------------------------------------------
    //..recebe um todo como parâmetro de entrada muda seu status
    complete(todo) {
      todo.done = !todo.done;
    },
  }

Agora que os métodos foram definidos, vamos vinculá-los aos eventos para que a aplicação funcione corretamente.

Parte 05 – Adicionando as tarefas à lista de tarefas

Para que as tarefas sejam adicionadas, precisamos invocar o método add(todo). Assim, vamos invocá-lo em dois eventos: 1) ao digitar a tecla ENTER depois de digitar a tarefa; 2) ao clicar no botão Inserir. O código comentado a seguir mostra a vinculação usando eventos. Vejas as linhas

<template>
  <div>
    <!-- código HTML aqui -->
    <h1>Aplicação To-do List</h1>
    <hr />
    <!-- vinculando o evento pressionar a tecla ENTER ao método add -->
    <input type="text" v-model="todo" name="todo" id="todo"
      @keyup.enter="add(todo)"
    />
    <!-- vinculando o evento 'click' ao método add -->
    <button @click="add(todo)">Inserir</button>
    <ul>
      <li>As tarefas aparecerão aqui</li>
    </ul>
  </div>
</template>

A partir de agora, se usar a ferramenta Vue.js DevTools, será possível ver que o array ‘todos’ está sendo alimentado com os dados digitados no input.

Parte 06 – Exibindo as tarefas

Agora que as tarefas estão sendo inseridas no array todos’, precisamos exibí-las no elmento ul (lista). Cada tarefa será um elemento li e iremos associar os eventos click para completar a tarefa e double click para excluir uma tarefa. O conteúdo o elemento li é o nome da tarefa, que será exibido mediante a vinculação direta da variável corrente do loop usando a sintaxe double mustache.

Veja o código completo da lista (elemento ul) comentado a seguir.

<ul>
      <!-- usamos a diretiva v-for para fazer um loop e criar a lista -->
      <!-- vinculamos os eventos à chamada de métodos -->
      <!-- fizemos o binding de classes - se a propriedade 'done' for true, 
           então aplica a classe 'complete'  -->
      <li v-for="todo in todos" :key="todo.id"         
        @dblclick="remove(todo)"
        @click="complete(todo)"
        :class="todo.done && 'complete'"
      >
      <!-- sintaxe double mustache para exibir o nome da tarefa -->
        {{ todo.name }}
      </li>
</ul>

Agora sim! Nossa aplicação “To-do List” está pronta! Veja:

Aplicação “To-do List”

Parte 07 – Melhore a aplicação

Agora que a aplicação está pronta, vale a apena melhorá-la. Por exemplo, do jeito que está, é possível adicionar tarefas com nome vazio. Fix it!

Já imaginou que interessante mostrar a quantidade de tarefas completas e não completas? O que está esperando? Faça isso!

Faça também alguns ajustes no CSS, para deixar a aplicação mais “bonita”.

Bônus

Clique aqui para usar uma aplicação “To-do List” com animações e CSS.

Clique aqui para baixar o código-fonte do GitHub.

Considerações finais

Essa pequena aplicação do tipo “To-do list” foi útil para aprender e reforçar diversos conceitos sobre o Vue.js. Entretanto, estamos apenas começando nossas jornada. Acredito que já deu pra percber que o Vue.js é uma ferramenta extremamente poderosa e simples.

Até o próximo post!

Jorge Luís Gregório

Jorge Luís Gregório

Professor e entusiasta de tecnologia, estudioso da cultura NERD e fã de quadrinhos, animes e games. Mais um pai de menino, casado com a mulher mais linda da galáxia e cristão convicto. Gosto de ler ficção científica e discutir tecnologia, filmes, seriados, teologia, filosofia e política. Quer falar sobre esses e diversos outros assuntos? Venha comigo!