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>
查看在線示例
以上就是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-03Vue中對(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-11vue 項(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-04vue中el-table前端如何導(dǎo)出excel數(shù)據(jù)表格
這篇文章主要介紹了vue中el-table前端如何導(dǎo)出excel數(shù)據(jù)表格,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07vue如何導(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