Vue2 入门指南15:从零搭建一个简单的 Todo 应用

在本篇文章中,我们将一起从零开始构建一个简单的 Todo 应用。这将帮助你更好地理解 Vue 的基本概念和如何使用 Vue 来管理用户界面的交互和数据。

Todo 应用是前端开发中常见的入门项目,它可以帮助我们掌握 Vue 的核心特性,如数据绑定、事件处理、组件化开发等。


一、准备工作

首先,确保你已经安装了 Node.js 和 Vue CLI。如果你还没有安装,可以按照以下步骤进行安装:

  1. 下载并安装 Node.js

  2. 安装 Vue CLI:

    bash 复制代码
    npm install -g @vue/cli

安装完成后,我们可以使用 Vue CLI 创建一个新的项目:

bash 复制代码
vue create todo-app

在创建过程中,选择默认的配置选项,Vue CLI 会为你设置好所有的基础配置。创建完成后,进入项目文件夹并启动开发服务器:

bash 复制代码
cd todo-app
npm run serve

打开浏览器并访问 http://localhost:8080,你会看到 Vue 的默认欢迎页面。


二、构建 Todo 应用

接下来,我们将按照以下步骤逐步构建我们的 Todo 应用。

1. 设计应用结构

我们将构建一个简单的 Todo 应用,包含以下功能:

  • 输入框:用于输入新的 Todo 项。
  • Todo 列表:显示所有的 Todo 项。
  • 删除按钮:删除已完成的 Todo 项。
  • 标记已完成:点击 Todo 项来标记它为已完成。

在 Vue 中,我们将通过一个单一的组件来完成这些功能。我们会将整个应用的模板、逻辑和样式都写在一个文件中。

2. 修改 App.vue

首先,打开 src/App.vue 文件,并将它的内容替换为以下代码:

vue 复制代码
<template>
  <div id="app">
    <h1>Todo 应用</h1>
    <input v-model="newTodo" @keyup.enter="addTodo" placeholder="输入新的任务" />
    <ul>
      <li v-for="(todo, index) in todos" :key="index" :class="{ completed: todo.completed }">
        <span @click="toggleComplete(todo)">{{ todo.text }}</span>
        <button @click="removeTodo(index)">删除</button>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  name: 'App',
  data() {
    return {
      newTodo: '',
      todos: [
        { text: '学习 Vue.js', completed: false },
        { text: '做练习题', completed: false },
        { text: '查看项目文档', completed: false }
      ]
    };
  },
  methods: {
    addTodo() {
      if (this.newTodo.trim()) {
        this.todos.push({ text: this.newTodo.trim(), completed: false });
        this.newTodo = '';
      }
    },
    removeTodo(index) {
      this.todos.splice(index, 1);
    },
    toggleComplete(todo) {
      todo.completed = !todo.completed;
    }
  }
};
</script>

<style scoped>
#app {
  text-align: center;
}

input {
  padding: 10px;
  margin-bottom: 20px;
}

ul {
  list-style-type: none;
  padding: 0;
}

li {
  padding: 10px;
  margin: 5px 0;
  background-color: #f4f4f4;
  cursor: pointer;
}

li.completed {
  text-decoration: line-through;
  color: #aaa;
}

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

button:hover {
  background-color: darkred;
}
</style>

三、代码解析

1. 模板部分

vue 复制代码
<template>
  <div id="app">
    <h1>Todo 应用</h1>
    <input v-model="newTodo" @keyup.enter="addTodo" placeholder="输入新的任务" />
    <ul>
      <li v-for="(todo, index) in todos" :key="index" :class="{ completed: todo.completed }">
        <span @click="toggleComplete(todo)">{{ todo.text }}</span>
        <button @click="removeTodo(index)">删除</button>
      </li>
    </ul>
  </div>
