Skip to content

pinia 模块化

在复杂项目中,不可能把所有数据都定义到一个 store 中,Pinia 支持定义多个 Store 模块

一般来说会一个模块对应一个 store,最后通过一个根 store 进行整合

1、新建 store/user.js 文件

js
import { defineStore } from "pinia";

const useUserStore = defineStore("user", {
  state: () => {
    return {
      name: "正心全栈编程",
      age: 18,
    };
  },
});

export default useUserStore;

2、新建 store/index.js

js
import { defineStore } from "pinia";
import useUserStore from "./user";
import useCounterStore from "./counter";

// 封装主 Store,把独立的模块做统一管理,方便开发时使用
const useMainStore = defineStore("main", {
  state: () => ({
    user: useUserStore(),
    counter: useCounterStore(),
  }),
});

export default useMainStore;

3、在组件中使用

vue
<script setup>
import { storeToRefs } from "pinia";
import useMainStore from "./store";

const main = useMainStore();
const { user } = storeToRefs(main);
const { name } = storeToRefs(main.user);
</script>

<template>
  <h1>根组件 --- {{ main.user.name }}</h1>
  <h1>根组件 --- {{ user.name }}</h1>
  <h1>根组件 --- {{ name }}</h1>
</template>

持久化

1、安装模块

pnpm i pinia-plugin-persistedstate

2、添加插件到 pinia 对象

js
import { createPinia } from "pinia";
import piniaPluginPersistedstate from "pinia-plugin-persistedstate";

const pinia = createPinia();
pinia.use(piniaPluginPersistedstate);

3、使用

选项式 api 使用

js
import { defineStore } from "pinia";

export const useStore = defineStore("main", {
  state: () => {
    return {
      someState: "hello pinia",
    };
  },
  persist: true,
});

组合式 api 使用

js
import { defineStore } from "pinia";

export const useStore = defineStore(
  "main",
  () => {
    const someState = ref("hello pinia");
    return { someState };
  },
  {
    persist: true,
  },
);