Diese Anleitung führt Sie durch die Erstellung einer einfachen To-Do-List-Anwendung mit Vue.js 3. Am Ende dieses Tutorials werden Sie verstehen, wie Sie mit Datenbindung und Ereignissen umgehen Handhabung und dynamisches Rendering in Vue.js.
Voraussetzungen
Grundkenntnisse in HTML, CSS und JavaScript.
Node.js und npm auf Ihrem Computer installiert.
Vue CLI installiert. Wenn nicht, können Sie es installieren, indem Sie npm install -g @vue/cli.
Schritt 1: Einrichten des Projekts
Erstellen Sie ein neues Vue.js-Projekt: Öffnen Sie Ihr Terminal und führen Sie den folgenden Befehl aus, um ein neues Vue.js 3-Projekt zu erstellen:
vue create todo-app
Navigieren Sie in das Projektverzeichnis:
cd todo-app
Führen Sie den Entwicklungsserver aus: Starten Sie den Vue-Entwicklungsserver:
npm run serve
Dadurch wird die Standard-Startvorlage von Vue.js in Ihrem Browser unter http://localhost:8080 geöffnet.
Bereinigen Sie die Standardvorlage: Öffnen Sie src/App.vue und entfernen Sie die Inhalte der Standardvorlage, des Skripts und des Stils. Ersetzen Sie sie durch den folgenden Code:
<template> <div id="app"> <h1>Vue.js To-Do List</h1> <input v-model="newTask" placeholder="Add a new task" @keyup.enter="addTask" /> <button @click="addTask">Add Task</button> <ul> <li v-for="(task, index) in tasks" :key="index"> <input type="checkbox" v-model="task.completed" /> <span :class="{ 'completed-task': task.completed }">{{ task.text }}</span> <button @click="removeTask(index)">Delete</button> </li> </ul> </div> </template> <script> export default { name: 'App', data() { return { newTask: '', tasks: [] }; }, methods: { addTask() { if (this.newTask.trim() !== '') { this.tasks.push({ text: this.newTask, completed: false }); this.newTask = ''; } }, removeTask(index) { this.tasks.splice(index, 1); } } }; </script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; text-align: center; color: #2c3e50; margin-top: 60px; } .completed-task { text-decoration: line-through; color: grey; } input { margin-bottom: 10px; padding: 5px; } button { margin-left: 5px; padding: 5px; } ul { list-style-type: none; padding: 0; } li { display: flex; align-items: center; justify-content: center; margin: 5px 0; } </style>
Vorlagenabschnitt:
: Dieses Eingabefeld ist mithilfe des V-Modells an die Dateneigenschaft newTask gebunden, wodurch eine bidirektionale Datenbindung ermöglicht wird. Der @keyup.enter="addTask" wartet auf die Eingabetaste, um die addTask-Methode auszulösen.
: Diese Schaltfläche löst beim Klicken die addTask-Methode aus.
: Ein Kontrollkästchen, das den abgeschlossenen Status einer Aufgabe umschaltet.
{{ task.text }} : Das span-Element zeigt den Aufgabentext an. Die :class-Direktive wendet die CSS-Klasse „abgeschlossene Aufgabe“ bedingt an, je nachdem, ob die Aufgabe abgeschlossen ist.
: Eine Schaltfläche zum Entfernen der Aufgabe aus der Liste
Skriptabschnitt:
data() Methode:
newTask: Eine Zeichenfolge, die den Wert der neuen hinzuzufügenden Aufgabe enthält.
Aufgaben: Ein Array, das alle Aufgaben enthält, die jeweils als Objekt mit Text und abgeschlossenen Eigenschaften dargestellt werden.
Methodenobjekt:
addTask(): Diese Methode fügt die newTask zum Aufgabenarray hinzu und löscht dann das Eingabefeld newTask.
removeTask(index): Diese Methode entfernt eine Aufgabe basierend auf ihrem Index aus dem Aufgabenarray.
Stilabschnitt:
Grundlegendes CSS zum Gestalten der To-Do-Liste, mit einer .completed-task-Klasse zum Durchsuchen abgeschlossener Aufgaben.
Aufgaben im lokalen Speicher beibehalten: Sie können die App verbessern, indem Sie Aufgaben im lokalen Speicher des Browsers speichern, sodass sie auch nach dem erneuten Laden der Seite bestehen bleiben.
mounted() { this.tasks = JSON.parse(localStorage.getItem('tasks')) || []; }, methods: { addTask() { if (this.newTask.trim() !== '') { this.tasks.push({ text: this.newTask, completed: false }); this.newTask = ''; localStorage.setItem('tasks', JSON.stringify(this.tasks)); } }, removeTask(index) { this.tasks.splice(index, 1); localStorage.setItem('tasks', JSON.stringify(this.tasks)); } }
Aufgaben bearbeiten:
<template> <div id="app"> <h1>Vue.js To-Do List</h1> <input v-model="newTask" placeholder="Add a new task" @keyup.enter="addTask" /> <button @click="addTask">Add Task</button> <ul> <li v-for="(task, index) in tasks" :key="index"> <input type="checkbox" v-model="task.completed" /> <span v-if="!task.isEditing" :class="{ 'completed-task': task.completed }">{{ task.text }}</span> <input v-else v-model="task.text" @keyup.enter="saveTask(task)" @blur="saveTask(task)" /> <button v-if="!task.isEditing" @click="editTask(task)">Edit</button> <button @click="removeTask(index)">Delete</button> </li> </ul> </div> </template> <script> export default { name: 'App', data() { return { newTask: '', tasks: [] }; }, methods: { addTask() { if (this.newTask.trim() !== '') { this.tasks.push({ text: this.newTask, completed: false, isEditing: false }); this.newTask = ''; } }, removeTask(index) { this.tasks.splice(index, 1); }, editTask(task) { task.isEditing = true; }, saveTask(task) { task.isEditing = false; } } }; </script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; text-align: center; color: #2c3e50; margin-top: 60px; } .completed-task { text-decoration: line-through; color: grey; } input { margin-bottom: 10px; padding: 5px; } button { margin-left: 5px; padding: 5px; } ul { list-style-type: none; padding: 0; } li { display: flex; align-items: center; justify-content: center; margin: 5px 0; } </style>
Beziehen Sie zunächst Font Awesome in Ihr Projekt ein. Wenn Sie ein CDN verwenden, können Sie diesen Link in Ihre HTML-Datei oder direkt im Abschnitt
Ihrer index.html einfügen.
** Aktualisieren Sie die Vorlage mit Symbolen
**
Jetzt fügen wir einige Font Awesome-Symbole zum Bearbeiten, Löschen und Erledigen von Aufgaben hinzu.
<template> <div id="app" class="container"> <h1>Vue.js To-Do List</h1> <div class="input-container"> <input v-model="newTask" placeholder="Add a new task" @keyup.enter="addTask" /> <button @click="addTask" class="btn btn-add"><i class="fas fa-plus"></i></button> </div> <ul> <li v-for="(task, index) in tasks" :key="index" :class="{ completed: task.completed }"> <input type="checkbox" v-model="task.completed" id="checkbox" /> <span v-if="!task.isEditing" class="task-text">{{ task.text }}</span> <input v-else v-model="task.text" @keyup.enter="saveTask(task)" @blur="saveTask(task)" class="edit-input" /> <div class="actions"> <button v-if="!task.isEditing" @click="editTask(task)" class="btn btn-edit"><i class="fas fa-edit"></i></button> <button @click="removeTask(index)" class="btn btn-delete"><i class="fas fa-trash-alt"></i></button> </div> </li> </ul> </div> </template> <script> export default { name: 'App', data() { return { newTask: '', tasks: [] }; }, methods: { addTask() { if (this.newTask.trim() !== '') { this.tasks.push({ text: this.newTask, completed: false, isEditing: false }); this.newTask = ''; } }, removeTask(index) { this.tasks.splice(index, 1); }, editTask(task) { task.isEditing = true; }, saveTask(task) { task.isEditing = false; } } }; </script> <style> body { background-color: #f4f7f6; font-family: 'Roboto', sans-serif; margin: 0; padding: 0; display: flex; justify-content: center; align-items: center; height: 100vh; } .container { background-color: #ffffff; border-radius: 10px; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2); padding: 20px; max-width: 400px; width: 100%; } h1 { color: #333; margin-bottom: 20px; } .input-container { display: flex; margin-bottom: 20px; } input { flex: 1; padding: 10px; border: 1px solid #ccc; border-radius: 5px; font-size: 16px; } .btn { background-color: #4caf50; color: white; border: none; padding: 10px; border-radius: 5px; cursor: pointer; margin-left: 5px; transition: background-color 0.3s; } .btn:hover { background-color: #45a049; } .btn-add { background-color: #28a745; } .btn-edit { background-color: #ffc107; } .btn-delete { background-color: #dc3545; } ul { list-style-type: none; padding: 0; } li { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; padding: 10px; border-radius: 5px; background-color: #f8f9fa; } li.completed .task-text { text-decoration: line-through; color: #888; } li:hover { background-color: #e9ecef; } .actions { display: flex; } .actions .btn { margin-left: 5px; } .edit-input { flex: 1; margin-right: 10px; } </style>
Das obige ist der detaillierte Inhalt vonEinfache To-Do-Listen-Anwendung in Vue.js Schritt-für-Schritt-Anleitung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!