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

Vue的指令中實現(xiàn)傳遞更多參數(shù)

 更新時間:2022年05月30日 11:37:31   作者:懶人Ethan  
這篇文章主要介紹了Vue的指令中實現(xiàn)傳遞更多參數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

概要

我們在使用Vue的開發(fā)項目中,經(jīng)常用自定義指令(directive)來封裝一系列的DOM操作,這樣做非常方便。一般來說,指令是使用動態(tài)指令參數(shù)來獲取App中的數(shù)據(jù)。

但是有些時候,自定義指令需要更多的數(shù)據(jù)來完成更復(fù)雜的功能,例如在指令中調(diào)用當(dāng)前App實例的nextTick方法,以確保所有DOM元素加載完成,再進行DOM操作。還有一些情況,我們需要將一些全局配置參數(shù)傳遞給指令,已有的參數(shù)專遞方式,顯然無法滿足這些需求。

本文介紹一種擴展指令參數(shù)的方法,使其可以接收更多參數(shù)。該方法在Vue 2.0和 Vue 3.0中,都可以正常使用。

基本原理

本文介紹的指令擴展方法,主要以閉包為基礎(chǔ),并且使用了一些函數(shù)參數(shù)柯里化的方式來管理多個參數(shù)的傳遞過程。

我們以Vue2.0的指令定義方式為例,說明基本原理。本文所使用的指令定義方式,都已基于插件化的定義方式,在main.js中,通過use方法使用。

示例代碼如下:

const myDirective = {
? ? install(app,options){
? ? ? ? app.directive("img-load", {
? ? ? ? ? ? bind:function(el,binding,vnode){ },
?? ??? ? ? ?inserted:function(el,binding,vnode){ },
?? ??? ? ? ?update:function(el,binding,vnode){ },
?? ??? ? ? ?componentUpdated:function(el,binding,vnode){ },
?? ??? ? ? ?unbind:function(el,binding,vnode){ },
? ? ? ? });
? ? }
};
export default myDirective ;

按照上述標(biāo)準(zhǔn)的指令定義方式,無論使用哪個鉤子函數(shù),我們只能傳遞三個參數(shù),指令所綁定的DOM元素,指令接收的APP中綁定參數(shù)和虛擬節(jié)點。

基于閉包的擴展方案

指令的鉤子函數(shù)參數(shù)已經(jīng)固定,我們無法修改。但是我們可以通過閉包設(shè)置鉤子函數(shù)的作用域,讓閉包函數(shù)來接收更多參數(shù)。

代碼如下: 

export default function getMyDirective(Vue) {
? ? return class MyDirective{
? ? ? ? constructor(options) {
? ? ? ? ? ? this.options = options;
? ? ? ? ? ? this.bindDirective= this.bindDirective.bind(this);
? ? ? ? }
? ? ? ? bindDirective(el, bindings) { ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? }
? ? }
}
const myDirective = {
? ? install(app,options){
? ? ??? ?const DirectiveClass = getMyDirective(app) ;
? ? ? ? var myDirective = new DirectiveClass(options);
? ? ? ? app.directive("my-dirctive", {
? ? ? ? ? ? bind:myDirective.bindDirective
? ? ? ? });
? ? }
};
  • 使用閉包函getMyDirective來包裹鉤子函數(shù)bindDirective
  • 閉包函數(shù)是用戶自定義函數(shù),我們可以設(shè)置任意多個參數(shù)
  • 在閉包函數(shù)中定義類來封裝指令的所有操作,構(gòu)造方法也可以接收參數(shù),從而將多個參數(shù)柯里化分割。
  • 通過bind方法強行將指令鉤子函數(shù)綁定的bindDirective方法的this限定為MyDirective的實例,也就是說,bindDirective方法可以通過this訪問更多的數(shù)據(jù)。

JS中函數(shù)具有獨立作用域,所以指令的綁定方法bindDirective在執(zhí)行過程中,可以在不受任何外界其他代碼的干擾下,使用閉包函數(shù)傳遞的參數(shù)。

實例和代碼實現(xiàn)

本文以一個圖片自動加載的指令為例,介紹自定義指令的參數(shù)擴展方式。

自定義指令的基本功能是根據(jù)圖片的URL地址加載并顯示圖片,具體實現(xiàn)包括:

  • 通過指令動態(tài)參數(shù)獲取圖片地址
  • 首先在頁面中顯示一個正在加載的圖片
  • 加載指定地址圖片,如果加載成功,正常顯示
  • 加載失敗,顯示一張加載出錯的圖片

本文以自頂向下的方式來介紹該實例的代碼實現(xiàn)

Main.js中將指令對應(yīng)的插件全局化

使用use方法,在全局定義插件ImageLoad,該插件主要是功能是在全局定義一個圖片加載指令,為該指令接收一個全局配置,即加載中圖片地址和加載失敗的圖片地址。

