Introducció
En aquest projecte, construirem una aplicació de llista de tasques utilitzant Vue.js. Aquest projecte ens permetrà aplicar els conceptes apresos en els mòduls anteriors i veure com es poden combinar per crear una aplicació funcional.
Objectius del Projecte
- Crear una aplicació Vue.js des de zero.
- Utilitzar components per estructurar l'aplicació.
- Implementar enllaç de dades i renderització condicional.
- Gestionar l'estat de l'aplicació amb Vuex.
- Utilitzar Vue Router per a la navegació.
Estructura del Projecte
- Configuració del projecte
- Creació de components
- Gestió de l'estat amb Vuex
- Navegació amb Vue Router
- Estilització de l'aplicació
- Desplegament
- Configuració del Projecte
Instal·lació de Vue CLI
Primer, assegura't de tenir instal·lat Vue CLI. Si no el tens, pots instal·lar-lo amb el següent comandament:
Creació del Projecte
Crea un nou projecte Vue utilitzant Vue CLI:
Segueix les instruccions per configurar el projecte segons les teves preferències.
Estructura del Projecte
Un cop creat el projecte, la seva estructura hauria de ser similar a aquesta:
todo-list-app/ ├── node_modules/ ├── public/ ├── src/ │ ├── assets/ │ ├── components/ │ ├── router/ │ ├── store/ │ ├── views/ │ ├── App.vue │ ├── main.js ├── .gitignore ├── babel.config.js ├── package.json ├── README.md └── vue.config.js
- Creació de Components
Component TodoItem
Crea un component per a cada tasca. A src/components/
, crea un fitxer anomenat TodoItem.vue
:
<template> <div class="todo-item"> <input type="checkbox" v-model="todo.completed" @change="toggleComplete"> <span :class="{ completed: todo.completed }">{{ todo.text }}</span> <button @click="removeTodo">Eliminar</button> </div> </template> <script> export default { props: { todo: Object }, methods: { toggleComplete() { this.$emit('toggle-complete', this.todo); }, removeTodo() { this.$emit('remove-todo', this.todo); } } } </script> <style scoped> .completed { text-decoration: line-through; } </style>
Component TodoList
Crea un component per a la llista de tasques. A src/components/
, crea un fitxer anomenat TodoList.vue
:
<template> <div class="todo-list"> <TodoItem v-for="todo in todos" :key="todo.id" :todo="todo" @toggle-complete="toggleComplete" @remove-todo="removeTodo" /> </div> </template> <script> import TodoItem from './TodoItem.vue'; export default { components: { TodoItem }, props: { todos: Array }, methods: { toggleComplete(todo) { this.$emit('toggle-complete', todo); }, removeTodo(todo) { this.$emit('remove-todo', todo); } } } </script>
Component AddTodo
Crea un component per afegir noves tasques. A src/components/
, crea un fitxer anomenat AddTodo.vue
:
<template> <div class="add-todo"> <input v-model="newTodo" @keyup.enter="addTodo" placeholder="Afegeix una nova tasca"> <button @click="addTodo">Afegeix</button> </div> </template> <script> export default { data() { return { newTodo: '' }; }, methods: { addTodo() { if (this.newTodo.trim()) { this.$emit('add-todo', this.newTodo); this.newTodo = ''; } } } } </script>
- Gestió de l'Estat amb Vuex
Instal·lació de Vuex
Instal·la Vuex al teu projecte:
Configuració de Vuex
A src/store/
, crea un fitxer anomenat index.js
:
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); export default new Vuex.Store({ state: { todos: [] }, mutations: { ADD_TODO (state, todo) { state.todos.push(todo); }, TOGGLE_COMPLETE (state, todo) { const index = state.todos.findIndex(t => t.id === todo.id); state.todos[index].completed = !state.todos[index].completed; }, REMOVE_TODO (state, todo) { state.todos = state.todos.filter(t => t.id !== todo.id); } }, actions: { addTodo ({ commit }, text) { const todo = { id: Date.now(), text, completed: false }; commit('ADD_TODO', todo); }, toggleComplete ({ commit }, todo) { commit('TOGGLE_COMPLETE', todo); }, removeTodo ({ commit }, todo) { commit('REMOVE_TODO', todo); } }, getters: { todos: state => state.todos } });
Integració de Vuex a l'Aplicació
A src/main.js
, importa i utilitza Vuex:
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');
- Navegació amb Vue Router
Instal·lació de Vue Router
Instal·la Vue Router al teu projecte:
Configuració de Vue Router
A src/router/
, crea un fitxer anomenat index.js
:
import Vue from 'vue'; import VueRouter from 'vue-router'; import Home from '../views/Home.vue'; Vue.use(VueRouter); const routes = [ { path: '/', name: 'Home', component: Home } ]; const router = new VueRouter({ mode: 'history', base: process.env.BASE_URL, routes }); export default router;
Integració de Vue Router a l'Aplicació
A src/main.js
, importa i utilitza Vue 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');
Creació de la Vista Home
A src/views/
, crea un fitxer anomenat Home.vue
:
<template> <div class="home"> <AddTodo @add-todo="addTodo" /> <TodoList :todos="todos" @toggle-complete="toggleComplete" @remove-todo="removeTodo" /> </div> </template> <script> import { mapGetters, mapActions } from 'vuex'; import AddTodo from '../components/AddTodo.vue'; import TodoList from '../components/TodoList.vue'; export default { components: { AddTodo, TodoList }, computed: { ...mapGetters(['todos']) }, methods: { ...mapActions(['addTodo', 'toggleComplete', 'removeTodo']) } } </script>
- Estilització de l'Aplicació
Afegeix estils a src/App.vue
per millorar l'aparença de l'aplicació:
<template> <div id="app"> <router-view /> </div> </template> <style> body { font-family: Arial, sans-serif; background-color: #f5f5f5; margin: 0; padding: 0; } #app { max-width: 600px; margin: 50px auto; padding: 20px; background-color: #fff; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); } .add-todo { display: flex; justify-content: space-between; margin-bottom: 20px; } .add-todo input { flex: 1; padding: 10px; font-size: 16px; } .add-todo button { padding: 10px 20px; font-size: 16px; margin-left: 10px; } .todo-item { display: flex; justify-content: space-between; align-items: center; padding: 10px; border-bottom: 1px solid #eee; } .todo-item .completed { text-decoration: line-through; color: #999; } .todo-item button { background: none; border: none; color: #ff0000; cursor: pointer; } </style>
- Desplegament
Construcció per a Producció
Construeix l'aplicació per a producció:
Desplegament
Segueix les instruccions de la teva plataforma de desplegament preferida per desplegar l'aplicació. Algunes opcions populars inclouen Netlify, Vercel, i GitHub Pages.
Conclusió
En aquest projecte, hem creat una aplicació de llista de tasques utilitzant Vue.js. Hem après a configurar un projecte Vue, crear components, gestionar l'estat amb Vuex, utilitzar Vue Router per a la navegació, estilitzar l'aplicació i desplegar-la. Aquest projecte ens ha permès aplicar els conceptes apresos en els mòduls anteriors i veure com es poden combinar per crear una aplicació funcional.
Curs de Vue.js
Mòdul 1: Introducció a Vue.js
- Què és Vue.js?
- Configuració de l'entorn de desenvolupament
- Creant la teva primera aplicació Vue
- Entenent la instància de Vue
Mòdul 2: Conceptes bàsics de Vue.js
- Sintaxi de plantilles
- Enllaç de dades
- Propietats computades i observadors
- Enllaços de classes i estils
- Renderització condicional
- Renderització de llistes
Mòdul 3: Components de Vue.js
- Introducció als components
- Props i esdeveniments personalitzats
- Slots
- Components dinàmics i asíncrons
- Comunicació entre components
Mòdul 4: Vue Router
- Introducció a Vue Router
- Configuració de Vue Router
- Rutes dinàmiques
- Rutes niades
- Guàrdies de navegació
Mòdul 5: Gestió d'estat amb Vuex
- Introducció a Vuex
- Estat, getters, mutacions i accions
- Mòduls a Vuex
- Utilitzant Vuex en components
- Patrons avançats de Vuex
Mòdul 6: Directives de Vue.js
Mòdul 7: Plugins de Vue.js
Mòdul 8: Proves en Vue.js
Mòdul 9: Conceptes avançats de Vue.js
- Funcions de renderització i JSX
- Renderització del costat del servidor (SSR) amb Nuxt.js
- API de composició de Vue 3
- Optimització del rendiment