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 的深入了解,你将能实现更加丰富和复杂的功能。

相关推荐
用户6688599847667 小时前
Vue 3.0安装与使用
vue.js
前端之虎陈随易10 小时前
2年没用Nodejs了,Bun很香
linux·前端·javascript·vue.js·typescript
前端 贾公子15 小时前
解决浏览器端 globalThis is not defined 报错
前端·javascript·vue.js
JianZhen✓16 小时前
2026前端高频面试题总结(Vue/JS/网络/Webpack/性能优化/手写)
前端·javascript·vue.js
贫民窟的勇敢爷们16 小时前
Spring Boot+Vue电商系统开发实战:架构设计与核心实现
vue.js·spring boot·后端
李白的天不白16 小时前
webpack 与 vue-loader 版本冲突问题
前端·vue.js·webpack
你真的快乐吗2 天前
@fuxishi/svg-icon:一个 Vue 3 svg本地图标+iconify图标组件库,让图标管理不再头疼
前端·vue.js·typescript
吴声子夜歌2 天前
Vue3——脚手架Vite
前端·javascript·vue.js·vite
rADu REME2 天前
SpringBoot + vue 管理系统
vue.js·spring boot·后端
被考核重击2 天前
Vue响应式原理(下)
前端·javascript·vue.js