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

admin8个月前 (03-19)it知识624

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

1. 创建项目

bashnpm create vue@latest# 选择 TypeScript 和 Pinia 选项cd your-projectnpm installnpm 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 } = storeconst 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知识

相关文章

优美程序是怎样的

程序优美是一个主观的概念,每个人可能会有不同的看法。然而,以下是一些可能导致程序优美的因素:简洁性:优美的程序应该尽可能地简洁明了。这意味着应该使用尽可能少的数据结构和算法,以及尽可能简单的代码。可读...

个人学习计划

学习计划是一个帮助你提高学习效率和使用时间的有效工具。以下是一个可能的学习计划:目标设定。 在开始学习之前,明确你的学习目标和目的地,这有助于你制定实际可行的计划。分解任务。 将大...

炎热的夏天

夏天是一个充满活力和热情的季节,炎热的的气息让人感到无力和疲惫。但是,这个季节也有着许多美好的回忆和乐趣,让我们一起来看看夏天的美好与炎热吧。首先,夏天的天气非常炎热,太阳高照,蓝天白云,气温高达30...

敏捷开发

敏捷开发是一种以人为核心、迭代、循序渐进的开发方法。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。换言之,就是把一个大项目分为多个相互联系,但也可...

如何学习 javascript

学习JavaScript需要以下步骤:基础语法:学习JavaScript的基础语法,包括变量、数据类型、函数、循环、条件语句等。DOM 操作:学习如何操作 DOM,例如获取和修改元素、添加和删除事件处...

如何写文章

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

发表评论

访客

看不清,换一张

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