Vue3 状态管理:Pinia 从入门到进阶全解析

目录

一、Pinia 是什么?

二、安装与初始化

三、创建一个 Store

四、在组件中使用 Store

五、进阶用法

1. 模块化管理多个 Store

2. Store 数据持久化

3. 热更新(HMR)

六、Pinia vs Vuex 对比

七、总结


在 Vue3 项目开发中,组件之间共享数据是一个很常见的问题。比如用户登录信息、购物车、主题设置,如果只依赖 props/emit,随着项目复杂度增加会变得十分混乱。

在 Vue2 时代,我们常用 Vuex 来解决这个问题。而在 Vue3 时代,Pinia 成为了更推荐的解决方案。


一、Pinia 是什么?

Pinia 是 Vue 官方团队推荐的 新一代状态管理工具,用来替代 Vuex。
它的优势非常明显:

  • 更简单:没有 Vuex 的繁琐写法,直接上手

  • 更轻量:体积小,性能好

  • TypeScript 友好:天然支持类型推导

  • 与 Vue3 完美契合:基于组合式 API 设计

一句话:Pinia = Vue3 的官方状态管理库


二、安装与初始化

安装 Pinia:

npm install pinia

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')

三、创建一个 Store

src/stores/user.ts 中定义一个用户 Store:

import { defineStore } from 'pinia'

// defineStore(唯一ID, 配置对象)
export const useUserStore = defineStore('user', {
  // state 类似于 data
  state: () => ({
    name: '张三',
    age: 18,
    token: ''
  }),

  // getters 类似于 computed
  getters: {
    isAdult: (state) => state.age >= 18
  },

  // actions 类似于 methods(可异步)
  actions: {
    setName(newName) {
      this.name = newName
    },
    async login(username, password) {
      return new Promise((resolve) => {
        setTimeout(() => {
          this.token = 'fake_token_123'
          resolve(true)
        }, 1000)
      })
    }
  }
})

四、在组件中使用 Store

App.vue 中使用:

<script setup>
import { useUserStore } from './stores/user'

const userStore = useUserStore()

function changeName() {
  userStore.setName('李四')
}
</script>

<template>
  <div>
    <h2>用户:{{ userStore.name }}</h2>
    <h3>年龄:{{ userStore.age }}</h3>
    <p>是否成年:{{ userStore.isAdult ? '是' : '否' }}</p>
    <button @click="changeName">修改名字</button>
    <button @click="userStore.login('admin', '123')">登录</button>
  </div>
</template>

五、进阶用法

1. 模块化管理多个 Store

在大型项目里,通常会有多个 Store。我们可以在 stores/ 文件夹下按功能拆分:

stores/
 ├── user.ts
 ├── cart.ts
 └── settings.ts

例如购物车 Store cart.ts

import { defineStore } from 'pinia'

export const useCartStore = defineStore('cart', {
  state: () => ({
    items: []
  }),
  getters: {
    totalPrice: (state) => state.items.reduce((sum, item) => sum + item.price, 0)
  },
  actions: {
    addItem(item) {
      this.items.push(item)
    }
  }
})

这样,在组件中只需要 useCartStore() 就能直接操作购物车数据。


2. Store 数据持久化

默认情况下,刷新页面后 Store 数据会丢失。
我们可以用 插件 实现持久化:

安装:

npm install pinia-plugin-persistedstate

main.ts 引入:

import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'

const pinia = createPinia()
pinia.use(piniaPluginPersistedstate)

user.ts 中开启持久化:

export const useUserStore = defineStore('user', {
  state: () => ({
    token: ''
  }),
  actions: {
    setToken(token) {
      this.token = token
    }
  },
  persist: true  // 开启持久化
})

这样 token 就会自动存储在 localStorage 中,刷新不会丢失。


3. 热更新(HMR)

Pinia 支持热更新,适合开发过程中调试。

user.ts 中加上:

if (import.meta.hot) {
  import.meta.hot.accept(acceptHMRUpdate(useUserStore, import.meta.hot))
}

这样修改 store 文件时,无需刷新页面即可应用更新。


六、Pinia vs Vuex 对比

对比点VuexPinia
学习成本
写法mutations + actions直接 actions
类型支持一般原生友好
体积偏大更轻量
Vue3 适配一般完美

七、总结

Pinia 的设计哲学就是:让状态管理变得简单自然

  • 对于小项目,Pinia 上手快,几乎没学习成本;

  • 对于大项目,Pinia 提供了模块化、插件、持久化等功能,完全够用;

  • 对于开发体验,它比 Vuex 更轻量,TS 支持更佳。

