最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3?封裝擴展并簡化Vuex在組件中的調(diào)用問題

 更新時間:2023年01月28日 09:14:43   作者:馬丁的車夫  
這篇文章主要介紹了Vue3?封裝擴展并簡化Vuex在組件中的調(diào)用,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

如果你在項目中使用了 vuex模塊化,并且在項目中使用actions中函數(shù)調(diào)用頻率高,推薦了解一下這種方式。

比如下面兩種方式調(diào)用 ,

第一個是直接傳參設(shè)置,

第二個是添加了異步ajax返回內(nèi)容 在回調(diào)到等下我們要封裝的js中的成功回調(diào)里,然后這個成功回調(diào)就會反饋給組件

1.創(chuàng)建文件utils/vueTool.js

import storage from '@/utils/storage.js';
import store from '@/store/index.js';
const { dispatch, state } = store;
/**
 * @vuexFunc 調(diào)用vuex模塊中的 Actions 并異步回調(diào)結(jié)果
 * @param modules {string} 調(diào)用指定的子模塊 如果是全局的可以不傳
 * @param funcName {string} 調(diào)用Actions 函數(shù)名稱
 * @param data  {object} 
 * @param followUp  {string / object} 
 *  {
     data:{},
     followUp:string / object
     function(res){}
    },
 * data:當(dāng)前調(diào)用接口需要的參數(shù),
 * followUp 當(dāng)前接口完成回調(diào)后 繼續(xù)執(zhí)行更新接口的 名稱和參數(shù) 可以是請求地址字符串 可以是對象攜帶參數(shù)
 * followUp:'URL' / followUp:{url:'請求接口地址',query:{參數(shù)}}
 * function回調(diào)函數(shù)
 */
export function vuexFunc(modules = '', funcName = '', data = {}) {
    function send(followUp = '', query = null, lock = null) {
        // 消費憑證
        if (typeof lock === 'number') {
            console.log('已消費:', lock)
            lock = true
        };
        let url = '';
        if (followUp) {
            url = followUp;
        } else {
            if (!modules && typeof modules !== 'boolean') {
                console.error('Actions函數(shù)名稱是必填。');
                return;
            };
            url = `${modules?modules+'/':''}${funcName}`;
        };
        
        // 開發(fā)中使用 校驗當(dāng)前調(diào)用的vuex模塊是否存在 
        if (process.env.NODE_ENV === 'development') {
            let modulesName = followUp ? followUp.split('/')[0] : typeof modules === 'boolean' ? funcName :modules;
            if (storage.getItem('modulesKey').indexOf(modulesName) === -1) {
                console.error(`找不到 ${modulesName} 請檢查!`);
                return;
            };
        };
        let queryData = {}
        if(typeof modules === 'boolean'){
            queryData = data
            
        } else {
            queryData = followUp ? query ? query : {} :data.data && Object.keys(data.data).length?data.data:{}
        }
        dispatch(url, {
            // data: followUp ? query ? query : {} : data.data,
            data: queryData,
            callback(res) {
                // 成功
                if (res !== 'failed') {
                    if (lock) {
                        console.log('停止了')
                        return
                    };
                    if (data.callback) {
                        data.callback(res);
                    };
                    if (data.followUp && typeof data.followUp === 'string') {
                        console.log('開始后續(xù)回調(diào)')
                        send(data.followUp, null, Date.now());
                    } else if (data.followUp && Object.keys(data.followUp).length) {
                        if (!data.followUp.url) {
                            console.error('缺少后續(xù)請求的url');
                            return;
                        };
                        if (!data.followUp.hasOwnProperty('query')) {
                            console.error('query字段 缺少后續(xù)請求的參數(shù),沒有參數(shù)直接傳入 string Url 形參');
                            return;
                        };
                        send(data.followUp.url, data.followUp.query, Date.now())
                    };
                    // 失敗 -1
                } else if (res === 'failed') {
                    if (data.failed) {
                        data.failed(res)
                    } else {
                        console.error('接口請求失敗:'+url)
                    }
                };
            }
        });
    };
    send();
}

/**
 * @getState 獲取vuex中state倉庫
 * @param modules {string} 倉庫名稱 如果是子模塊就傳入子模塊的名稱
 */
export function getState(modules = '') {
    if (!modules) {
        console.error('state倉庫名稱是必填。');
        return;
    };
    return state[modules]
}

2.添加開發(fā)環(huán)境中的模塊驗證

注意:如果你的vue3項目是使用webpack5創(chuàng)建的 那么這里的自動化導(dǎo)入文件 就不能使用,可以去看看我上篇文章中有寫webpack5如何自動化導(dǎo)入模塊

import { createStore } from 'vuex'
import actions from './actions'
import mutations from './mutations'
import storage from '@/utils/storage.js'


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
    }, {}
);

let modulesKey  = '';
if(process.env.NODE_ENV === 'development'){
    let obj = {...actions,...modules};
    for(let key in obj){
        modulesKey+=key+','
    };
    storage.setItem('modulesKey',modulesKey);
};
const store = createStore({
    modules,
    state: {
        name: 'allen',
        modulesKey:storage.getItem('modulesKey') || modulesKey,
    },
    mutations,
    actions,
    getters: {}
})

export default store

3.頁面調(diào)用封裝

actions函數(shù)的調(diào)用

import { vuexFunc, getState } from '@/utils/vueTool';

vuexFunc('子模塊文件昵稱','actions.js中定義的函數(shù)昵稱',{
    data:{接口需要的參數(shù),或者你要設(shè)置到倉庫的值},
    callback(res){ // 請求回調(diào)
            console.log(res)
    }
});
//模式一(調(diào)用全局actions函數(shù))
vuexFunc(false,'setStageCourse',{
    data:query,
    callback(res){
            console.log(res)
    }
});

//模式二(調(diào)用子模塊函數(shù)中的actions函數(shù))
vuexFunc('index','setStageCourse',{
    data:query,
    callback(res){
            console.log(res)
    }
});

// 模式三(調(diào)用完一個actions函數(shù)后立即執(zhí)行另外一個actions函數(shù))
這里調(diào)用完成signIn子模塊中的loginByCode函數(shù)完成回調(diào)后,會立即去讀取followUp的配置 也是對應(yīng)了 子模塊/signIn函數(shù)昵稱去執(zhí)行,followUp允許一個具體的函數(shù)路徑或者一個對象可以配置函數(shù)要設(shè)置的值
vuexFunc('signIn','loginByCode',{
        data:{code:wxcode.value},
        followUp:'index/getConfig',
    callback(res){
        SignType.value = false
        storage.setItem('authorization',res.data.token);
        
    }
});

state倉庫的使用

import {vuexFunc,getState} from '@/utils/vueTool'

// 獲取全局state
let data = getState('全局state對象中定義的對象key')

// 獲取子模塊中的 state
// getState('子模塊昵稱') 獲取到某個子模塊中的state倉庫對象
let data = getState('signIn').SigninType

最后:

這樣既擴展了功能 也不需要原本的vuex 先導(dǎo)入 在解構(gòu) 在調(diào)用,并且對actions的控制和錯誤也做到了顆?;东@,與攔截反饋,在一定程度上提高了開發(fā)過程中的程序調(diào)試。

后來我又思考了一下感覺還能繼續(xù)優(yōu)化,比如像vue2中使用...mapActions 和...mapState 直接返回多個函數(shù)對象,感覺這樣會比較優(yōu)雅,但是在項目中我已經(jīng)開發(fā)過半了 所以就沒有對這個進行重新改造,有興趣的可以試試。

到此這篇關(guān)于Vue3 封裝擴展并簡化Vuex在組件中的調(diào)用的文章就介紹到這了,更多相關(guān)Vue3 封裝擴展內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue前端項目部署的三種方案詳解

    Vue前端項目部署的三種方案詳解

    這篇文章主要介紹了Vue前端項目部署的三種方案,本文通過圖文并茂的形式給大家介紹的非常詳細,需要的朋友可以參考下
    2024-08-08
  • SpringBoot+Vue開發(fā)之Login校驗規(guī)則、實現(xiàn)登錄和重置事件

    SpringBoot+Vue開發(fā)之Login校驗規(guī)則、實現(xiàn)登錄和重置事件

    這篇文章主要介紹了SpringBoot+Vue開發(fā)之Login校驗規(guī)則、實現(xiàn)登錄和重置事件,本文通過圖文實例相結(jié)合給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • 解決Vue警告Write?operation?failed:computed?value?is?readonly

    解決Vue警告Write?operation?failed:computed?value?is?readonl

    這篇文章主要給大家介紹了關(guān)于如何解決Vue警告Write?operation?failed:computed?value?is?readonly的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-03-03
  • vue中$refs的三種用法解讀

    vue中$refs的三種用法解讀

    這篇文章主要介紹了vue中$refs的三種用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • elementplus?card?懸浮菜單的實現(xiàn)

    elementplus?card?懸浮菜單的實現(xiàn)

    本文主要介紹了elementplus?card?懸浮菜單的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • vue3常用的API使用簡介

    vue3常用的API使用簡介

    這篇文章主要介紹了vue3常用的API使用簡介,幫助大家更好的理解和學(xué)習(xí)使用vue,感興趣的朋友可以了解下
    2021-03-03
  • Vue實現(xiàn)路由懶加載的多種方式總結(jié)

    Vue實現(xiàn)路由懶加載的多種方式總結(jié)

    當(dāng)構(gòu)建的項目比較大的時候,懶加載可以分割代碼塊,提高頁面的初始加載效率解決白屏問題,下面是幾種常見vue路由懶加載的方法,感興趣的朋友跟隨小編一起看看吧
    2023-11-11
  • 解決vue中虛擬dom,無法實時更新的問題

    解決vue中虛擬dom,無法實時更新的問題

    今天小編就為大家分享一篇解決vue中虛擬dom,無法實時更新的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • vue語法之拼接字符串的示例代碼

    vue語法之拼接字符串的示例代碼

    本篇文章主要介紹了vue語法之拼接字符串的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • .netcore+vue 實現(xiàn)壓縮文件下載功能

    .netcore+vue 實現(xiàn)壓縮文件下載功能

    這篇文章主要介紹了.netcore+vue 實現(xiàn)壓縮文件下載功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09

最新評論

白银市| 衢州市| 隆安县| 宁化县| 徐闻县| 海淀区| 清原| 淄博市| 民县| 江阴市| 永善县| 镇沅| 武乡县| 德昌县| 河源市| 历史| 锦屏县| 根河市| 扶沟县| 伊宁市| 龙门县| 福泉市| 琼结县| 克东县| 通化市| 汤原县| 弥勒县| 民权县| 屏东县| 内丘县| 读书| 白水县| 长宁县| 馆陶县| 满洲里市| 宁陵县| 白城市| 元朗区| 佛坪县| 蒲江县| 道孚县|