Vue.use.use(ImageLoad, {
? loading: "http://localhost:4000/images/loading.gif",
? error: "http://localhost:4000/images/error.jpeg",
});

ImageLoad插件定義

ImageLoad插件和其他插件一樣,既然要通過use使用,所以要定義install方法,install方法的第一個參數(shù)是當(dāng)前App實例,第二個則是指令的全局配置。

import getImageLoad from './getImageLoad'
const ImageLoad = {
? ? install(app,options){
? ? ? ? const ImgClass = getImageLoad(app) ;
? ? ? ? var loadImage = new ImgClass(options);
? ? ? ? app.directive("img-load", {
? ? ? ? ? ? bind: loadImage.bindImage
? ? ? ? });
? ? }
};
export default ImageLoad;
  • install方法中,首先通過調(diào)用getImageLoad方法,獲取加載圖片的管理類,傳入當(dāng)前App實例。
  • 實例化圖片加載管理類的對象loadImage ,傳入圖片加載的全局配置。
  • 定義自定義指令v-img-load,該指定的bind鉤子方法指向loadImage中的bindImage方法。
  • bindImage方法的this是指向loadImage對象,因此可以使用到App實例,指令全局配置,loadImage對象內(nèi)的數(shù)據(jù)。

圖片加載管理類的定義

ImageLoadManagement定義了v-img-load指令的全部實現(xiàn)。

