Vue pinia模块化全局注册详解

 更新时间:2023年02月02日 08:52:30   作者:IN~Trying  
这篇文章主要介绍了Vue pinia模块化全局注册,Pinia是Vue.js团队成员专门为Vue开发的一个全新的状态管理库,并且已经被纳入官方github

Vue3中对pinia模块化全局注册

项目小使用简易的方式还不觉得,但是项目大了后就会发现引入的东西有些重复了

安装

yarn add pinia
# or with npm
npm install pinia

挂载实例

main.ts中 挂载pinia实例

import { createPinia } from "pinia";
...
const pinia = createPinia()
app.use(pinia);

话不多说,直接贴代码

在scr下创建stores文件夹,创建index.ts文件

// 使用options API模式定义,vue2的组件模型形式类似
// import useDemoStore  from "./modules/addNumber";
// export interface PiniaStore {
//     useDemoStore:ReturnType<typeof useDemoStore>
// }
// const piniaStore: PiniaStore = {} as PiniaStore;
// /**
//  * 注册app状态库
//  */
// export const registerStore = () => {
//     piniaStore.useDemoStore = useDemoStore()
// };
// export default piniaStore;
// 使用setup模式定义
import { useDemoStore } from "./modules/addNumber";
// import textContentStore from "./modules/textContent";  //单一个方法
import { textContentStore, usefruitStore } from "./modules/textContent"; //多个不同需缓存的方法
export interface PiniaStore {
  useDemoStore: ReturnType<typeof useDemoStore>;
  textContentStore: ReturnType<typeof textContentStore>;
  usefruitStore: ReturnType<typeof usefruitStore>;
}
const piniaStore: PiniaStore = {} as PiniaStore;
/**
 * 注册app状态库
 */
export const registerStore = () => {
  piniaStore.useDemoStore = useDemoStore();
  piniaStore.textContentStore = textContentStore();
  piniaStore.usefruitStore = usefruitStore();
};
export default piniaStore;

scr/stores/modules/

新建你的store.ts
这里使用了两种不同的数据持久化插件,如果不需要可忽略插件

1、pinia-plugin-persist 插件的数据持久化使用

2、pinia-plugin-persistedstate插件

两个插件的属性使用不一样,需注意
代码使用了两个不同的写法,

1、使用options API模式定义,vue2的组件模型形式类似

2、使用setup模式定义

主要是用作全局注册

import { defineStore } from "pinia";
import { ref } from "vue";
//  pinia-plugin-persist 插件的数据持久化使用
export const textContentStore = defineStore({
  id: "goods",
  state: () => {
    return {
      fruit: "苹果",
      price: 15,
    };
  },
  actions: {
    changeName() {
      this.fruit = "雪梨";
    },
    changePrice(val: number) {
      this.price = val;
    },
  },
  // 开启数据缓存
  persist: {
    enabled: true,
    key: "goods",
    //   strategies: [
    //     {
    //       storage: localStorage,
    //       paths: ['accessToken']
    //     },
    strategies: [
      //   自定义存储到 sessionStorage 和 localStorage
      { key: "fruit", storage: sessionStorage, paths: ["fruit"] },
      { key: "price", storage: localStorage, paths: ["price"] },
    ],
  },
});
export const usefruitStore = defineStore(
  "goods1",
  () => {
    const fruit1 = ref<string>("香蕉");
    const price1 = ref<number>(10);
    function changeName1() {
      fruit1.value = "雪梨";
    }
    function changePrice1(val: number) {
      price1.value = val;
    }
    return { fruit1, price1, changeName1, changePrice1 };
  },
  {
    //持久化存储配置 ,必须同步详情可看官方说明文档
    persist: {
      key: "_pinia_price1",
      storage: sessionStorage,
      paths: ["fruit1"],
    },
  }
);
// export const textContentStore = defineStore(
//   "counter",
//   () => {
//     const fruit = ref<string>("苹果");
//     const price = ref<number>(100);
//     function changeName() {
//       fruit.value = "雪梨";
//     }
//     function changePrice(val:number) {
//         price.value = val
//     }
//     return { fruit, price, changeName, changePrice, };
//   },
// //   {
// //     //持久化存储配置 ,必须同步详情可看官方说明文档
// //     persist: {
// //       key: "_pinia_fruit",
// //       storage: sessionStorage,
// //       paths: ["fruit"],
// //     },
// //   }
// );

