前语
Pinia是尤雨溪强烈推荐的一款Vue状况管理工具,也被认为是下一代Vuex的代替产品。
长处
- 去除了mutations,只要 state,getters和actions,其中actions支撑了同步和异步操作
- 不会像Vuex那样有模块嵌套,Pinia只要store的概念,store之间能够彼此运用,互不影响,到达模块扁平化的作用
- 更好地支撑ts
- 更好地支撑Vue2/Vue3
- 逻辑愈加清晰,开发起来愈加简单
装置
npm i pinia
创立并挂载
1.在src目录下新建store目录并在其下面创立index.js文件,代码如下:
import { createPinia } from 'pinia'
const store = createPinia()
export default store
2.在main.js中引进store并挂载,代码如下:
import { createApp } from 'vue'
import App from './App.vue'
import store from './store/index'
createApp(App)
.use(store)
.mount('#app')
创立store
在src/store文件夹下创立一个js文件,命名按照需求即可,我这边定义为main.js,代码如下:
import { defineStore } from 'pinia'
export const mainStore = defineStore('main', {
state: () => {
return {
msg: 'hello',
count: 1
}
},
actions: {},
getters: {}
})
其中defineStore的第一个参数为该store的称号,第二个参数为一个目标,包含了该store的state,getters和actions,state改为了函数形式,意图应该是像Vue2 options API中的data相似,防止多个store中定义的特点彼此受到影响。
运用store
此处运用Vue3的SFC语法,主要是Pinia更适合Vue3这种组合式API风格,便利演示
回显与修正state
<script lang="ts" setup>
import { mainStore } from '../store/main'
import { storeToRefs } from 'pinia'
const store = mainStore()
const { count } = storeToRefs(store)
// 单条数据直接修正
const handleAddCount = () => {
store.count++
}
</script>
<template>
<div>
<p>{{ store.msg }}</p>
<p>{{ count }}</p>
<button @click="handleAddCount">+</button>
</div>
</template>
- 运用办法与Vuex根本相似,要运用哪个store,就直接进行引进,十分便利,没那么多层级引证
- 其中,咱们运用了Pinia中的storeToRefs办法,此办法能够直接解构出该store的state中的某个值,并且是呼应式的;假如咱们直接从state上解构,那么解构出的值就不是呼应式的了。
- 假如咱们要修正state中的值,不能直接去修正解构出的值,得去修正state上对应的特点
运用$patch对多条数据直接修正
运用$patch
的办法对数据进行修正,能够加速修正速度,功能更好。$patch
办法能够接受两种类型的参数,目标型和回调函数型。
$patch + 目标
$patch + 函数 注:运用回调函数型时,回调接纳一个state
参数,state指代的便是对应store中的state
运用办法如下:
<script lang="ts" setup>
import { mainStore } from '../store/main'
import { storeToRefs } from 'pinia'
const store = mainStore()
const { count } = storeToRefs(store)
// 运用$patch + 目标
const updateWithObj = () => {
store.$patch({
msg: store.msg === 'hello' ? 'hello world' : 'hello',
count: store.count + 2
})
}
// 运用$patch + 回调
const updateWithFun = () => {
store.$patch((state) => {
state.msg = state.msg === 'hello' ? 'hello world' : 'hello'
state.count = state.count + 3
})
}
</script>
<template>
<div>
<p>{{ store.msg }}</p>
<p>{{ count }}</p>
<button @click="updateWithObj">$patch+目标</button>
<button @click="updateWithFun">$patch+回调</button>
</div>
</template>
运用actions
1.在src/store/main.js的actions目标中,添加一个办法,代码如下:
import { defineStore } from 'pinia'
export const mainStore = defineStore('main', {
state: () => {
return {
msg: 'hello',
count: 1
}
},
actions: {
changeState() {
this.count++
this.msg = this.msg === 'hello' ? 'hello world' : 'hello'
}
},
getters: {}
})
2.运用办法为:store.办法名
,代码如下:
<script lang="ts" setup>
import { mainStore } from '../store/main'
import { storeToRefs } from 'pinia'
const store = mainStore()
const { count } = storeToRefs(store)
// 运用action修正数据
const onActionClick = () => {
store.changeState()
}
</script>
<template>
<div>
<p>{{ store.msg }}</p>
<p>{{ count }}</p>
<button @click="onActionClick">运用action</button>
</div>
</template>
运用getters
Pinia中的getter和Vue中的核算特点相似,在获取state之前会进行处理,具有缓存性,假如值没有改动,即便多次调用,实际上也只会调用一次。
1.在src/store/main.js的getters目标中进行添加,代码如下:
import { defineStore } from 'pinia'
export const mainStore = defineStore('main', {
state: () => {
return {
msg: 'hello',
count: 1
}
},
getters: {
getState(state) {
console.log('getState被调用了');
// getter 中不仅能够传递state直接改动数据,也能够运用this来改动数据
return `${state.msg} + ${this.count}`
}
}
})
2.运用办法如下:
<script lang="ts" setup>
import { mainStore } from '../store/main'
const store = mainStore()
</script>
<template>
<div>
<p>运用getter获取数据:{{ store.getState }}</p>
<p>运用getter获取数据:{{ store.getState }}</p>
<p>运用getter获取数据:{{ store.getState }}</p>
</div>
</template>
咱们能够看到,即便执行了三遍相同的代码,但终究仍是只调用了一次。
多个store彼此调用
在Pinia中,能够在一个store中import引进另外一个store,然后经过调用引进的store办法的形式,获取引进的store的状况。
1.在src/store目录下,新建一个文件.js,代码如下:
import { defineStore } from 'pinia'
export const userStore = defineStore('user', {
state: () => {
return {
name: '吴同学'
}
}
})
2.在需求用到的store中进行引进,并经过getters的办法获取,代码如下:
import { defineStore } from 'pinia'
import { userStore } from './user'
export const mainStore = defineStore('main', {
getters: {
getUserState() {
return userStore().name
}
}
})
数据耐久化
Pinia与Vuex相同,改写页面后,数据就会重置,有时候咱们需求将数据进行耐久化存储,咱们能够运用pinia-plugin-persist这个插件
装置
npm i pinia-plugin-persist –save
运用
1.在src/store/index.js文件夹下,引进并运用,代码如下:
import { createPinia } from 'pinia'
import piniaPluginPersist from 'pinia-plugin-persist'
const store = createPinia()
store.use(piniaPluginPersist)
export default store
2.在对应的store里敞开耐久化存储
import { defineStore } from 'pinia'
import { userStore } from './user'
export const mainStore = defineStore('main', {
state: () => {
return {
msg: 'hello',
count: 1
}
},
// 敞开数据缓存
persist: {
enabled: true
}
})
更新数据以后,咱们就能在浏览器控制台中看到现已将数据存储到了sessionStorage中
数据默认是存在sessionStorage中的,还会以store的称号作为key。可是咱们能够对其修正,并且还能够只耐久化部分state中的特点,代码如下:
import { defineStore } from 'pinia'
import { userStore } from './user'
export const mainStore = defineStore('main', {
state: () => {
return {
msg: 'hello',
count: 1
}
},
// 敞开数据缓存
persist: {
enabled: true,
strategies: [
{
key: 'mainStore', // 修正存在缓存中的key值
storage: localStorage, // 修正存储办法为localStorage
paths:['msg'] // 只耐久化msg,此刻改写页面msg数据会被保留,其他state将会重置
}
]
}
})
总结
Pinia便是Vuex的代替产品,比较于Vuex,Pinia更好地兼容了Vue自身,代码愈加简练,开发起来也愈加快捷。以上便是关于Pinia的介绍,假如觉得对你有协助,就请点个赞,谢谢我们!