Rumah >hujung hadapan web >tutorial js >Aplikasi Senarai Tugasan Mudah dalam Panduan Langkah demi Langkah Vue.js

Aplikasi Senarai Tugasan Mudah dalam Panduan Langkah demi Langkah Vue.js

王林
王林asal
2024-09-05 06:35:09568semak imbas

Simple To-Do List Application in Vue.js Step-by-Step Guide

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.

Langkah 2: Menstrukturkan Aplikasi

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>

Langkah 3: Memahami Kod

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.

Tambah Tugas
: Butang ini mencetuskan kaedah addTask apabila diklik.

    : Senarai tidak tertib ini menggunakan v-for untuk menggelungkan tatasusunan tugas dan menjadikan setiap tugasan. :key="index" ialah pengecam unik untuk setiap item, yang diperlukan oleh Vue untuk menjejaki item senarai dengan cekap.

    : 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.

    Delete : Butang untuk mengalih keluar tugas daripada senarai

    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>
    
    

    Pasang Font Hebat

    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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn