vue3中状态管理 pinia的基本使用

vue3中的pinia就相当于vue2中的vuex,讲pinia之前,先回顾一下它们的区别!

vuex:集中式状态管理容器,可以实现任意组件之间通信!
核心概念: state、mutations、actions、getters、modules
pinia:集中式状态管理容器,可以实现任意组件之间通信!
核心概念: state、actions、getters
如何使用pinia:

  1. 安装pinia

npm i pinia

  1. src 目录下新建store/index.ts文件,引入pinia
//创建大仓库
import { createPinia } from 'pinia';
const store = createPinia();
export default store;
  1. 在入口文件main.ts中引入仓库
import { createApp } form 'vue';
import ElementPlus from 'element-plus';
import 'element-plus/dist/index.css';
import App from './App.vue';
import store from './store';
import router from './router';
const app = createApp(App)
app.use(store);// 注册仓库
app.use(router);// 注册路由器
app.use(ElementPlus);
app.mount('#app')
  1. 创建小仓库:src/store目录下新建/modules/info.ts
// 定义info小仓库
import { defineStore } from 'pinia';
// 参数一:小仓库名  参数二:小仓库配置对象
// defineStore方法执行会返回一个函数,让组件可以获取到仓库数据
const useInfoStore = defineStore("info",{
	// 存储数据
	state:()=>{
		return {
			count:99
		}
	},
	actions:{},
	getters:{}
})
export default useInfoStore;
  1. 获取并使用store数据:
    组件infoCom.vue
<template>
	<div class="info">
		<h1>{{infoStore.count}}</h1>
	</div>
</template>

<script steup lang="ts">
import useInfoStore from '../../store/modules/info';
// 获取小仓库对象
let infoStore =useInfoStore()
</script>
  1. 修改store数据:
    1. 组件中直接修改(不推荐,可读性和可维护性差)
      组件infoCom.vue
      infoStore.count++ 或者 infoStore.$patch({ count:111 })

      <template>
      	<div class="info">
      		<h1>{{infoStore.count}}</h1>
      	</div>
      </template>
      
      <script steup lang="ts">
      	import useInfoStore from '../../store/modules/info';
      	// 获取小仓库对象
      	let infoStore =useInfoStore();
      	const updateCount = () => {
      		infoStore.count++/**或者*/ infoStore.$patch({ count:111 })
      	}
      </script>
      
      
    2. store中修改(推荐)

      <template>
      	<div class="info">
      		<h1>{{infoStore.count}}</h1>
      		<button @click="updateCount">修改仓库数据</button>
      	</div>
      </template>
      
      <script steup lang="ts">
      	import useInfoStore from '../../store/modules/info';
      	// 获取小仓库对象
      	let infoStore =useInfoStore();
      	const updateCount = () => {
      		// 调用仓库自身方法,修改仓库数据
      		infoStore.updateNum(66,77);//传参
      	}
      </script>
      
      

      src/store/modules/info.ts

      <script steup lang="ts">
      	const useInfoStore = defineStore("info",{
      		state:()=>{
      			return:{
      				count:99
      			},
      			actions:{
      				updateNum(a:number,b:number){
      					this.count+=a
      				}
      			}
      		}
      </script>
      
      
  2. 计算属性getters:
// 定义info小仓库
import { defineStore } from 'pinia';
// 参数一:小仓库名  参数二:小仓库配置对象
// defineStore方法执行会返回一个函数,让组件可以获取到仓库数据
const useInfoStore = defineStore("info",{
	// 存储数据
	state:()=>{
		return {
			arr:[1,2,3,4,5,6,7]
		}
	},
	actions:{},
	getters:{
		total(){
			const result:any = this.arr.reduce((prev:number,next:number)=>{
				return prev+next;
			},0)
			return result;
		}
	}
})
export default useInfoStore;
  1. 使用getters
    组件infoCom.vue
<template>
	<div class="info">
		<h1>{{infoStore.total}}</h1>
	</div>
</template>

<script steup lang="ts">
	import useInfoStore from '../../store/modules/info';
	let infoStore =useInfoStore();
</script>
### Vue3 Pinia 状态管理教程 #### 什么是 PiniaPinia 是一个专门为 Vue 3 设计的状态管理库,它提供了简单而灵活的 API 来处理组件之间的共享状态。相比 Vuex,Pinia 更加现代化且易于使用[^1]。 #### 如何安装 Pinia? 要开始使用 Pinia,首先需要通过 npm 或 yarn 安装该库: ```bash npm install pinia ``` 或者: ```bash yarn add pinia ``` 接着,在项目的入口文件 `main.ts` 或 `main.js` 中引入并注册 Pinia: ```javascript import { createApp } from &#39;vue&#39;; import { createPinia } from &#39;pinia&#39;; const app = createApp(App); const pinia = createPinia(); app.use(pinia).mount(&#39;#app&#39;); ``` 这一步会将 Pinia 注册到整个应用程序中[^5]。 --- #### 创建 StorePinia 中,所有的状态都存储在一个或多个 store 中。可以通过定义函数来创建这些 store。例如: ```typescript // stores/counter.ts import { defineStore } from &#39;pinia&#39;; export const useCounterStore = defineStore(&#39;counter&#39;, { state: () => ({ count: 0, }), actions: { increment() { this.count++; }, decrement() { this.count--; }, }, }); ``` 在这个例子中,我们创建了一个名为 `counter` 的 store,其中包含了初始状态 `count` 和两个用于修改状态的方法 `increment` 和 `decrement`[^2]。 --- #### 在组件中使用 Store 一旦 store 被创建,就可以在任何组件中轻松访问它的状态和方法。以下是具体用法: ```vue <template> <div> <p>Count: {{ counter.count }}</p> <button @click="counter.increment">Increment</button> <button @click="counter.decrement">Decrement</button> </div> </template> <script setup> import { useCounterStore } from &#39;@/stores/counter&#39;; const counter = useCounterStore(); </script> ``` 在这里,`useCounterStore()` 返回了之前定义的 `counter` store 实例,从而可以方便地读取其状态以及调用相关操作[^1]。 --- #### 修改 State 的两种方式 除了通过 action 方法间接更新外,还可以直接更改 state 值。例如: ```typescript this.$patch({ count: newValue, }); // 或者一次性批量更新多项属性 this.$patch((state) => { state.count += 1; state.anotherProperty = someValue; }); ``` 这种方式允许更细粒度地控制如何改变内部数据结构[^4]。 --- #### 持久化存储 为了保持用户刷新页面后的状态不变,通常需要用到本地存储技术(如 localStorage)。借助社区插件如 [@pinia-plugin-persistedstate](https://github.com/prazdevs/pinia-plugin-persistedstate),能够快速实现这一功能: ```bash npm i @pinia-plugin-persistedstate ``` 然后将其集成至项目配置里: ```javascript import { createPinia } from &#39;pinia&#39;; import persist from &#39;@pinia-plugin-persistedstate&#39;; const pinia = createPinia().use(persist); export default pinia; ``` 现在每当某个特定字段被标记为持久化的部分时,都会自动同步保存下来[^4]。 --- #### 多模块设计 对于大型应用来说,推荐采用分层架构模式——即把不同业务逻辑拆分成独立的小型子仓库。比如购物车服务单独封装成 cart.store 文件夹下的 js/ts 文档形式存在;登录验证则归属 auth.store 下面等等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值