vue 自定義指令自定義圖片占位圖

bwpo0-6i60j.gif

場(chǎng)景

在網(wǎng)速不好時(shí)圖片還沒有加載出來的情況下,先展示一個(gè)默認(rèn)圖片做占位圖(image-default.jpg),當(dāng)圖片加載出錯(cuò)時(shí),展示加載錯(cuò)誤圖片(image-error.jpg)。

image.png


思路

在從img 元素被渲染出來到網(wǎng)絡(luò)請(qǐng)求數(shù)據(jù)(這里指圖片)回來是有一段時(shí)間的,而拿到圖片后掌桩,圖片從開始加載到加載完成也是需要一段時(shí)間的,而這個(gè)時(shí)間段的大小大多取決于你當(dāng)前的寬帶姑食。

第一階段波岛, <img> 標(biāo)簽渲染出來后我們先給 src 賦值默認(rèn)圖片(如上圖的 image-default.jpg),圖片情況返回有兩種情況:
第一種情況是順利拿到圖片音半,把拿到的圖片地址賦值給 src
第二種是如果網(wǎng)速實(shí)在太差盆色,請(qǐng)求超時(shí)灰蛙,就是一直都沒有拿到圖片,此時(shí) src 放的還是一開始賦值的默認(rèn)圖片隔躲。

第二階段摩梧,開始加載圖片,此時(shí)也有兩種情況:
第一種情況是圖片加載成功宣旱,
第二種是圖片地址無效仅父,加載失敗,此時(shí) src 放的還是一開始賦值的默認(rèn)圖片浑吟,這種情況下你可以不做處理笙纤,或者把 src 賦值為一張加載錯(cuò)誤圖片(如上圖的 image-error.jpg)。怎么判斷圖片是否能加載成功组力?可以先自己創(chuàng)建一個(gè)圖片對(duì)象 Image省容,Image 對(duì)象有兩個(gè)方法,圖片加載完成時(shí)觸發(fā)的 image.onload 事件燎字,和圖片加載錯(cuò)誤時(shí)觸發(fā)的 image.onerror 事件腥椒。在這個(gè)兩個(gè)事件中我們可以對(duì)頁面上一開始就渲染出來的 <img> 標(biāo)簽做相應(yīng)的處理。


具體實(shí)現(xiàn):

功能預(yù)想:
把上面的思路套在 vue 指令上候衍。給 img 標(biāo)簽添加指令 v-image 來實(shí)現(xiàn)圖片預(yù)加載笼蛛,其中預(yù)加載圖片可不傳(有默認(rèn)值),圖片加載錯(cuò)誤時(shí)占位圖可不傳(有默認(rèn)值)蛉鹿。

用法:

 <img class="cover" v-image="cover">

// or
 <img class="cover" v-image="cover" :default-img=""  :error-img="">

``
其中 default-img 和 error-img 可選滨砍,cover 是請(qǐng)求回來真正要展示的圖片,必傳妖异。
在下面的實(shí)現(xiàn)方法里惋戏,占位圖有三種,
一種是 “系統(tǒng)默認(rèn)占位圖”他膳,即如果直接 <img v-image="cover"> 使用响逢,指令內(nèi)會(huì)默認(rèn)加載一張占位圖。那么圖片未加載完時(shí)或者加載錯(cuò)誤時(shí)用的都是這張圖片
一種是 “指定默認(rèn)占位圖”矩乐,用法 <img v-image="cover" :default-img=""> 那么圖片未加載完時(shí)用的是這張圖片龄句。
一種是 “指定加載錯(cuò)誤占位圖” 回论,用法 <img v-image="cover" :error-img=""> 那么圖片加載錯(cuò)誤時(shí)用的是這張圖片散罕。

具體實(shí)現(xiàn)代碼:

/**
 * @description
 * @param {string} v-image (yes) 圖片地址
 * @param {string} default-img (no) 預(yù)加載占位圖
 * @param {string} error-img (no)   加載錯(cuò)誤占位圖
 * @example
 *         <img v-image="cover" :default-img=""  :error-img="">
 */

/**
 * @description 檢測(cè)圖片地址是否有效
 * @param url
 */
const imageIsExist = function(url) {
    return new Promise((resolve, reject) => {
        const image = new Image()

        image.onload = function() { // 圖片地址有效
            if (this.complete === true) {
                resolve(image)
            }
        }
        image.onerror = function() { // 圖片加載失敗
            reject('could not load image')
        }
        image.src = url
    })
}

export default function(el, binding) {

    let placeholderImage = require('@/common/images/image-default.jpg') // 默認(rèn)占位圖
    let defaultImage = el.getAttribute('default-img') // 外部傳入的默認(rèn)占位圖
    let errorImage = el.getAttribute('error-img')       // 外部傳入的錯(cuò)誤占位圖

    el.setAttribute('src', defaultImage || placeholderImage) 
    // el.setAttribute('class', 'img-objectfix-contain') 

    let realImageUrl = binding.value // 獲取圖片地址( v-image="cover" 的 cover)
    if (realImageUrl) {
        imageIsExist(realImageUrl)
            .then(() => {
                el.setAttribute('src', realImageUrl)
            })
            .catch(() => {
                el.setAttribute('src', errorImage || placeholderImage)
            })
    }
}





參考


promise image.onload
vue - 自定義指令

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市傀蓉,隨后出現(xiàn)的幾起案子欧漱,更是在濱河造成了極大的恐慌,老刑警劉巖葬燎,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件误甚,死亡現(xiàn)場(chǎng)離奇詭異缚甩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)窑邦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門擅威,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冈钦,你說我怎么就攤上這事郊丛。” “怎么了瞧筛?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵厉熟,是天一觀的道長。 經(jīng)常有香客問我较幌,道長揍瑟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任乍炉,我火速辦了婚禮绢片,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘恩急。我一直安慰自己杉畜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布衷恭。 她就那樣靜靜地躺著此叠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪随珠。 梳的紋絲不亂的頭發(fā)上灭袁,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音窗看,去河邊找鬼茸歧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛显沈,可吹牛的內(nèi)容都是我干的软瞎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拉讯,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼涤浇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起魔慷,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤只锭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后院尔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜻展,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喉誊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纵顾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伍茄。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖施逾,靈堂內(nèi)的尸體忽然破棺而出幻林,到底是詐尸還是另有隱情,我是刑警寧澤音念,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布沪饺,位于F島的核電站,受9級(jí)特大地震影響闷愤,放射性物質(zhì)發(fā)生泄漏整葡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一讥脐、第九天 我趴在偏房一處隱蔽的房頂上張望遭居。 院中可真熱鬧,春花似錦旬渠、人聲如沸俱萍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枪蘑。三九已至,卻和暖如春岖免,著一層夾襖步出監(jiān)牢的瞬間岳颇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國打工颅湘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留话侧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓闯参,卻偏偏與公主長得像瞻鹏,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鹿寨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容