编程 Vue3的CompositionAPI和setup语法糖构建一个简单的待办事项应用

2024-11-17 04:21:34 +0800 CST views 874

在Vue 3中实现一个简单待办事项应用

在现代前端开发过程中,待办事项应用通常是新手学习框架的第一个项目。在这篇博客中,我们将使用Vue 3的Composition API和setup语法糖,手把手地引导您构建一个简单的待办事项应用。通过这个应用,您将了解Vue 3的一些基本概念以及如何使用setup函数。

项目结构

首先,我们需要创建一个基本的项目结构。在项目的根目录下,我们可以将文件组织如下:

todo-app/
│
├── src/
│   ├── components/
│   │   ├── TodoList.vue
│   │   ├── TodoInput.vue
│   ├── App.vue
│   └── main.js
├── index.html
└── package.json

接下来,我们将逐步实现每个组件。

第一步:初始化Vue项目

首先,我们来创建一个新的Vue 3项目。您可以使用Vue CLI来创建项目。在终端中输入以下命令:

npm install -g @vue/cli
vue create todo-app

在创建过程中,选择Vue 3并根据您的需求选择其他配置。创建完毕后,进入项目目录 cd todo-app

第二步:构建主应用组件

src 文件夹中找到 App.vue,这里是我们的主应用组件。我们将使用它来渲染待办事项列表和输入框。

<template>
  <div id="app">
    <h1>我的待办事项应用</h1>
    <TodoInput @addTodo="addTodo" />
    <TodoList :todos="todos" @removeTodo="removeTodo" />
  </div>
</template>

<script>
import { ref } from 'vue';
import TodoInput from './components/TodoInput.vue';
import TodoList from './components/TodoList.vue';

export default {
  name: 'App',
  components: {
    TodoInput,
    TodoList
  },
  setup() {
    const todos = ref([]);
    
    // 添加待办事项
    const addTodo = (todo) => {
      todos.value.push({ text: todo, completed: false });
    };
    
    // 删除待办事项
    const removeTodo = (index) => {
      todos.value.splice(index, 1);
    };

    return {
      todos,
      addTodo,
      removeTodo
    };
  }
};
</script>

<style>
#app {
  max-width: 600px;
  margin: 0 auto;
  text-align: center;
}
</style>

在上面的代码中,我们使用 setup() 函数来定义应用的响应式数据和方法。我们使用了Vue 3的 ref 函数来创建一个响应式的待办事项数组 todos,并定义了 addTodoremoveTodo 方法来添加和删除待办事项。

第三步:创建输入组件

接下来,我们需要创建一个输入组件 TodoInput.vue,用于输入新的待办事项。

<template>
  <div>
    <input v-model="newTodo" placeholder="输入待办事项" @keyup.enter="submitTodo" />
    <button @click="submitTodo">添加</button>
  </div>
</template>

<script>
import { ref } from 'vue';

export default {
  name: 'TodoInput',
  emits: ['addTodo'],
  setup(_, { emit }) {
    const newTodo = ref('');

    const submitTodo = () => {
      if (newTodo.value.trim()) {
        emit('addTodo', newTodo.value.trim());
        newTodo.value = '';
      }
    };

    return {
      newTodo,
      submitTodo
    };
  }
};
</script>

<style>
input {
  padding: 10px;
  width: 70%;
  margin-right: 10px;
}
button {
  padding: 10px;
}
</style>

TodoInput 组件中,我们使用 v-model 指令来实现双向绑定,使输入框的值与 newTodo 响应式变量关联。当用户按下回车键或点击“添加”按钮时,调用 submitTodo 方法并通过 $emit 发出 addTodo 事件。

第四步:创建待办事项列表组件

接下来创建 TodoList.vue 组件,它用于显示待办事项列表。