export default function getImageLoad(Vue) {
? ? return class ImageLoadManagement {
? ? ? ? constructor(options) {
? ? ? ? ? ? this.options = options;
? ? ? ? ? ? this.bindImage = this.bindImage.bind(this);
? ? ? ? ? ? this.renderImage = this.renderImage.bind(this);
? ? ? ? }
? ? ? ? bindImage(el, bindings) {
? ? ? ? ? ? const self = this;
? ? ? ? ? ? Vue.nextTick(function(){
? ? ? ? ? ? ? ? const src = bindings.value;
? ? ? ? ? ? ? ? self.renderImage('loading', src, el);
? ? ? ? ? ? ? ? self.loadImage(src).then(
? ? ? ? ? ? ? ? ? ? () => self.renderImage('', src, el),
? ? ? ? ? ? ? ? ? ? () => self.renderImage('error', src, el),
? ? ? ? ? ? ? ? );
? ? ? ? ? ? });
? ? ? ? ? ??
? ? ? ? }
? ? ? ? loadImage(src) {
? ? ? ? ? ? return new Promise((resolve, reject) => {
? ? ? ? ? ? ? ? const img = new Image();
? ? ? ? ? ? ? ? img.src = src;
? ? ? ? ? ? ? ? img.onload = resolve;
? ? ? ? ? ? ? ? img.onerror = reject;
? ? ? ? ? ? });
? ? ? ? }
? ? ? ? renderImage(type, src, el) {
? ? ? ? ? ? let _src;
? ? ? ? ? ? const {
? ? ? ? ? ? ? ? error,
? ? ? ? ? ? ? ? loading
? ? ? ? ? ? } = this.options;
? ? ? ? ? ? switch (type) {
? ? ? ? ? ? ? ? case 'loading':
? ? ? ? ? ? ? ? ? ? _src = loading;
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? case 'error':
? ? ? ? ? ? ? ? ? ? _src = error;
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? default:
? ? ? ? ? ? ? ? ? ? _src = src;
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? ? ? el.setAttribute("src", _src);
? ? ? ? }
? ? }
}

為了避免參數(shù)過多,所以采用柯里化的方法,對參數(shù)進行了分割:

  • 在閉包函數(shù)getImageLoad中,定義了全局App實例參數(shù);
  • ImageLoadManagement 類的構(gòu)造方法中定義了圖片加載指令需要的全局配置參數(shù)。
  • class 作為function的語法糖使用,其本質(zhì)來時function,從而實現(xiàn)獨立作用域。
  • bindImage方法中可以直接使用App實例的nextTick,無論該指令在父組件還是子組件中使用,都可以保證在指令中代碼執(zhí)行時,所有DOM元素加載完成。
  • loadImage方法用于檢查指定URL的圖片是否存在,如果存在則顯示具體圖片,否則則顯示加載失敗的圖片。
  • renderImage方法用于設(shè)置指令綁定的Img元素的圖片地址,圖片的實際地址可以通過bindings參數(shù)的value屬性獲取。

通過上述方法,我們不僅擴展了指令的參數(shù),使其可以支持更復(fù)雜的業(yè)務(wù)邏輯。

更重要的是。我們實現(xiàn)了指令的定義和實現(xiàn)邏輯的解耦,完全不再需要將所有的指令實現(xiàn)邏輯全部放在指令的注冊方法中。通過ImageLoadManagement 的定義,將所有的指令實現(xiàn)邏輯都內(nèi)聚在其中。

Vue 3.0的實現(xiàn)

Vue 3.0中,指令參數(shù)的擴展方法思路與2.0一致,只是因為Vue 3.0中指令的鉤子函數(shù)名稱與2.0不一致,造成一些區(qū)別。

具體代碼如下:

import getImageLoad from './getImageLoad'
const ImageLoad = {
    install(app,options){
        const ImgClass = getImageLoad(options) ;
        var loadImage = new ImgClass();
        app.directive("img-load", {
            mounted: loadImage.bindImage
        });
    }
};
export default ImageLoad;
export default function getImageLoad(options) {
    return class ImageLoadManagement {
        constructor() {
            this.options = options;
            this.bindImage = this.bindImage.bind(this);
            this.renderImage = this.renderImage.bind(this);
        }
        bindImage(el, bindings) {
            const src = bindings.value;
            this.renderImage('loading', src, el);
            this.loadImage(src).then(
                () => this.renderImage('', src, el),
                () => this.renderImage('error', src, el),
            );
        }
        loadImage(src) {
            return new Promise((resolve, reject) => {
                const img = new Image();
                img.src = src;
                img.onload = resolve;
                img.onerror = reject;
            });
        }
        renderImage(type, src, el) {
            let _src;
            const {
                error,
                loading
            } = this.options;
            switch (type) {
                case 'loading':
                    _src = loading;
                    break;
                case 'error':
                    _src = error;
                    break;
                default:
                    _src = src;
                    break;
            }
            el.setAttribute("src", _src);
        }
    }
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue封裝圖片滑塊驗證組件的方法

    vue封裝圖片滑塊驗證組件的方法

    這篇文章主要為大家詳細(xì)介紹了vue封裝圖片滑塊驗證組件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • vue2利用Bus.js如何實現(xiàn)非父子組件通信詳解

    vue2利用Bus.js如何實現(xiàn)非父子組件通信詳解

    這篇文章主要給大家介紹了關(guān)于vue2利用Bus.js如何實現(xiàn)非父子組件通信的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • Vue?3.0?v-for中的Ref數(shù)組用法小結(jié)

    Vue?3.0?v-for中的Ref數(shù)組用法小結(jié)

    在?Vue?2?中,在?v-for?里使用的?ref?attribute會用ref?數(shù)組填充相應(yīng)的?$refs?property,本文給大家介紹Vue?3.0?v-for中的Ref數(shù)組的相關(guān)知識,感興趣的朋友一起看看吧
    2023-12-12
  • Vue正則表達(dá)式限制input的輸入范圍

    Vue正則表達(dá)式限制input的輸入范圍

    我們有時需要限制文本框輸入內(nèi)容的類型,本節(jié)分享下正則表達(dá)式限制文本框只能輸入數(shù)字、小數(shù)點、英文字母、漢字等代碼,感興趣的朋友跟隨小編一起看看吧
    2023-12-12
  • Vue點擊切換Class變化,實現(xiàn)Active當(dāng)前樣式操作

    Vue點擊切換Class變化,實現(xiàn)Active當(dāng)前樣式操作

    這篇文章主要介紹了Vue點擊切換Class變化,實現(xiàn)Active當(dāng)前樣式操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • vue中computed順序、watch順序、響應(yīng)次數(shù)使用

    vue中computed順序、watch順序、響應(yīng)次數(shù)使用

    這篇文章主要介紹了vue中computed順序、watch順序、響應(yīng)次數(shù)使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 為什么要使用Vuex的介紹

    為什么要使用Vuex的介紹

    今天小編就為大家分享一篇關(guān)于為什么要使用Vuex的介紹,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • vue實現(xiàn)圖片下載點擊按鈕彈出本地窗口選擇自定義保存路徑功能

    vue實現(xiàn)圖片下載點擊按鈕彈出本地窗口選擇自定義保存路徑功能

    vue前端實現(xiàn)前端下載,并實現(xiàn)點擊按鈕彈出本地窗口,選擇自定義保存路徑,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-12-12
  • vue項目中的支付功能實現(xiàn)(微信支付和支付寶支付)

    vue項目中的支付功能實現(xiàn)(微信支付和支付寶支付)

    本文主要介紹了vue項目中的支付功能實現(xiàn)(微信支付和支付寶支付),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Vue自定義指令使用方法詳解

    Vue自定義指令使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Vue自定義指令的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評論

鲁甸县| 颍上县| 德庆县| 泰和县| 榕江县| 太白县| 信丰县| 金华市| 谢通门县| 高碑店市| 郯城县| 莎车县| 淮北市| 丰顺县| 师宗县| 璧山县| 贵溪市| 托里县| 荆州市| 哈密市| 贺州市| 杭锦旗| 长泰县| 吉木乃县| 尉氏县| 正定县| 宁陵县| 福海县| 贺兰县| 玉山县| 普安县| 凤冈县| 磴口县| 开阳县| 巴彦淖尔市| 泌阳县| 浦北县| 从化市| 汾阳市| 昭通市| 琼海市|