VUE3 全局共用數據方案之三 Vuex企業級模塊化設計(詳細流程)

来源:https://www.cnblogs.com/Allen-project/archive/2022/12/31/16953739.html
-Advertisement-
Play Games

Vue3,webpack,vite 通用 適用於中大型項目中 1.安裝vuex npm i vuex 2.創建倉庫與文件結構(核心) 一,創建入口 在src目錄下創建store文件夾,store文件夾下創建 下麵文件結構 actions.js import * as type from './mut ...


Vue3,webpack,vite 通用

適用於中大型項目中

1.安裝vuex

npm i vuex

 

2.創建倉庫與文件結構(核心)

一,創建入口

在src目錄下創建store文件夾,store文件夾下創建 下麵文件結構

 

 

 

 actions.js

import * as type from './mutation-types' // 設置 state倉庫裡面的時候狀態 起到命名規範和防止命名衝突的問題
import apiService from '@/api/signIn' // 請求配置的 api 
// 這個文件主要是添加vuex全局方法 處理非同步請求
export default {
    order_list({ commit, dispatch }, params) {
        apiService['order_list'](params.data).then(res => {
            if (params.callback) {
                params.callback(res)
            }
        })
    },
    // 更新啟動頁面
    SetStartImg({ commit, dispatch },params) {
        commit(type.NAVBAR_BG, params)
    },
}

mutations.js

更新state

import * as type from './mutation-types'
import storage from '@/utils/storage.js'

export default {
    [type.NAVBAR_BG](state, val) {
        // 更新用戶當前定位 儲存本地
        storage.setItem('user-location', val);
        //在更新數據
        state[type.NAVBAR_BG] = val
    },
}

mutation-types.js

解決命名規範和衝突

const NAVBAR_BG = 'navbarBg'

export {
    
    NAVBAR_BG,
}

src/api/signIn.js

這裡主要是 所有請求後端的api封裝  request.js 就是 axios 你們更具自己的業務 就自行封裝了

import request from '@/utils/request'

const apiService = {
   order_list: function(data) {
        return request({ url: 'api/wxMiniAuth/loginByCode', method: 'GET', data,showLoading:true })
    },
}


export default apiService

index.js

函數彙總導入 ,講上面我們創建的文件進行導入

註意:變數 modulesFiles,modules 使用的是vite腳手架框架中的 自動化導入子模塊modules文件

如果你使用的是webpack5創建的Vue3 就打開裡面的另外一個註釋進行使用 

自動化導入的好處是 後期在創建子模塊的時候 不在需要在index.js 文件進行每個單獨的import導入了 

只需要創建 對應的子模塊文件結構和代碼就可以了

 

import { createStore } from 'vuex'
import actions from './actions'
import mutations from './mutations'


// vite 自動化導入文件函數
const modulesFiles = import.meta.glob('./modules/*/index.js', { eager: true });
const modules = Object.keys(modulesFiles).reduce(
    (modules, path) => {
        const moduleName = path.replace(/^\.\/(.*)\.\w+$/, '$1')
        modules[moduleName.split('/')[1]] = modulesFiles[path]?.default
        return modules
    }, {}
);

// webpack5 自動化導入文件函數
// const modulesFiles = require.context('./modules', true, /index.js$/)
// const modules = modulesFiles.keys().reduce((modules, modulePath) => {
//     const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1');
//     const value = modulesFiles(modulePath);
//     modules[moduleName.split('/')[0]] = value.default
//     return modules;
// }, {});

const store = createStore({
    modules,
    state: {
        name: 'allen'
    },

    mutations,

    actions,

    getters: {}
})

export default store
View Code

 

二,創建vuex子模塊

每個子模塊都創建一個文件夾 ,註意這個文件夾的名稱最好和你要開發的模塊名稱對應上 因為我們在使用到子模塊的內容和函數的時候 會去用文件夾的名稱作為對象的key去查找調用

 

 

 創建登錄子模塊 截圖中的其他3個文件都與上面的創建方式結構相同所以這裡我只說 index.js

