elementui實(shí)現(xiàn)預(yù)覽圖片組件二次封裝
起因
在elementui組件庫(kù)中,el-image組件有個(gè)預(yù)覽圖片功能,比較簡(jiǎn)潔,但是和圖片綁定在一起,我們只想要一個(gè)單純的預(yù)覽組件,傳遞一個(gè)圖片,通過(guò)事件方式,顯示大圖
分析
通過(guò)查看elementui的代碼,發(fā)現(xiàn)在image(el-image組件)目錄中里面有一個(gè)image-viewer組件, el-image組件的預(yù)覽功能也是通過(guò)這一個(gè)組件實(shí)現(xiàn)的,只是官方?jīng)]有把這個(gè)組件單獨(dú)暴露出來(lái)

這里就比較簡(jiǎn)單了,我們可以使用手動(dòng)導(dǎo)入組件的方式,引入image-viewer組件
image-viewer組件二次封裝
這里大概做了三件事
- 組件方式導(dǎo)入element的image-viewer組件
- 使用$attrs和$listeners把上層的屬性和方法,原封不動(dòng)傳遞給image-viewer組件,不用手動(dòng)處理屬性和方法,除非添加額外的功能
- 修改關(guān)閉按鈕的樣式
<template>
<div>
<el-image-viewer
v-bind="$attrs"
v-on="$listeners"
/>
</div>
</template>
<script>
// 手動(dòng)導(dǎo)入圖片預(yù)覽組件
import ElImageViewer from 'element-ui/packages/image/src/image-viewer'
export default {
name: 'ImagePreview',
components: { ElImageViewer }
}
</script>
<style lang="scss" scoped>
::v-deep .el-image-viewer__btn.el-image-viewer__close {
color: #fff;
}
</style>
使用
<template>
<div>
<el-button type="primary" @click="handlePictureCardPreview"
>大圖預(yù)覽</el-button
>
<image-preview
v-if="dialogVisible"
:on-close="
() => {
dialogVisible = false;
}
"
:url-list="[dialogImageUrl]"
/>
</div>
</template>
<script>
import ImagePreview from "@/components/ImagePreview";
export default {
components: {
ImagePreview,
},
data() {
return {
imageUrl:
"https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1483731740,4186543320&fm=26&gp=0.jpg",
dialogImageUrl: "",
dialogVisible: false,
};
},
methods: {
// 預(yù)覽
handlePictureCardPreview() {
this.dialogImageUrl = this.imageUrl;
this.dialogVisible = true;
}
},
};
</script>
優(yōu)化:點(diǎn)擊mask遮罩層關(guān)閉圖片預(yù)覽
上面封裝以后,可以很簡(jiǎn)單使用圖片預(yù)覽,美中不足的是,點(diǎn)擊遮罩層,無(wú)法關(guān)閉大圖預(yù)覽,只能點(diǎn)擊右上角關(guān)閉按鈕,才會(huì)關(guān)閉預(yù)覽,使用上不太方便
分析
在查看image-viewer組件的源碼發(fā)現(xiàn),關(guān)閉按鈕綁定hide方法,用于關(guān)閉預(yù)覽的,但是遮罩層沒(méi)有綁定任何方法,遮罩層也沒(méi)有對(duì)外暴露任何方法調(diào)用,難受~

解決方法
- 先獲取image-viewer組件
- 隨后獲取到遮罩層元素,給遮罩層綁定一個(gè)方法,點(diǎn)擊時(shí)候,就調(diào)用image-viewer組件里的hdie方法,達(dá)到關(guān)閉的目的
- 在卸載組件的時(shí)候,移除之前給遮罩層綁定的方法
- 點(diǎn)擊遮罩關(guān)閉預(yù)覽,對(duì)外暴露一個(gè)標(biāo)志,控制是否點(diǎn)擊遮罩關(guān)閉預(yù)覽
完整代碼如下:
<template>
<div>
<el-image-viewer
ref="elImageViewer"
v-bind="$attrs"
v-on="$listeners"
/>
</div>
</template>
<script>
import ElImageViewer from 'element-ui/packages/image/src/image-viewer'
export default {
name: 'ImagePreview',
components: { ElImageViewer },
props: {
// 點(diǎn)擊mask是否隱藏大圖
maskhide: {
type: Boolean,
default: true
}
},
mounted() {
if (this.maskhide) {
this.addHideToMask()
}
},
methods: {
addHideToMask() {
this.$viewer = this.$refs.elImageViewer
if (this.$viewer) {
// 獲取遮罩層元素
const mask = this.$viewer.$el.querySelector('.el-image-viewer__mask')
if (mask) {
// 遮罩層增加點(diǎn)擊事件,關(guān)閉預(yù)覽
mask.addEventListener('click', this.hide)
// hook卸載事件,移除之前添加在mask元素的事件
this.$once('hook:beforeMount', () => {
mask && mask.removeEventListener('click', this.hide)
})
}
}
},
hide() {
this.$viewer && this.$viewer.hide()
}
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-image-viewer__btn.el-image-viewer__close {
color: #fff;
}
</style>
查看在線(xiàn)示例
以上就是elementui實(shí)現(xiàn)預(yù)覽圖片組件二次封裝的詳細(xì)內(nèi)容,更多關(guān)于elementui 預(yù)覽圖片組件二次封裝的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
關(guān)于vue設(shè)置環(huán)境變量全流程
這篇文章主要介紹了關(guān)于vue設(shè)置環(huán)境變量全流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Vue中對(duì)watch的理解(關(guān)鍵是immediate和deep屬性)
watch偵聽(tīng)器,是Vue實(shí)例的一個(gè)屬性,是用來(lái)響應(yīng)數(shù)據(jù)的變化,需要在數(shù)據(jù)變化時(shí)執(zhí)行異步或開(kāi)銷(xiāo)較大的操作時(shí),這個(gè)方式是最有用的,這篇文章主要介紹了Vue中對(duì)watch的理解,需要的朋友可以參考下2022-11-11
vue 項(xiàng)目打包通過(guò)命令修改 vue-router 模式 修改 API 接口前綴
這篇文章主要介紹了vue 項(xiàng)目打包通過(guò)命令修改 vue-router 模式 修改 API 接口前綴的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-06-06
解決element-ui table設(shè)置列fixed時(shí)X軸滾動(dòng)條無(wú)法拖動(dòng)問(wèn)題
這篇文章主要介紹了解決element-ui table設(shè)置列fixed時(shí)X軸滾動(dòng)條無(wú)法拖動(dòng)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
如何寫(xiě)好一個(gè)vue組件,老夫的一年經(jīng)驗(yàn)全在這了(推薦)
這篇文章主要介紹了如何寫(xiě)好一個(gè)vue組件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
基于Vue實(shí)現(xiàn)樹(shù)形穿梭框的示例代碼
這篇文章主要為大家介紹了如何利用Vue實(shí)現(xiàn)一個(gè)樹(shù)形穿梭框,elementUI和ant-d組件庫(kù)的穿梭框組件效果都不是很好,所以本文將利用一個(gè)新的插件來(lái)實(shí)現(xiàn),需要的可以參考一下2022-04-04
vue中el-table前端如何導(dǎo)出excel數(shù)據(jù)表格
這篇文章主要介紹了vue中el-table前端如何導(dǎo)出excel數(shù)據(jù)表格,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07
vue如何導(dǎo)出文件流獲取附件名稱(chēng)并下載(在response.headers里解析filename導(dǎo)出)
這篇文章主要介紹了vue如何導(dǎo)出文件流獲取附件名稱(chēng)并下載(在response.headers里解析filename導(dǎo)出),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

