Vue.js Composition API实现TodoMVC应用解析

Vue.js Composition API实现TodoMVC应用解析

vue vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。 vue 项目地址: https://gitcode.com/gh_mirrors/vu/vue

前言

TodoMVC是一个经典的待办事项应用实现,被广泛用于前端框架的教学和比较。本文将通过分析Vue.js官方示例中的composition/todomvc.html文件,深入探讨如何使用Vue 3的Composition API构建一个功能完整的Todo应用。

项目结构与基础配置

示例中首先引入了Vue的核心库和TodoMVC的标准CSS样式:

<script src="../../dist/vue.min.js"></script>
<link rel="stylesheet" href="../../node_modules/todomvc-app-css/index.css" />

这种配置方式确保了应用具有统一的外观和行为,符合TodoMVC项目的规范要求。

响应式状态管理

核心的状态管理使用了Vue 3的Composition API:

const { reactive, computed, watchEffect, onMounted, onUnmounted } = Vue

状态初始化

应用状态通过reactive函数创建响应式对象:

const state = reactive({
  todos: todoStorage.fetch(),
  editedTodo: null,
  newTodo: '',
  beforeEditCache: '',
  visibility: 'all',
  // 计算属性...
})

计算属性

示例中展示了多种计算属性的使用方式:

  1. 剩余待办项数量:
remaining: computed(() => {
  return filters.active(state.todos).length
})
  1. 复数形式文本:
remainingText: computed(() => {
  return ` ${pluralize(state.remaining)} left`
})
  1. 过滤后的待办项:
filteredTodos: computed(() => {
  return filters[state.visibility](state.todos)
})
  1. 全选/全不选功能:
allDone: computed({
  get: function () {
    return state.remaining === 0
  },
  set: function (value) {
    state.todos.forEach(todo => {
      todo.completed = value
    })
  }
})

数据持久化

应用实现了本地存储功能,确保数据在页面刷新后不丢失:

const STORAGE_KEY = 'todos-vuejs-3.x-composition'
const todoStorage = {
  fetch() {
    const todos = JSON.parse(localStorage.getItem(STORAGE_KEY) || '[]')
    todos.forEach((todo, index) => {
      todo.id = index
    })
    todoStorage.uid = todos.length
    return todos
  },
  save(todos) {
    localStorage.setItem(STORAGE_KEY, JSON.stringify(todos))
  }
}

通过watchEffect自动监听状态变化并保存:

watchEffect(() => {
  todoStorage.save(state.todos)
})

核心功能实现

添加待办项

function addTodo() {
  const value = state.newTodo && state.newTodo.trim()
  if (!value) return
  state.todos.push({
    id: todoStorage.uid++,
    title: value,
    completed: false
  })
  state.newTodo = ''
}

编辑功能

实现了双击编辑、回车确认、ESC取消等完整编辑流程:

function editTodo(todo) {
  state.beforeEditCache = todo.title
  state.editedTodo = todo
}

function doneEdit(todo) {
  if (!state.editedTodo) return
  state.editedTodo = null
  todo.title = todo.title.trim()
  if (!todo.title) removeTodo(todo)
}

function cancelEdit(todo) {
  state.editedTodo = null
  todo.title = state.beforeEditCache
}

路由过滤

通过监听hash变化实现不同状态待办项的过滤:

function onHashChange() {
  const visibility = window.location.hash.replace(/#\/?/, '')
  if (filters[visibility]) {
    state.visibility = visibility
  } else {
    window.location.hash = ''
    state.visibility = 'all'
  }
}

自定义指令

实现了一个自动聚焦的自定义指令:

directives: {
  'todo-focus': (el, { value }) => {
    if (value) {
      el.focus()
    }
  }
}

生命周期管理

使用Composition API的生命周期钩子:

onMounted(() => {
  window.addEventListener('hashchange', onHashChange)
  onHashChange()
})

onUnmounted(() => {
  window.removeEventListener('hashchange', onHashChange)
})

总结

这个TodoMVC示例展示了Vue 3 Composition API的核心特性:

  1. 使用reactive创建响应式状态
  2. 通过computed创建派生状态
  3. 利用watchEffect实现副作用
  4. 生命周期钩子的使用
  5. 自定义指令的应用

相比Options API,Composition API提供了更灵活的逻辑组织和复用方式,特别适合复杂组件的开发。通过这个示例,开发者可以学习到如何将传统Vue应用迁移到Composition API,以及如何利用其特性构建更健壮的应用程序。

vue vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。 vue 项目地址: https://gitcode.com/gh_mirrors/vu/vue

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

祁婉菲Flora

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值