vite+vue3动态模块化导入并使用pinia

一、安装引入pinia

1.安装

pnpm install pinia
# 或者使用 yarn
yarn add pinia
# 或者使用 npm
npm install pinia

2.在main.js里引入

import { createApp } from 'vue'
import App from './App.vue'
import { createPinia } from 'pinia'
createApp(App).use(createPinia()).mount('#app')

pinia官网

vue3官网

二、在src目录下创建 store目录

1.创建store/index.js

/* 
***import.meta.glob('./modules/*.js', { eager: true }) 同步引入多个文件
storeodules  多个store仓库集合
moduleNameList   多个store暴露的仓库名称集合
*/
/* 
**pinia模块化使用示例
*/
let storeodules = {};
let moduleNameList=[]
const requireModule = import.meta.glob('./modules/*.js', { eager: true })
console.log(`requireModule`, requireModule, typeof (requireModule));
//const requireModule = import.meta.glob('./modules/*.js')
 Object.entries(requireModule).forEach(([fileKey, fileValue]) => {
  console.log(`fileKey,fileValue`, fileKey, fileValue);
  if (fileKey === './index.js') return;  // 过滤掉 index.js 本身
  const moduleName = fileKey.replace(/(\.\/modules\/|\.js)/g, ''); // 获取模块名(去掉前后缀)
  console.log(`moduleName`, moduleName);
  storeodules[moduleName] = requireModule[fileKey][moduleName];
  moduleNameList.push(moduleName)
});

console.log(`storeodules, moduleNameList`, storeodules, moduleNameList);
export {storeodules, moduleNameList}








*1* import.meta.glob是vite提供的批量导入文件或者模块的方法

*2* import.meta.glob('./modules/*.js', { eager: true }) 同步导入多个文件或者模块,值为一个对象。key为文件名,value为对应文件模块

*3* import.meta.glob('./modules/*.js') 异步导入多个文件或者模块,值为一个对象。key为文件名,value为一个动态导入文件或者模块的箭头函数,函数返回值为一个Promise对象,要用。.then的方法获取值。

*4* 本文vite+vue3动态模块化导入并使用pinia使用的是:import.meta.glob('./modules/*.js', { eager: true }) 同步导入多个文件或者模块

vite官网

2.创建store/modules/useCartStore.js和store/modules/useCounterStore.js

store/modules/useCartStore.js文件 

import {ref} from 'vue'
import { defineStore } from 'pinia';

export const useCartStore = defineStore('cartStore', {
    state: () => ({
        cart: "购物车"
    }),
    actions: {
        cartconterFun() {
        this.cart=`购物车${
                Math.round(Math.random()*100)
            }`
        },
    },
})

store/modules/useCounterStore.js文件 

import {ref} from 'vue'
import { defineStore } from 'pinia';

export const useCounterStore = defineStore('counterStore', {
   state: () => ({
     count:0
    }),
    actions: {
        incrementFun() {
            this.count++
        },
    },
})

三、pinia模块化使用示例

在HelloWorld.vue组件中使用

<script setup>
/* 
**pinia模块化使用示例
*/
import { storeToRefs } from 'pinia'
import { storeodules, moduleNameList } from '@/store/index'
console.log(`storeodules, moduleNameList`, storeodules, moduleNameList);
const [useCartStore, useCounterStore] = moduleNameList.map(ele => storeodules[ele]())
console.log(`useCartStore, useCounterStore`, useCartStore, useCounterStore);
//cart、count是响应式的 ref 同时通过插件添加的属性也会被提取为 ref
const { cart } = storeToRefs(useCartStore)
const { count } = storeToRefs(useCounterStore)
// 作为 action 的 increment 可以直接解构 并且会跳过所有的 action 或非响应式 (不是 ref 或 reactive) 的属性
const { cartconterFun } = useCartStore
const { incrementFun } = useCounterStore
/* 
**
*/
</script>

HelloWorld.vue完整代码

<script setup>
defineProps({
  msg: {
    type: String,
    required: true
  }
})
//只需要引入@/store/index
/* 
**pinia模块化使用示例
*/
import { storeToRefs } from 'pinia'
import { storeodules, moduleNameList } from '@/store/index'
console.log(`storeodules, moduleNameList`, storeodules, moduleNameList);
const [useCartStore, useCounterStore] = moduleNameList.map(ele => storeodules[ele]())
console.log(`useCartStore, useCounterStore`, useCartStore, useCounterStore);
//cart、count是响应式的 ref 同时通过插件添加的属性也会被提取为 ref
const { cart } = storeToRefs(useCartStore)
const { count } = storeToRefs(useCounterStore)
// 作为 action 的 increment 可以直接解构 并且会跳过所有的 action 或非响应式 (不是 ref 或 reactive) 的属性
const { cartconterFun } = useCartStore
const { incrementFun } = useCounterStore
/* 
**
*/
</script>

