En este proyecto, vamos a aplicar los conocimientos adquiridos en los módulos anteriores para construir una aplicación de lista de tareas (To-Do List) utilizando Vue.js. Este proyecto te permitirá consolidar conceptos clave como componentes, gestión de estado, y enrutamiento.

Objetivos del Proyecto

  • Crear una aplicación Vue.js desde cero.
  • Utilizar componentes para estructurar la aplicación.
  • Implementar Vue Router para la navegación.
  • Gestionar el estado de la aplicación con Vuex.
  • Aplicar directivas y bindings para la interacción del usuario.

Estructura del Proyecto

  1. Configuración del Proyecto
  2. Creación de Componentes
  3. Gestión del Estado con Vuex
  4. Implementación de Vue Router
  5. Estilización y Mejoras

  1. Configuración del Proyecto

Paso 1: Crear un Nuevo Proyecto Vue

Primero, asegúrate de tener Vue CLI instalado. Si no lo tienes, instálalo con el siguiente comando:

npm install -g @vue/cli

Luego, crea un nuevo proyecto:

vue create todo-list-app

Selecciona las opciones predeterminadas o personaliza según tus necesidades.

Paso 2: Instalar Dependencias Adicionales

Vamos a necesitar Vue Router y Vuex. Instálalos con los siguientes comandos:

cd todo-list-app
npm install vue-router vuex

  1. Creación de Componentes

Paso 1: Estructura de Componentes

Vamos a crear los siguientes componentes:

  • TodoList.vue: Para mostrar la lista de tareas.
  • TodoItem.vue: Para representar cada tarea individual.
  • AddTodo.vue: Para añadir nuevas tareas.

Paso 2: Implementación de TodoList.vue

<template>
  <div>
    <h1>Lista de Tareas</h1>
    <AddTodo />
    <ul>
      <TodoItem v-for="todo in todos" :key="todo.id" :todo="todo" />
    </ul>
  </div>
</template>

<script>
import { mapState } from 'vuex';
import AddTodo from './AddTodo.vue';
import TodoItem from './TodoItem.vue';

export default {
  components: {
    AddTodo,
    TodoItem
  },
  computed: {
    ...mapState(['todos'])
  }
};
</script>

Paso 3: Implementación de TodoItem.vue

<template>
  <li>
    <input type="checkbox" v-model="todo.completed" @change="toggleComplete" />
    <span :class="{ completed: todo.completed }">{{ todo.text }}</span>
    <button @click="removeTodo">Eliminar</button>
  </li>
</template>

<script>
export default {
  props: ['todo'],
  methods: {
    toggleComplete() {
      this.$store.commit('toggleComplete', this.todo.id);
    },
    removeTodo() {
      this.$store.commit('removeTodo', this.todo.id);
    }
  }
};
</script>

<style scoped>
.completed {
  text-decoration: line-through;
}
</style>

Paso 4: Implementación de AddTodo.vue

<template>
  <div>
    <input v-model="newTodo" @keyup.enter="addTodo" placeholder="Añadir nueva tarea" />
    <button @click="addTodo">Añadir</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      newTodo: ''
    };
  },
  methods: {
    addTodo() {
      if (this.newTodo.trim()) {
        this.$store.commit('addTodo', this.newTodo);
        this.newTodo = '';
      }
    }
  }
};
</script>

  1. Gestión del Estado con Vuex

Paso 1: Configuración de Vuex

Crea un archivo store.js en la carpeta src y configura Vuex:

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    todos: []
  },
  mutations: {
    addTodo (state, text) {
      state.todos.push({
        id: Date.now(),
        text,
        completed: false
      });
    },
    toggleComplete (state, id) {
      const todo = state.todos.find(todo => todo.id === id);
      if (todo) {
        todo.completed = !todo.completed;
      }
    },
    removeTodo (state, id) {
      state.todos = state.todos.filter(todo => todo.id !== id);
    }
  }
});

Paso 2: Integrar Vuex en la Aplicación

En main.js, importa y usa el store:

import Vue from 'vue';
import App from './App.vue';
import store from './store';

Vue.config.productionTip = false;

new Vue({
  store,
  render: h => h(App)
}).$mount('#app');

  1. Implementación de Vue Router

Paso 1: Configuración de Rutas

Crea un archivo router.js en la carpeta src y configura Vue Router:

import Vue from 'vue';
import Router from 'vue-router';
import TodoList from './components/TodoList.vue';

Vue.use(Router);

export default new Router({
  routes: [
    {
      path: '/',
      name: 'TodoList',
      component: TodoList
    }
  ]
});

Paso 2: Integrar Vue Router en la Aplicación

En main.js, importa y usa el router:

import Vue from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';

Vue.config.productionTip = false;

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app');

  1. Estilización y Mejoras

Paso 1: Añadir Estilos Globales

Crea un archivo styles.css en la carpeta src y añade algunos estilos básicos:

body {
  font-family: Arial, sans-serif;
}

h1 {
  color: #42b983;
}

button {
  background-color: #42b983;
  color: white;
  border: none;
  padding: 5px 10px;
  cursor: pointer;
}

button:hover {
  background-color: #369f7d;
}

Importa este archivo en main.js:

import './styles.css';

Conclusión

En este proyecto, hemos creado una aplicación de lista de tareas utilizando Vue.js. Hemos cubierto la creación de componentes, la gestión del estado con Vuex, y la navegación con Vue Router. Este proyecto te proporciona una base sólida para construir aplicaciones más complejas con Vue.js.

Próximos Pasos:

  • Experimenta añadiendo nuevas funcionalidades, como la edición de tareas.
  • Implementa persistencia de datos utilizando Local Storage o una API backend.
  • Explora más sobre la optimización del rendimiento y pruebas en Vue.js.

¡Felicidades por completar tu primera aplicación Vue.js!

Curso de Vue.js

Módulo 1: Introducción a Vue.js

Módulo 2: Conceptos Básicos de Vue.js

Módulo 3: Componentes de Vue.js

Módulo 4: Vue Router

Módulo 5: Gestión de Estado con Vuex

Módulo 6: Directivas de Vue.js

Módulo 7: Plugins de Vue.js

Módulo 8: Pruebas en Vue.js

Módulo 9: Conceptos Avanzados de Vue.js

Módulo 10: Construcción y Despliegue de Aplicaciones Vue.js

Módulo 11: Proyectos Reales con Vue.js

© Copyright 2024. Todos los derechos reservados