pinia中使用要比Vuex简单。Vuex中有state、mutations、getters、actions、modules五种, 而 pinia中只有state、getters、actions。写法上有些不同。还是相对Vuex简单的
安装
yarn add pinia
# or with npm
npm install pinia
main.js
import { createApp } from 'vue'
import App from './App.vue'
import { createPinia } from 'pinia'
const pinia = createPinia()
createApp(App)
.use(pinia)
.mount('#app')
在src下新建store/index.js
因为没有Vuex中的modules了,其实这个新建的index.js就相当于是一个模块了 ,有其他模块 可以继续创建,只要为每个模块指定唯一的ID就可以了(就是defineStore中第一个参数)
import { defineStore } from 'pinia'
/**
* 1. 定义并导出容器
* 参数1: 容器的 ID , 必须唯一, 将来 Pinia 会把所有的容器挂载到跟容器
* 参数2: 选项对象
* 返回值: 一个函数, 调用得到容器实例
*/
export const useIndexStore = defineStore('index', {
/**
* 类似于组件的data, 用来存储全局状态
* 1. 必须是函数,这样是为了在服务端渲染的时候避免交叉请求导致的数据状态渲染
* 2. 必须是箭头函数, 这是为了更好的 TS 类型推导
*/
state: () => {
return {
count: 100,
quantity: 10
}
},
/**
* 类似于组件的computed, 用来封装计算属性, 有缓存的功能
*/
getters: {
// 接受一个可选参数 state 即 当前ID为index的Store实例 也可以用this 拿到 上面的state的状态值
countTotal(state) {
return state.count * state.quantity
}
},
/**
* 类似于组件的 methods 封装业务逻辑, 修改state
* 通过 this 拿到上面 state的状态值
*/
actions: {
countChange(val) {
console.log(val,'actions中的参数--->>>>')
this.count++
this.quantity++
// or
// this.$patch({})
// this.$patch(state => {})
}
}
})
组件中使用
<template>
count: {{indexStore.count}}
quantity: {{indexStore.quantity}}
countTotal: {{indexStore.countTotal}}
<hr>
count: {{count}}
quantity: {{quantity}}
countTotal: {{countTotal}}
<hr>
<el-button type="primary" @click="indexStoreChange">修改state数据</el-button>
</template>
<script setup>
import { useIndexStore } from '@/store'
import { storeToRefs } from 'pinia'
// state、getters、actions 里面属性或者方法 都是通过 indexStore “点” 出来使用的
const indexStore = useIndexStore()
// 如果想将状态数据结构出来直接使用 必须引入storeToRefs(否则不是响应式) 来自于 pinia(类似于 reactive响应式,结构使用toRefs)
const { count, quantity, countTotal } = storeToRefs(indexStore)
// 修改state中的数据
const indexStoreChange = () => {
// // 方式一: 最简单的方式就是这样
// indexStore.count++
// indexStore.quantity++
// // 方式二:如果修改多个数据,建议使用 $patch 批量更新
// indexStore.$patch({
// count: indexStore.count + 1,
// quantity: indexStore.quantity + 1
// })
// // 方式三(推荐都使用这个就好): 更好的批量更新的方式: $patch 一个函数 这种性能更好
// indexStore.$patch(state => {
// state.count++
// state.quantity++
// })
// 方式四: 逻辑比较多的时候 可以状态到 actions 中 调用 actions中的方法处理
indexStore.countChange()
}
</script>
<style scoped>
</style>