Pinia 是一个基于 Vue.js 的状态管理库,用于管理应用程序的数据。它提供了一种简单、直观且可扩展的方式来组织和访问应用程序的状态,下面是详细介绍
官方文档:
https://pinia.web3doc.top/introduction.html
npm install pinia
import { createPinia } from "pinia";
const pinia = createPinia();
createApp(App).use(pinia).mount('#app')
import { defineStore } from 'pinia'
// useStore 一般命名是use开头,useProductStore、useUserStore 等等
// defineStore 是用于定义存储库(store)的方法。它接受两个参数:storeName 和 storeDefinition。
// 1.storeName(必需):表示存储库的名称,是一个字符串。该名称用于在 Pinia 中唯一标识存储库,因此在应用程序中定义不同的存储库时,应确保每个存储库具有唯一的名称。
// 2.storeDefinition(必需):表示存储库的定义,是一个对象。该对象包含了存储库的配置、状态(state)、动作(actions)、获取器(getters)等。
export const useStore = defineStore('user', {
// 推荐使用 完整类型推断的箭头函数
state: () => {
return {
// 所有这些属性都将自动推断其类型
name: "curry",
age: 35,
};
},
})
<template>
<div>name值:{{ userStore.name }}div>
<div>age值:{{ userStore.age }}div>
template>
<script setup>
// 引入一下创建的store
import {useUserStore} from '../store/index'
// 因为是个方法,所以我们得调用一下
const userStore = useUserStore()
script>
useStore获取到后不能解构,否则失去响应式,如果想要保持响应式可以使用storeToRefs()函数
name值:{{ userStore.name }}
age值:{{age }}
$patch函数也是常用修改Store的方法
name值:{{ userStore.name }}
age值:{{ age }}
$reset()函数的作用是重置state中的数据
name值:{{ userStore.name }}
age值:{{ age }}
2.页面展示
在Pinia插件中,getters(获取器)和actions(动作)是两个不同的概念,用于处理和访问存储库中的数据。
Getter是用于获取存储库中的状态(state)的方法。Getter类似于计算属性,它们基于存储库的状态计算出一个值,并在需要时被调用。Getter可以接受参数,并且可以进行逻辑操作和计算,但不能直接修改状态。
Getter的主要特点包括:
import { defineStore } from 'pinia'
// useStore 一般命名是use开头,useProductStore、useUserStore 等等
// defineStore 是用于定义存储库(store)的方法。它接受两个参数:storeName 和 storeDefinition。
// 1.storeName(必需):表示存储库的名称,是一个字符串。该名称用于在 Pinia 中唯一标识存储库,因此在应用程序中定义不同的存储库时,应确保每个存储库具有唯一的名称。
// 2.storeDefinition(必需):表示存储库的定义,是一个对象。该对象包含了存储库的配置、状态(state)、动作(actions)、获取器(getters)等。
export const useUserStore = defineStore('user', {
// 推荐使用 完整类型推断的箭头函数
state: () => {
return {
// 所有这些属性都将自动推断其类型
name: "curry",
age: 35,
};
},
getters: {
// 年龄乘以2
doubleAge: (state) => state.age * 2,
},
})
name值:{{ userStore.name }}
age值:{{ age }}
doubleAge:{{ userStore.doubleAge }}
Action是用于对存储库中的状态进行操作和修改的方法。Action可以执行异步操作,如发送网络请求、处理副作用等。Action可以接受参数,并且可以修改状态或触发其他动作。
Action的主要特点包括:
import {defineStore} from 'pinia'
// useStore 一般命名是use开头,useProductStore、useUserStore 等等
// defineStore 是用于定义存储库(store)的方法。它接受两个参数:storeName 和 storeDefinition。
// 1.storeName(必需):表示存储库的名称,是一个字符串。该名称用于在 Pinia 中唯一标识存储库,因此在应用程序中定义不同的存储库时,应确保每个存储库具有唯一的名称。
// 2.storeDefinition(必需):表示存储库的定义,是一个对象。该对象包含了存储库的配置、状态(state)、动作(actions)、获取器(getters)等。
export const useUserStore = defineStore('user', {
// 推荐使用 完整类型推断的箭头函数
state: () => {
return {
// 所有这些属性都将自动推断其类型
name: "curry",
age: 35,
};
},
getters: {
// 年龄乘2
doubleAge: (state) => state.age * 2,
},
actions:{
incrementAge(num){
this.age += num
}
}
})
name值:{{ userStore.name }}
age值:{{ userStore.age }}
总结:
Getter用于获取存储库的状态并进行计算,而Action用于操作和修改存储库的状态。
Getter主要用于获取数据,而Action主要用于执行操作和修改数据。
根据您的需求,选择适当的方式来读取或修改存储库中的数据。
默认pinia数据是没有持久化的,刷新页面就变成默认值了,持久化需要安装如下插件
npm i pinia-plugin-persist
import { createApp } from 'vue'
import App from './App.vue'
import { createPinia } from "pinia";
import piniaPluginPersist from "pinia-plugin-persist"; //pinia持久化
const pinia = createPinia();
pinia.use(piniaPluginPersist);
createApp(App).use(pinia).mount('#app')
import {defineStore} from 'pinia'
// useStore 一般命名是use开头,useProductStore、useUserStore 等等
// defineStore 是用于定义存储库(store)的方法。它接受两个参数:storeName 和 storeDefinition。
// 1.storeName(必需):表示存储库的名称,是一个字符串。该名称用于在 Pinia 中唯一标识存储库,因此在应用程序中定义不同的存储库时,应确保每个存储库具有唯一的名称。
// 2.storeDefinition(必需):表示存储库的定义,是一个对象。该对象包含了存储库的配置、状态(state)、动作(actions)、获取器(getters)等。
export const useUserStore = defineStore('user', {
// 推荐使用 完整类型推断的箭头函数
state: () => {
return {
// 所有这些属性都将自动推断其类型
name: "curry",
age: 35,
};
},
getters: {
// 年龄乘2
doubleAge: (state) => state.age * 2,
},
actions: {
incrementAge(num) {
this.age += num
},
changeName(name) {
this.name = name
}
},
persist: {
// 默认会保存当前模块全部数据
enabled: true, // 开启缓存 默认会存储在本地localstorage
storage: sessionStorage, // 缓存使用方式
}
})
刷新页面age不会被重置
store中所有的store都被保存了
页面刷新后age也不会变成默认值,证明持久化成功
有时可能只要保存部分数据,这是就要用到strategies,在里面自定义保存的内容了
key设置为’age’,paths设置只保存’age’
import {defineStore} from 'pinia'
// useStore 一般命名是use开头,useProductStore、useUserStore 等等
// defineStore 是用于定义存储库(store)的方法。它接受两个参数:storeName 和 storeDefinition。
// 1.storeName(必需):表示存储库的名称,是一个字符串。该名称用于在 Pinia 中唯一标识存储库,因此在应用程序中定义不同的存储库时,应确保每个存储库具有唯一的名称。
// 2.storeDefinition(必需):表示存储库的定义,是一个对象。该对象包含了存储库的配置、状态(state)、动作(actions)、获取器(getters)等。
export const useUserStore = defineStore('user', {
// 推荐使用 完整类型推断的箭头函数
state: () => {
return {
// 所有这些属性都将自动推断其类型
name: "curry",
age: 35,
};
},
getters: {
// 年龄乘2
doubleAge: (state) => state.age * 2,
},
actions: {
incrementAge(num) {
this.age += num
},
changeName(name) {
this.name = name
}
},
// persist: {
// 默认会保存当前模块全部数据
// enabled: true, // 开启缓存 默认会存储在本地localstorage
// storage: sessionStorage, // 缓存使用方式
// }
//持久化
persist: {
enabled: true,
// 自定义持久化参数
strategies: [
{
// 自定义key
key: "age",
// 自定义存储方式,默认sessionStorage
storage: sessionStorage,
// 指定要持久化的数据,默认所有 state 都会进行缓存,可以通过 paths 指定要持久化的字段,其他的则不会进行持久化。
paths: ["age"],
}
],
},
})
这时看到只有age被保存