<template>
  <div class="greetings">
    <h1 class="green">{{ msg }}</h1>
    <h3>
      You’ve successfully created a project with
      <a href="https://vitejs.dev/" target="_blank" rel="noopener">Vite</a> +
      <a href="https://vuejs.org/" target="_blank" rel="noopener">Vue 3</a>.
    </h3>
  </div>

  <!-- 以下pinia模块化使用示例 -->
  <div class="TestOutbox">
    <div>
      <h1>Current cart: {{ cart }}</h1>
      <br>
      <button @click="cartconterFun">修改</button>
    </div>
    <hr>
    <div>
      <h1>Current Count: {{ count }}</h1>
      <br>
      <button @click="incrementFun">增加</button>
    </div>
  </div>
</template>

<style lang="scss" scoped>
.greetings {
  h1 {
    font-weight: 500;
    font-size: 2.6rem;
    position: relative;
    top: -10px;
    text-align: center;
  }

  h3 {
    font-size: 1.2rem;
    text-align: center;
  }
}

.TestOutbox {
  margin-top: 60px;
  hr{
    margin: 50px 0;
  }
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/490040.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

辽渤湾海现已加入2024第七届燕窝天然滋补品博览会

参展企业介绍 大连辽渤湾海产品有限公司&#xff0c;是一家主营海参、鲍鱼、海胆等大连海产品的加工和销售的综合型水产企业&#xff0c;拥有国内精良的整条加工流水线&#xff0c;拥有上千平米的现代化加工办公场地的现代化企业。现已发展成为大连海参产品的主导型深加工基地。…

如何清理释放群晖客户端缓存?

任正菲说&#xff1a;企业最大的浪费&#xff0c;是经验的浪费&#xff01; 而一个一个的经验&#xff0c;又都来自企业的每一个工作者。 因此当我们在工作过程中遇到一些问题时&#xff0c;我们就应该下意识的把解决问题的经验沉淀下来&#xff0c;从而可以与大家进行分享。…

软件设计师19--文件管理

软件设计师19--文件管理 考点1&#xff1a;文件相关概念例题&#xff1a; 考点2&#xff1a;树形目录结构&#xff08;绝对路径与相对路径&#xff09;例题&#xff1a; 考点3&#xff1a;位示图例题&#xff1a; 考点4&#xff1a;索引文件索引文件结构例题&#xff1a; 考点1…

武汉星起航:跨境电商行业的领军者,互帮互助共创佳绩

武汉星起航电子商务有限公司&#xff0c;作为跨境电商行业的领军者&#xff0c;以其出色的业绩和卓越的团队实力&#xff0c;在业内赢得了广泛的赞誉。公司自运营团队在亚马逊平台上成功开设了多家店铺&#xff0c;凭借着深耕跨境电商行业多年所积累的经验&#xff0c;取得了令…

[自研开源] 数据集成之分批传输 v0.7

开源地址&#xff1a;gitee | github 详细介绍&#xff1a;MyData 基于 Web API 的数据集成平台 部署文档&#xff1a;用 Docker 部署 MyData 使用手册&#xff1a;MyData 使用手册 试用体验&#xff1a;https://demo.mydata.work 交流Q群&#xff1a;430089673 介绍 本篇基于…

面试笔记——Java集合篇

Java集合框架体系 重点&#xff1a;单列集合——ArrayList、LinkedList&#xff1b;双列集合——HashMap、ConcurrentHashMap。 List相关 数组&#xff08;Array&#xff09; 是一种用连续的内存空间存储相同数据类型数据的线性数据结构。 数组获取其他元素&#xff1a; 为什…

为什么在vite中使用eslint报错‘__dirname‘ is not defined?

问题分析 发生这种情况是因为 ESLint 不知道 vite.config.js 中的代码在 Node.js 中使用&#xff0c;__dirname 未在浏览器中定义&#xff0c;也未在 ES 模块中定义。因此要告诉 ESLint 代码将作为 CommonJS 模块在 Node.js 中运行。 解决方案 请打开 ESLint 配置并在该 env …

关于 boost::asio::strand 初始化 socket、stream、resolver、deadline_timer 对象

在 boost::asio 之中默认情况下&#xff0c;大家使用 io_context 来为这些对象初始化传递的执行者&#xff0c;但我需要这里说明。 对于 boost::asio 构造类似 socket 对象必须构造传递 io_context 是个伪命题&#xff0c;boost::asio 对象并非只允许传递 boost::asio::io_cont…

pyrealsense2获取保存点云

一、第一种实现代码 Python import sys import cv2 import pyrealsense2 as rs import numpy as np import keyboard import open3d as o3d import osif __name__ "__main__":output_folder output_data/os.makedirs(output_folder, exist_okTrue)pipeline rs.p…

git cherry pick merge部分提交

cherry pick merge 指定某次提交 1. git history 选择要从哪个分支merge 2. 找到提交记录,选择cherry pick 3.这个时候就可以直接push了

【面试题】ES文档写入和读取流程详解

前言&#xff1a;在回答这个问题之前我们先要搞清楚一个问题那就是什么是文档&#xff0c;避免不知所云&#xff01; 一、什么是文档&#xff1f; 在Elasticsearch中&#xff0c;文档&#xff08;Document&#xff09;是最基本的信息单元&#xff0c;用于表示和存储数据。文…

数据采集用,集成了主流工业通讯协议

IoTClient 是一个物联网设备通讯协议实现客户端&#xff0c;集成了主流工业通讯协议&#xff0c;包括主流PLC通信读取、ModBus协议、Bacnet协议等。该组件基于.NET Standard 2.0&#xff0c;适用于.NET的跨平台开发&#xff0c;可在Windows、Linux等系统上运行&#xff0c;甚至…

LinkedIn账号为什么被封?被封后如何解决?

近期会有一些小伙伴说自己遇到了帐号无法登录的情况&#xff0c;其实出现领英帐号被封号(被限制登录)主要会有两类情况&#xff0c;今天就给大家分享一下如果被封该如何解决&#xff0c;强烈建议收藏。 在电脑领英官网或者手机领英APP上&#xff0c;输入领英帐号密码点击登录后…

数据结构(五)单链表专题

在开始之前&#xff0c;我先来给大家讲一下顺序表与链表的区别&#xff1a; 它们在堆上存储的差异&#xff1a; 我们可以很容易的知道&#xff0c;循序表是连续的有序的&#xff0c;但链表是杂乱的&#xff0c;它们通过地址彼此联系起来。 1. 链表的概念及结构 概念&#xff1…

【光伏科普】光伏投融资计算的意义

光伏产业&#xff0c;作为清洁能源的重要组成部分&#xff0c;近年来在全球范围内得到了广泛的关注与发展。而在光伏项目的实施过程中&#xff0c;投融资计算显得尤为重要。本文旨在探讨光伏投融资计算的意义&#xff0c;以及它如何影响光伏产业的可持续发展。 首先&#xff0c…

无法找到filesystem头文件

无法找到filesystem头文件 一、前言 这段时间接老板命令&#xff0c;做目标识别模型的嵌入式部署。需要将模型运行环境编译后打包到瑞芯微开发板上运行&#xff0c;在此之前我对原C文件做过修改&#xff0c;为了能实现与厂商提供的数据接口对接。 我在用CMake打包过程中&…

jmeter接口测试及详细步骤以及项目实战教程

在接口测试项目实战中&#xff0c;JMeter是一款非常强大和流行的自动化测试工具&#xff0c;它可以测试各种类型的应用程序&#xff0c;并通过采样和报告来识别性能瓶颈和API的问题。本文将为你提供一个基于实际项目的JMeter接口测试项目实战教程&#xff0c;指导你如何使用JMe…

腾讯VS网易:一场不见终局的游戏未来之战

国内游戏霸主腾讯最近赚足了眼球。 总体上看&#xff0c;腾讯手握“游戏社交”两大王牌&#xff0c;最近发布的财报十分亮眼&#xff0c;其2023年总营收和净利润分别同比增长10%和36%&#xff0c;展现了互联网巨头的强劲活力。 然而巨头亦有焦虑&#xff0c;增值服务营收同比…

数学算法(算法竞赛、蓝桥杯)--分解质因数、唯一分解定理

1、B站视频链接&#xff1a;G07 分解质因数 唯一分解定理 试除法_哔哩哔哩_bilibili 题目链接&#xff1a;质因子分解 - 洛谷 #include <bits/stdc.h> using namespace std;int n; int a[100010];//质因子的个数void decompose(int x){for(int i2;i*i<x;i){//i增加&a…

Fastgpt 无法启动或启动后无法正常使用的讨论(启动失败、用户未注册等问题这里)

FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排&#xff0c;从而实现复杂的问答场景&#xff01; FastGPT是非常实用并且相当厉害的个人知识库AI项目&#xff0c;项目是非常…