页面

到页面上的使用

<h2>水果</h2>
    <h3>名称1:{{ fruit }}---价格:{{ price }}</h3>
    <button @click="changeName">修改名称</button>
    <button @click="ChangePrice">修改价格</button>
    --------------------------------------------
    <h3>名称2:{{ fruit1 }}---价格:{{ price1 }}</h3>
    <button @click="changeName1">修改名称1</button>
    <button @click="changePrice1(120)">修改价格1</button>
import PiniaStore from "../stores";
import { storeToRefs } from "pinia";
// setup composition API模式
const { fruit, price } = storeToRefs(PiniaStore.textContentStore);
const { changeName, changePrice } = PiniaStore.textContentStore;
const { fruit1, price1 } = storeToRefs(PiniaStore.usefruitStore);

相对来说项目小的话没什么必要做全局,但是项目大了可能这样会好维护一些

当然也会有更好的方式,只是我没发现

最后补充

打包解耦

到这里还不行,为了让appStore实例与项目解耦,在构建时要把appStore抽取到公共chunk,在vite.config.ts做如下配置

build: {
      outDir: "dist",
      rollupOptions: {
        output: {
          manualChunks(id) {
            //静态资源分拆打包
            ...其他配置
            // 将pinia的全局库实例打包进vendor,避免和页面一起打包造成资源重复引入
            if (id.includes(resolve(__dirname, "/src/store/index.ts"))) {
              return "vendor";
            }
          },
        },
      },
   }

到此这篇关于Vue pinia模块化全局注册详解的文章就介绍到这了,更多相关Vue pinia模块化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Element Card 卡片的具体使用

    Element Card 卡片的具体使用

    这篇文章主要介绍了Element Card 卡片的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • vue axios重复点击取消上一次请求封装的方法

    vue axios重复点击取消上一次请求封装的方法

    这篇文章主要介绍了vue axios重复点击取消上一次请求封装的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • vue使用better-scroll实现滑动以及左右联动

    vue使用better-scroll实现滑动以及左右联动

    这篇文章主要介绍了vue使用better-scroll实现滑动以及左右联动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • vue实现多级菜单效果

    vue实现多级菜单效果

    这篇文章主要为大家详细介绍了vue实现多级菜单效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • vue项目npm run build打包dist文件及打包后空白解决办法

    vue项目npm run build打包dist文件及打包后空白解决办法

    npm run build 这个命令会执行Vue CLI中预定义的打包配置,并将打包后的文件存放在"dist"文件夹中,这篇文章主要给大家介绍了关于vue项目npm run build打包dist文件及打包后空白的解决办法,需要的朋友可以参考下
    2023-10-10
  • 深入浅析Vue 中 ref 的使用

    深入浅析Vue 中 ref 的使用

    在之前的前端开发中,为了实现我们的需求,通常采用的方案是通过 JS/Jquery 直接操纵页面的 DOM 元素,得益于 Jquery 对于 DOM 元素优异的操作能力,我们可以很轻易的对获取到的 DOM 元素进行操作。这篇文章主要介绍了Vue 中 ref 的使用 ,需要的朋友可以参考下
    2019-04-04
  • 手写可拖动穿梭框组件CustormTransfer vue实现示例

    手写可拖动穿梭框组件CustormTransfer vue实现示例

    这篇文章主要为大家介绍了手写可拖动穿梭框组件CustormTransfer vue实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • VUEJS 2.0 子组件访问/调用父组件的实例

    VUEJS 2.0 子组件访问/调用父组件的实例

    下面小编就为大家分享一篇VUEJS 2.0 子组件访问/调用父组件的实例。具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • 深入探究Vue中探究组合式API的奥秘

    深入探究Vue中探究组合式API的奥秘

    Vue 3中引入了组合式API,它是一种新的代码组织方式,旨在让开发者更灵活地组织和重用Vue组件的逻辑,下面我们就来学习一下Vue中常见组合式API的使用吧
    2023-11-11
  • vue input标签通用指令校验的实现

    vue input标签通用指令校验的实现

    这篇文章主要介绍了vue input标签通用指令校验的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11

最新评论