使用 Vue 3 + TypeScript + Pinia 的简单项目

admin4个月前 (03-19)it知识390

以下是一个使用 Vue 3 + TypeScript + Pinia 的简单项目示例,我们将创建一个待办事项(Todo List)应用:

1. 创建项目

bash
npm create vue@latest
# 选择 TypeScript 和 Pinia 选项cd your-project
npm install
npm install pinia @pinia/nuxt

2. 项目结构

/src

  /stores

    todoStore.ts

  /components

    TodoList.vue

  App.vue

  main.ts

3. 创建 Pinia Store (/stores/todoStore.ts)

import { defineStore } from 'pinia'
export interface Todo {
  id: number
  text: string
  done: boolean
}
export const useTodoStore = defineStore('todo', {
  state: () => ({
    todos: [] as Todo[],
    filter: 'all' as 'all' | 'done' | 'undone'
  }),
  actions: {
    addTodo(text: string) {
      this.todos.push({
        id: Date.now(),
        text,
        done: false
      })
    },
    toggleTodo(id: number) {
      const todo = this.todos.find(t => t.id === id)
      if (todo) {
        todo.done = !todo.done
      }
    },
    deleteTodo(id: number) {
      this.todos = this.todos.filter(t => t.id !== id)
    }
  },
  getters: {
    filteredTodos(): Todo[] {
      switch (this.filter) {
        case 'done':
          return this.todos.filter(t => t.done)
        case 'undone':
          return this.todos.filter(t => !t.done)
        default:
          return this.todos
      }
    }
  }
})


4. 主组件 (App.vue)

<script setup>
import TodoList from './components/TodoList.vue'
</script>
<template>
  <div>
    <h1>Todo List</h1>
    <TodoList />
  </div>
</template>
<style>
.container {
  max-width: 600px;
  margin: 0 auto;
  padding: 20px;
}
</style>

5. TodoList 组件 (/components/TodoList.vue)

<script setup>
import { ref } from 'vue'
import { useTodoStore } from '../stores/todoStore'
import { storeToRefs } from 'pinia'
const store = useTodoStore()
const { filteredTodos: todos, filter } = storeToRefs(store)
const { addTodo, toggleTodo, deleteTodo } = store
const newTodo = ref('')
const handleAdd = () => {
  if (newTodo.value.trim()) {
    addTodo(newTodo.value.trim())
    newTodo.value = ''
  }
}
</script>
<template>
  <div>
    <div>
      <input
        v-model="newTodo"
        @keyup.enter="handleAdd"
        placeholder="Add new todo..."
      />
      <button @click="handleAdd">Add</button>
    </div>
    <div>
      <button
        :class="{ active: filter === 'all' }"
        @click="filter = 'all'"
      >
        All
      </button>
      <button
        :class="{ active: filter === 'done' }"
        @click="filter = 'done'"
      >
        Done
      </button>
      <button
        :class="{ active: filter === 'undone' }"
        @click="filter = 'undone'"
      >
        Undone
      </button>
    </div>
    <ul>
      <li v-for="todo in todos" :key="todo.id">
        <input
          type="checkbox"
          :checked="todo.done"
          @change="toggleTodo(todo.id)"
        />
        <span :class="{ done: todo.done }">{{ todo.text }}</span>
        <button @click="deleteTodo(todo.id)">×</button>
      </li>
    </ul>
  </div>
</template>
<style scoped>
.todo-item {
  display: flex;
  align-items: center;
  padding: 8px;
  margin: 5px 0;
  border: 1px solid #ddd;
  border-radius: 4px;
}
.done {
  text-decoration: line-through;
  color: #888;
}
.input-group {
  margin-bottom: 20px;
  display: flex;
  gap: 10px;
}
input {
  flex: 1;
  padding: 8px;
}
button {
  padding: 8px 16px;
  cursor: pointer;
}
.filters {
  margin-bottom: 15px;
  display: flex;
  gap: 10px;
}
button.active {
  background-color: #646cff;
  color: white;
}
.delete-btn {
  margin-left: auto;
  padding: 0 8px;
  background: none;
  border: none;
  font-size: 1.2em;
  color: #ff4444;
}
</style>

6. 修改 main.ts

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
const app = createApp(App)
const pinia = createPinia()
app.use(pinia)
app.mount('#app')

7. 运行项目

npm run dev

主要功能说明:

  1. 使用 Pinia 进行状态管理

  2. 支持添加/删除待办事项

  3. 切换任务完成状态

  4. 过滤显示不同状态的任务

  5. 使用 TypeScript 进行类型检查

  6. 响应式状态管理

  7. 使用 Composition API

这个示例展示了 Vue 3 的组合式 API 与 Pinia 的结合使用,通过 TypeScript 的类型系统增强了代码的可维护性。Pinia 的状态管理逻辑集中在 store 中,组件主要负责 UI 交互和状态展示。


标签: 分享IT知识

相关文章

享受工作:找到事业与生活的平衡点

工作是我们日常生活中不可或缺的一部分。我们花费大量的时间和精力在工作中,因此,如何享受工作并找到事业与生活的平衡点就显得尤为重要。在这篇文章中,我们将探讨如何享受工作,让事业和生活愉快并行。首先,了解...

湖边

湖边,一片静谧的美好。清晨的阳光洒在湖面上,波光粼粼,让人心旷神怡。湖上的荷叶轻轻摇曳,荷花争奇斗艳,仿佛在向人们展示着它们的美丽。湖边的柳树依依,芦苇丛生,形成了一道道天然的屏障,让人感到一种隐秘的...

如何写文章

过程,需要一定的技巧和准备。以下是一些写文章的步骤和技巧:确定文章的主题和目的:在开始写作之前,您需要明确文章的主题和目的。这有助于您确定文章的重点和方向。研究和收集信息:在开始写作之前,进行一些研究...

双因素理论

双因素理论是美国心理学家弗雷德里克·赫兹伯格(Frederick·Herzberg)于20世纪50年代后期提出的,这一理论的研究重点是组织中的人与工作的关系问题。双因素理论包括保健因素和激励因素。保健...

故事分解结构

故事分解结构是一种用于分析、设计和编写故事的方法,它可以将故事分解为不同的层次,从而更好地理解故事的内在逻辑和结构。下面是故事分解结构的详细解释:节拍(beat):是故事的最小单位,包含动作和反应两个...

暴风雨

暴风雨来临之前,天空中弥漫着一股压抑的气息。乌云密布,仿佛覆盖着一片灰暗的帷幕,将整个天地都笼罩在一片阴沉的氛围中。狂风大作,吹拂着路上的尘土和枝叶,让人感到一阵阵的凉意。突然,一声炸雷打破了寂静,紧...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。