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>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值