核心业务开发

业务开发的关键是把"需求"翻译成"数据与操作"。任务系统的核心操作是添加、删除、切换完成状态,外加统计完成数量。本节先用响应式数据把这几件事做出来,验证逻辑正确后再拆分组件。

任务的数据结构

每个任务包含三个字段:

// 任务对象
{ id: 1, title: '学习 Vue3', done: false }

id 用 Date.now() 生成可保证唯一;done 表示是否完成。

添加任务

用 ref 声明任务数组,push 新任务即可,注意先校验空输入:

import { ref } from 'vue'
const tasks = ref([])
const title = ref('')
function addTask() {
  const t = title.value.trim()
  if (!t) return                 // 空内容不添加
  tasks.value.push({ id: Date.now(), title: t, done: false })
  title.value = ''               // 清空输入框
}

删除任务

删除的本质是"从数组里过滤掉指定 id":

function removeTask(id) {
  tasks.value = tasks.value.filter(task => task.id !== id)
}

切换完成状态

找到对应任务后反转 done 字段:

function toggleTask(id) {
  const task = tasks.value.find(t => t.id === id)
  if (task) task.done = !task.done
}

用计算属性统计进度

"已完成数量"是派生数据,用 computed 计算并缓存:

import { computed } from 'vue'
const doneCount = computed(() =>
  tasks.value.filter(t => t.done).length
)

渲染模板

把数据与方法接到模板上:v-model 双向绑定输入框、v-for 循环渲染、v-bind 绑定复选框状态。

<template>
  <input v-model="title" @keyup.enter="addTask" placeholder="输入任务" />
  <button @click="addTask">添加</button>
  <ul>
    <li v-for="task in tasks" :key="task.id">
      <input type="checkbox" :checked="task.done"
             @change="toggleTask(task.id)" />
      <span :class="{ done: task.done }">{{ task.title }}</span>
      <button @click="removeTask(task.id)">删除</button>
    </li>
  </ul>
  <p>已完成 {{ doneCount }} / {{ tasks.length }} 项</p>
</template>

<style scoped>
.done { text-decoration: line-through; color: #999; } /* 已完成加删除线 */
</style>

效果:勾选后文字出现删除线、计数随之变化;点击删除按钮列表同步刷新。

小结

增删改查全部跑通,说明核心逻辑正确。但代码全堆在一个组件里不利于维护,下一节按职责拆分成多个组件。

笔记加载中…