import actions from './actions'
import mutations from './mutations'
const state = {
    userData:storage.getItem('userData') || null,
    SigninType:false // 是否登錄
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

一個模塊化的子模塊就創建完畢

比如我使用 vue2按照這種方式定義一個子模塊 文件夾叫 signIn 在頁面上使用actions非同步 和讀取子模塊中的 state的時候就是這樣的

import { mapActions, mapState } from 'vuex'
...mapState('signIn',['logonType']) // 讀取子模塊signIn中定義的 state ...mapActions('signIn', ['setLogin', 'outUserinfo']), // 讀取子模塊中 setLogin非同步

以上是vue2的使用子模塊的方法

在vue3 中使用

import { ref, reactive} from "vue";
import { useStore } from "vuex"; const { dispatch, state }
= useStore(); // dispatch('子模塊文件名稱/對應子模塊的非同步函數名稱') dispatch("signIn/bindPhone", { data: { ivStr: e.detail.iv, encryptedData: e.detail.encryptedData }, callback(res) { // console.log('綁定成功',res) dispatch("signIn/getMember"); } });

// state.子模塊文件名稱(state).key console.log(
state.index)

 

 

2.main.js註冊

最後全部創建完成後記得不要忘記了 在main.js進行導入註冊

import store from '@/store/index.js'
app.use(store)

 

最後 整個項目使用vuex模塊化後 所有的請求api 都在actions 並且還可以寫一些公共方法在全局和局部中 進行邏輯調用

並且對登錄流程狀態管理就簡單了,並且在頁面 只需要導入vuex 就可以對模塊與模塊之間的邏輯進行復用 對整個項目的邏輯進行簡單快速的閉環

且易於維護,減少頁面複雜代碼,並且初步框架搭建完成後 後續只需要手動添加子模塊 進行擴展。

 

最後建議可以對vuex的調用在進行一個簡單的封裝,因為在vue3 使用vuex 需要導入然後解構,不像vue2 只需要導入後使用this 就可以訪問到,當前模塊化設計適用於中大型項目中。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 今天給大家介紹的是Python爬蟲批量下載音樂飆升榜並保存本地,在這裡給需要的小伙伴們代碼,並且給出一點小心得。 首先是爬取之前應該儘可能偽裝成瀏覽器而不被識別出來是爬蟲,基本的是加請求頭,但是這樣的純文本數據爬取的人會很多,所以我們需要考慮更換代理IP和隨機更換請求頭的方式來對音樂飆升榜進行 ...
  • 數據類型 | 類型 | 用法 | | : : | : : | | BYTE | 8位無符號整數,B代表位元組 | | SBYTE | 8位有符號整數,S代表有符號 | | WORD | 16位無符號整數 | | SWORD | 16位有符號整數 | | DWORD | 32位無符號整數,D代表雙(字) ...
  • 故障說明 MAUI項目是日常使用的項目,一直都好好的 某一天修改了幾行代碼後,突然項目無法編譯了,提示NU1105錯誤 從Git重新拉取一份之前的代碼編譯也是同樣的錯誤,經過半天的查閱,嘗試了幾種方案都沒有效果 刪除obj/project.assets.json 刪除obj 刪除.vs 修複Visu ...
  • 設置USB啟動 當前環境使用的樹莓派版本為:Raspberry Pi 3B,並且已經在SD卡中燒錄系統; 1.使用SD卡燒錄Raspberry Pi OS。 可以只使用Raspberry Pi OS Lite,無桌面環境; 2.Raspberry Pi啟動進入操作系統中後,更新系統環境: sudo ...
  • 一:背景 1. 講故事 相信有很多朋友在學習 SQLSERVER 的時候都聽說過這句話,但大多都是記憶為主,最近在研究 SQLSERVER,所以我們從 底層存儲 的角度來深入理解下。 二:理解數據頁 1. 數據頁的組織 在前面的文章中我也說過,一個 數據頁 是 8k 大小,那這 8k 是如何組織的呢 ...
  • ​ 1、需求描述 最近碰到了一個需求,是要統計各個團隊的員工的銷售金額,然後一級一級向上彙總。 ​編輯 架構團隊樹是類似於這種樣子的,需要先算出每個員工的銷售金額,然後彙總成上一級的團隊金額,然後各個團隊的銷售總金額再往上彙總成一個區域的銷售金額,然後各個區域的金額再往上彙總成總公司的金額。當然我工 ...
  • 1 mysql 報錯解決mysql> grant all on *.* to "dba"@"%" identified by "mysql123";ERROR 1819 (HY000): Your password does not satisfy the current policy requir ...
  • 開啟掘金成長之旅!這是我參與「掘金日新計劃 · 12 月更文挑戰」的第3天,點擊查看活動詳情 如果你正需要處理Flutter異常捕獲,那麼恭喜你,找對地了,這裡從根源上給你準備了Flutter異常捕獲需要是所有知識和原理,讓你更深刻認識Flutter Zone概念。 Zone是什麼 /// A zo ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...