Pinia
Pinia
实现多个组件中的数据传递
- 组件传参
- 路由传参
- 通过Pinia状态管理定义共享数据
Pinia在使用时,有点像Sevlet中的域对象
Pinia数据无法进行持久化,Pinia结合SessionStorage或者LocalStorage可解决这个问题
Pinia的数据默认为响应式数据,且实时更新
Pinia安装依赖
在使用Pinia之前,我们按例首先安装他的依赖
npm install pinia
Pinia轻松访问
store.js
在src文件夹下建立store文件夹 -> 建立store.js文件用来存放共享数据
从Pinia框架中导入defineStore,此方法用来定义Pinia的共享数据
defineStore中有以下属性:
- id:当前数据的id,全局唯一
- state:对象本身的属性
- getters:get方法,调用时直接 对象.方法 的形式调用
- actions:set方法,调用时使用 对象.方法() 的形式调用
// 定义共享数据
import {defineStore} from "pinia"
export const definedPerson = defineStore(
{
id: "personPinia", //当前数据的id,必须全局唯一(多个文件中也不可以重复)
state: () => {
return {
username: "xiaobai",
age: 18,
hobbies: ["唱歌", "跳舞"]
}
},
getters: {
//专门定义一些获得数据,或使用数据计算结果的方法,这里的函数不要修改数据
getAge() {
return this.age;
},
getHobbiesCount() {
return this.hobbies.length
}
},
actions: {
//专门定义一些修改数据的函数(setter)
doubleAge() {
this.age = this.age * 2
}
}
}
)
pinia.js
在src下建立一个pinia.js,存放一个建立好的pinia对象,方便main.js导入
import {createPinia} from "pinia"
const pinia = createPinia()
export default pinia
main.js
我们需要在main.js中使用全局Pinia,就如同使用router一样
import { createApp } from 'vue'
import App from './App.vue'
const app = createApp(App)
import router from './routers/router'
app.use(router)
import pinia from "./pinia.js";
app.use(pinia)
app.mount('#app')
组件中使用数据
导入我们暴露的对象,使用其构建一个对象
这种语法源自于js的原型链,即“函数即对象”一概念,对象方法在调用自身时,会返回自己本身
import {definedPerson} from "../store/store.js"
const person = definedPerson()
Pinia中有一些自己的API
- $reset:将所有的值恢复默认,即store.js定义的那样
- $patch:批量修改多个属性值
<!-- 恢复默认值-->
<button @click="person.$reset()">恢复默认</button>
<!-- 一次修改多个属性值-->
<button @click="person.$patch({username:'奥特曼',age:20,hobbies:['打怪兽']})">变身奥特曼</button>
语法小细节
ID外置
我们可以将Pinia共享数据中的id参数拿出来,作为defineStore的第一个参数使用
// 定义共享数据
import {defineStore} from "pinia"
export const definedPerson = defineStore("personPinia",
{
……
}
)
改写getters方法使用箭头函数
当然,我们可以使用箭头函数,但需要注意的是,箭头函数没有自己的this,所以要将state作为参数传进来,使用state去调用对象定义的属性
// 定义共享数据
import {defineStore} from "pinia"
export const definedPerson = defineStore("personPinia",
{
state: () => {
return {
……
}
},
getters: {
//专门定义一些获得数据,或使用数据计算结果的方法,这里的函数不要修改数据
getAge:(state) => {
return state.age;
},
getHobbiesCount:(state) => {
return state.hobbies.length
}
},
……
}
)