在组件之间共享全局 pinia 存储
2022-08-10
6770
我有两个带有自己的加载器的 vue 组件,分别挂载到两个已经渲染的 DOM 节点中:
组件 A:
import { createApp } from 'vue'
import ComponentA from '@/Vue/ComponentA.vue';
import {createPinia} from 'pinia';
createApp(ComponentA).use(createPinia()).mount(document.querySelector('.c-component-a'));
组件 B:
import { createApp } from 'vue'
import ComponentB from '@/Vue/ComponentB.vue';
import {createPinia} from 'pinia';
createApp(ComponentA).use(createPinia()).mount(document.querySelector('.c-component-b'));
现在,我想将一个全局 pinia 存储加载到多个组件中:
Pinia 存储:
import {defineStore} from 'pinia';
export type RootState = {
foobar: number;
}
export const useGlobalApplicationStore = defineStore({
id: 'global',
state: () => ({
foobar: 100
} as RootState),
actions: {
setFoobar(payload: number): void {
this.foobar = payload;
}
},
getters: {
getFoobar(state: RootState): number {
return state.foobar;
}
}
})
如果组件 A 在此存储中设置一个值,则组件 B 应该对更改做出反应。
组件 A:
const globalApplicationStore = useGlobalApplicationStore();
setTimeout(() => {
globalApplicationStore.setFoobar(400);
}, 2000);
组件 A 中 {{globalApplicationStore.foobar}} 的输出在 2 秒后从 100 变为 400,这与预期一致。
组件 B:
const globalApplicationStore = useGlobalApplicationStore();
组件 B 中 {{globalApplicationStore.foobar}} 的输出没有从 100 变为400. 我猜,两个组件都将存储加载为本地实例。
如何在单独安装的组件之间共享存储?
1个回答
经过长时间的搜索,我发现这非常简单(通常...)。 就我而言,我使用 Vue.js 的渐进式方面将应用程序放在 HTML 代码的不同位置。具体来说,我想在布局的标题中用商品数量填充购物车图标。因此,我为产品应用程序使用了 App.vue,为篮子指示器使用了 Basket.vue。
简单的技巧是只实例化 pinia 一次。假设您有一个 main.js 作为应用程序的入口点:
import { createApp } from "vue";
import App from "./App.vue";
import Basket from "./Basket.vue";
import {createPinia} from 'pinia';
const pinia = createPinia();
// Init App
createApp(App)
.use(pinia)
.mount("#app");
// Init Basket
createApp(Basket)
.use(pinia)
.mount("#basket");
在您的 App.vue 中,您只需导入您的商店(在我的情况下是产品商店和购物车商店)。
<script setup>
... import components ...
import {useProductStore} from "@/stores/ProductStore";
import {useCartStore} from "@/stores/CartStore";
const productStore = useProductStore();
const cartStore = useCartStore();
productStore.fill();
</script>
<template>
... your components ...
</template>
您的 Basket.vue 中也是一样:
<script setup>
import CartWidget from "@/components/CartWidget.vue";
import {useCartStore} from "@/stores/CartStore";
import {useProductStore} from "@/stores/ProductStore";
const cartStore = useCartStore();
const productStore = useProductStore();
productStore.fill();
</script>
<template>
<div class="container">
<CartWidget/>
</div>
</template>
就是这样。
“pinia”:“^2.0.17”, “vue”:“^3.2.39”
Tobse
2022-09-15