配置方式
vue2 配置
- 安装 pinia
- 安装 @vue/composition-api
npm i @vue/composition-api -S
- 打开入口文件 main.js
- 引入 pinia 和 @vue/composition-api
import { createPinia, PiniaVuePlugin } from 'pinia'
import VueCompositionAPI from '@vue/composition-api'
- 注册插件 PiniaVuePlugin 和 VueCompositionAPI
Vue.use(PiniaVuePlugin)
Vue.use(VueCompositionAPI)
- 创建 pinia 实例(创建根存储,传递给应用程序)
const pinia = createPinia()
- Vue 实例化配置项中添加 pinia
- src 目录下,创建 store 目录
- 目录下创建 index.js 文件
- 引入 pinia
import { defineStore } from 'pinia'
- 调用 defineStore
- 参数1:容器ID,必须唯一
- 参数2:配置对象
- state:函数
- 存储组件状态(数据)
- 返回值为对象,定义初始值
- getters:对象
- 计算属性
- actions:对象
- 封装业务逻辑,修改 state
- 暴露 difineStore 函数调用返回值
项目如果是使用 Vue CLI 构建,调用命令 vue add vue-cli-plugin-pinia ,使用第三方插件,一步完成上述所有操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import { createPinia, PiniaVuePlugin } from 'pinia' import VueCompositionAPI from '@vue/composition-api'
Vue.use(PiniaVuePlugin) const pinia = createPinia() Vue.use(VueCompositionAPI)
new Vue({ render: h => h(App),
pinia
}).$mount('#app')
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| import { defineStore } from 'pinia'
export const useCounterStore = defineStore('counter', { state: () => ({ count: 0 }), getters: { double: state => state.count * 2, }, actions: { increment() { this.count++ }, }, })
|
vue3 配置
- 安装 pinia
- 打开入口文件 main.js
- 引入 pinia
import { createPinia } from 'pinia'
- 注册插件(创建根存储,传递给应用程序)
app.use(createPinia())1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
import { createApp } from "vue" import App from "./App.vue" import { createPinia } from "pinia"
const app = createApp(App)
const pinia = createPinia()
app.use(pinia)
app.mount("#app")
|
- src 目录下,创建 store 目录
- 目录下创建 index.js 文件
- 引入 pinia
import { defineStore } from 'pinia'
- 调用 defineStore
- 参数1:容器ID,必须唯一
- 参数2:配置对象
- state:函数
- 存储组件状态(数据)
- 返回值为对象,定义初始值
- getters:对象
- 计算属性
- actions:对象
- 封装业务逻辑,修改 state
- 暴露 difineStore 函数调用返回值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
import { defineStore } from "pinia"
export const myStore = defineStore("main",{ state:()=>{ return { a:100, b:200 } },
getters:{ updated(state){ return state.a + 10 } updated2():number{ return this.a + 10 } },
actions:{ checkdata(){ this.a = 6 } } })
|
使用数据
获取数据
直接获取数据
- 引入 store 生成函数
- 通过 store 生成函数获取唯一实例(多次调用返回同一实例)
- 通过 store 实例获取数据
1 2 3 4 5 6
|
import { myStore } from "../store"
let store = myStore() let name = store.a
|
结构赋值数据
作用
- 基本类型数据如果直接进行结构赋值,则变量接收的就是值的副本。使用函数
storeToRefs 处理 store 实例,返回值再进行结构赋值,赋值的变量是一个动态响应并且指向 store 中属性的数据。(效果等同与 vue3 API toRefs)
- 只能处理
store 实例
- 只处理
store 第一层数据
用法
- 引入
storeToRefs 函数
- 获取
store 唯一实例
- 通过
storeToRefs 函数处理 store 实例
- 对处理对象进行解构赋值
1 2 3 4 5 6 7 8
|
import { myStore } from "../store" import { storeToRefs } from "pinia"
let store = myStore()
let { a,b } = storeToRefs(store)
|
调用函数
1 2 3 4 5
| import { myStore } from "../store"
let store = myStore()
store.checkdata()
|
修改数据
- 单个数据对获取的数据进行赋值即可
- 多个数据修改,需要使用
store 实例的 $patch 函数进行批量赋值
对象参数
1 2 3 4 5 6 7
| import { myStore } from "../store"
let store = myStore()
store.$patch({ a:mystore.a+1 })
|
回调参数
1 2 3 4 5 6 7
| import { myStore } from "../store"
let store = myStore()
store.$patch(state=>{ state.a++ })
|
重置数据
store中的数据会变为初始状态,页面也会更新
直接替换整个state
将我们提前声明的state替换为新的对象
1
| store.$state = { counter: 666, name: '张三' }
|
多个页面使用 store
- 根目录下
store 目录中可以创建多个 .js 或 .ts 文件,每个文件都可以定义暴露 defineStore 函数
- 不同 .vue 文件引入此模块,获取唯一 store 实例,即可获取或给数据赋值,实现多页面数据共享