<template>
  <ul>
    <li v-for="(todo, index) in todos" :key="index">
      <span :class="{ completed: todo.completed }">{{ todo.text }}</span>
      <button @click="removeTodo(index)">删除</button>
      <input type="checkbox" v-model="todo.completed" />
    </li>
  </ul>
</template>

<script>
export default {
  name: 'TodoList',
  props: {
    todos: {
      type: Array,
      required: true
    }
  },
  emits: ['removeTodo'],
  setup(props, { emit }) {
    const removeTodo = (index) => {
      emit('removeTodo', index);
    };

    return {
      removeTodo
    };
  }
};
</script>

<style>
.completed {
  text-decoration: line-through;
  color: gray;
}
ul {
  list-style-type: none;
  padding: 0;
}
li {
  display: flex;
  justify-content: space-between;
  align-items: center;
}
</style>

TodoList 组件中,我们通过 v-for 指令遍历传入的 todos 属性,并为每个待办事项渲染一个列表项。每个待办事项旁边有一个删除按钮和一个复选框,用于标记待办事项是否完成。

第五步:整合与测试

到此,所有的组件都已经准备好了,我们只需返回到 index.html,确保我们的Vue应用能够正常运行。在终端中启动开发服务器:

npm run serve

如果一切正常,您将在浏览器中看到 “我的待办事项应用” 的标题以及输入框和待办事项列表。您可以添加待办事项,并通过复选框标记它们是否完成。在待办事项旁边还可以点击删除按钮来移除它们。

总结

在这篇教程中,我们使用Vue 3和setup语法糖实现了一个简单的待办事项应用。在这个过程中,我们学习了如何创建组件、使用Composition API的 setup 函数来管理状态,以及如何通过事件机制在组件之间进行通信。

通过这个项目,您可以奠定对Vue 3开发的基本理解,未来可以扩展更多功能,例如持久化存储、编辑待办事项等。

复制全文 生成海报 前端开发 Vue JavaScript 应用开发 教程

推荐文章

JavaScript设计模式:单例模式
2024-11-18 10:57:41 +0800 CST
智慧加水系统
2024-11-19 06:33:36 +0800 CST
Vue3中如何实现状态管理?
2024-11-19 09:40:30 +0800 CST
使用xshell上传和下载文件
2024-11-18 12:55:11 +0800 CST
Vue3中如何处理组件的单元测试?
2024-11-18 15:00:45 +0800 CST
小技巧vscode去除空格方法
2024-11-17 05:00:30 +0800 CST
# 解决 MySQL 经常断开重连的问题
2024-11-19 04:50:20 +0800 CST
Vue3中的v-slot指令有什么改变?
2024-11-18 07:32:50 +0800 CST
在Rust项目中使用SQLite数据库
2024-11-19 08:48:00 +0800 CST
Go 开发中的热加载指南
2024-11-18 23:01:27 +0800 CST
JavaScript设计模式:桥接模式
2024-11-18 19:03:40 +0800 CST
java MySQL如何获取唯一订单编号?
2024-11-18 18:51:44 +0800 CST
如何在 Vue 3 中使用 TypeScript?
2024-11-18 22:30:18 +0800 CST
120个实用CSS技巧汇总合集
2025-06-23 13:19:55 +0800 CST
2024年微信小程序开发价格概览
2024-11-19 06:40:52 +0800 CST
Elasticsearch 条件查询
2024-11-19 06:50:24 +0800 CST
Golang Sync.Once 使用与原理
2024-11-17 03:53:42 +0800 CST
mysql删除重复数据
2024-11-19 03:19:52 +0800 CST
乐观锁和悲观锁,如何区分?
2024-11-19 09:36:53 +0800 CST
Linux 常用进程命令介绍
2024-11-19 05:06:44 +0800 CST
#免密码登录服务器
2024-11-19 04:29:52 +0800 CST
Node.js中接入微信支付
2024-11-19 06:28:31 +0800 CST
Vue3中如何处理异步操作?
2024-11-19 04:06:07 +0800 CST
程序员茄子在线接单