</template>
  • v-model="newTodo":将输入框的值绑定到 newTodo 数据属性。
  • @keyup.enter="addTodo":当用户按下 Enter 键时,调用 addTodo 方法添加新的 Todo 项。
  • v-for="(todo, index) in todos":遍历 todos 数组,生成每个 Todo 项。
  • :class="{ completed: todo.completed }":当 Todo 项被标记为已完成时,应用 completed 类来为其添加删除线样式。
  • @click="toggleComplete(todo)":点击 Todo 项时切换其完成状态。
  • @click="removeTodo(index)":点击删除按钮时删除该 Todo 项。

2. 脚本部分

javascript 复制代码
<script>
export default {
  name: 'App',
  data() {
    return {
      newTodo: '',
      todos: [
        { text: '学习 Vue.js', completed: false },
        { text: '做练习题', completed: false },
        { text: '查看项目文档', completed: false }
      ]
    };
  },
  methods: {
    addTodo() {
      if (this.newTodo.trim()) {
        this.todos.push({ text: this.newTodo.trim(), completed: false });
        this.newTodo = '';
      }
    },
    removeTodo(index) {
      this.todos.splice(index, 1);
    },
    toggleComplete(todo) {
      todo.completed = !todo.completed;
    }
  }
};
</script>
  • newTodo 用于存储输入框的值,todos 用于存储所有的 Todo 项。
  • addTodo 方法用于添加新的 Todo 项。它会检查输入框是否为空,如果不为空,则将新的 Todo 项添加到 todos 数组中。
  • removeTodo 方法用于删除指定的 Todo 项。
  • toggleComplete 方法用于切换 Todo 项的完成状态。

3. 样式部分

css 复制代码
<style scoped>
#app {
  text-align: center;
}

input {
  padding: 10px;
  margin-bottom: 20px;
}

ul {
  list-style-type: none;
  padding: 0;
}

li {
  padding: 10px;
  margin: 5px 0;
  background-color: #f4f4f4;
  cursor: pointer;
}

li.completed {
  text-decoration: line-through;
  color: #aaa;
}

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

button:hover {
  background-color: darkred;
}
</style>
  • scoped 样式仅对当前组件生效,不会影响其他组件。
  • 我们为每个 Todo 项添加了背景颜色,并且已完成的 Todo 项会有删除线效果。

四、总结

通过本篇文章的学习,你应该已经能够从零开始搭建一个简单的 Todo 应用,并掌握了 Vue 的一些核心概念和技巧:

  • 使用 v-model 双向绑定输入框的值。
  • 使用 v-for 遍历数组并渲染列表。
  • 使用事件处理方法实现交互(添加、删除和标记完成)。
  • 使用 Vue 的响应式机制自动更新 UI。

这个简单的 Todo 应用是一个非常好的 Vue 入门项目,能够帮助你理解 Vue 的基本使用方式,并为更复杂的项目打下基础。随着你对 Vue 的深入了解,你将能实现更加丰富和复杂的功能。

相关推荐
Jazzing1 小时前
Vue 3 Diff 算法中的 newIndexToOldIndexMap 详解
vue.js
Jazzing1 小时前
Vue 3 Diff 算法中的 getSequence 源码解析
vue.js
miffycat1 小时前
Element UI ColorPicker 实时更新绑定值并转换 Hex 颜色的完整方案
vue.js
Three~stone3 小时前
Vue学习笔记集--scoped组件
vue.js·笔记·学习
zheshiyangyang3 小时前
Flask+Vue-Router+JWT实现登录验证
vue.js·python·flask
巴巴博一3 小时前
前端安全之DOMPurify基础使用
前端·vue.js·安全·typescript·html5
lee5764 小时前
用 Vue 3.5 TypeScript 重新开发3年前甘特图的核心组件
vue.js·typescript·甘特图
RR94 小时前
【Vue3 进阶👍】:如何批量导出子组件的属性和方法?从手动代理到Proxy的完整指南
前端·vue.js
华洛5 小时前
AI产品拆解,从需求到落地的全流程
前端·javascript·vue.js