所以在 Vue3 项目中,推荐直接使用 Pinia,而不是 Vuex


<think>我们正在回答用户关于如何从零开始搭建Vue 3项目并逐步编写代码的问题。 根据引用,我们可以总结出以下步骤: 1. 配置环境(Node.js、npm或yarn、VSCode编辑器) 2. 使用Vite初始化Vue 3项目 3. 理解项目结构 4. 编写一个简单的组件(例如计数器) 5. (可选)添加路由 6. 构建和部署 注意:引用中提到了TypeScript,但用户没有特别要求,所以我们可以先使用JavaScript。如果需要TypeScript,可以在初始化项目时选择。 我们将按照以下步骤详细说明: 步骤1:环境准备 - 安装Node.js(建议使用LTS版本) - 安装VSCode(或其他编辑器) - 安装npm(通常随Node.js一起安装)或yarn(可选) 步骤2:创建项目 - 使用Vite脚手架快速创建Vue项目 步骤3:项目结构介绍 - 进入项目目录,安装依赖,然后启动开发服务器 步骤4:编写第一个组件(计数器示例) 步骤5:运行和测试 步骤6:构建生产环境 下面详细展开:</think>### 如何从零开始搭建 Vue 3 项目并逐步编写代码 以下是基于 Vite 构建工具的完整流程(JavaScript 版本),包含详细步骤和代码示例: #### 1. **环境准备** - 安装 [Node.js](https://nodejs.org/)(建议 LTS 版本 ≥18.x) - 安装代码编辑器(推荐 VS Code) - 验证安装: ```bash node -v # 查看 Node 版本 npm -v # 查看 npm 版本 ``` #### 2. **创建项目** ```bash npm create vite@latest my-vue-app -- --template vue cd my-vue-app npm install ``` #### 3. **项目结构解析** ``` ├── public/ # 静态资源 ├── src/ │ ├── assets/ # 图片等资源 │ ├── components/ # 组件目录 │ ├── App.vue # 根组件 │ └── main.js # 入口文件 ├── index.html # 主页面 └── vite.config.js # Vite 配置 ``` #### 4. **编写第一个组件** 在 `src/components` 创建 `Counter.vue`: ```vue <template> <div class="counter"> <h2>{{ title }}</h2> <button @click="count--">-</button> <span>{{ count }}</span> <button @click="count++">+</button> </div> </template> <script setup> import { ref } from &#39;vue&#39;; const count = ref(0); const title = "Vue 3 计数器"; </script> <style scoped> .counter { border: 1px solid #ddd; padding: 20px; margin: 10px; text-align: center; } button { margin: 0 10px; } </style> ``` #### 5. **集成组件到主应用** 修改 `src/App.vue`: ```vue <template> <div id="app"> <h1>Vue 3 入门项目</h1> <Counter /> </div> </template> <script setup> import Counter from &#39;./components/Counter.vue&#39; </script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; text-align: center; color: #2c3e50; margin-top: 60px; } </style> ``` #### 6. **运行与调试** ```bash npm run dev ``` 访问 `http://localhost:5173` 查看实时效果: ![](https://via.placeholder.com/600x200?text=Vue3+计数器示例) #### 7. **添加路由(可选)** ```bash npm install vue-router@4 ``` 创建 `src/router/index.js`: ```js import { createRouter, createWebHistory } from &#39;vue-router&#39; import Home from &#39;../views/Home.vue&#39; const routes = [ { path: &#39;/&#39;, component: Home }, { path: &#39;/counter&#39;, component: () => import(&#39;../components/Counter.vue&#39;) } ] const router = createRouter({ history: createWebHistory(), routes }) export default router ``` 在 `main.js` 中引入: ```js import { createApp } from &#39;vue&#39; import App from &#39;./App.vue&#39; import router from &#39;./router&#39; createApp(App).use(router).mount(&#39;#app&#39;) ``` #### 8. **构建生产版本** ```bash npm run build ``` 生成的文件位于 `dist/` 目录,可直接部署到服务器[^1][^2]。 ### 关键概念说明 1. **组合式 API**:使用 `setup()` 和 `ref`/`reactive` 管理状态 2. **单文件组件**:`.vue` 文件包含模板/逻辑/样式 3. **Vite 优势**:基于原生 ES 模块的极速热更新[^2] ### 进阶建议 - 添加 Pinia 状态管理:`npm install pinia` - 集成 ESLint + Prettier 保证代码规范 - 使用 `npm run preview` 本地预览生产环境构建
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值