Rumah > Artikel > hujung hadapan web > Aplikasi Senarai Tugasan Mudah dalam Panduan Langkah demi Langkah Vue.js
Panduan ini akan membimbing anda membina aplikasi Senarai Tugasan asas menggunakan Vue.js 3. Pada penghujung tutorial ini, anda akan memahami cara mengendalikan pengikatan data, acara pengendalian dan pemaparan dinamik dalam Vue.js.
Prasyarat
Pengetahuan asas HTML, CSS dan JavaScript.
Node.js dan npm dipasang pada komputer anda.
Vue CLI dipasang. Jika tidak, anda boleh memasangnya dengan menjalankan npm install -g @vue/cli.
Langkah 1: Menyediakan Projek
Buat Projek Vue.js Baharu: Buka terminal anda dan jalankan arahan berikut untuk mencipta projek Vue.js 3 baharu:
vue create todo-app
Navigasi ke dalam direktori projek:
cd todo-app
Jalankan Pelayan Pembangunan: Mulakan pelayan pembangunan Vue:
npm run serve
Ini akan membuka templat pemula Vue.js lalai dalam penyemak imbas anda di http://localhost:8080.
Bersihkan Templat Lalai: Buka src/App.vue dan alih keluar templat lalai, skrip dan kandungan gaya. Gantikannya dengan kod berikut:
<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>
Bahagian Templat:
: Medan input ini terikat pada sifat data newTask menggunakan model v, membolehkan pengikatan data dua hala. @keyup.enter="addTask" mendengar kekunci Enter untuk mencetuskan kaedah addTask.
: Butang ini mencetuskan kaedah addTask apabila diklik.
: Kotak pilihan yang menogol status selesai tugasan.
{{ task.text }} : Elemen span memaparkan teks tugasan. Arahan :class secara bersyarat menggunakan kelas CSS tugas selesai berdasarkan sama ada tugasan telah selesai.
Bahagian Skrip:
data() Kaedah:
newTask: Rentetan yang memegang nilai tugasan baharu yang akan ditambahkan.
tugasan: Tatasusunan yang menyimpan semua tugasan, masing-masing diwakili sebagai objek dengan teks dan sifat lengkap.
kaedah Objek:
addTask(): Kaedah ini menambahkan newTask pada tatasusunan tugas dan kemudian mengosongkan medan input newTask.
removeTask(index): Kaedah ini mengalih keluar tugasan daripada tatasusunan tugas berdasarkan indeksnya.
Bahagian Gaya:
CSS asas untuk menggayakan senarai tugasan, dengan kelas .completed-task untuk menyelesaikan tugasan yang telah selesai.
Tugas Berterusan dalam Storan Setempat: Anda boleh mempertingkatkan apl dengan menyimpan tugasan dalam storan setempat penyemak imbas, supaya tugasan itu berterusan merentasi muat semula halaman.
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)); } }
Tugas Mengedit:
<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>
Pertama, masukkan Font Awesome dalam projek anda. Jika anda menggunakan CDN, anda boleh menambah pautan ini dalam fail HTML anda atau terus dalam bahagian
index.html anda.
** Kemas kini Templat dengan Ikon
**
Sekarang, mari tambahkan beberapa ikon Font Hebat untuk mengedit, memadam dan menyelesaikan tugasan.
<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>
Atas ialah kandungan terperinci Aplikasi Senarai Tugasan Mudah dalam Panduan Langkah demi Langkah Vue.js. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!