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

使用vue3指令封裝一個(gè)圖片預(yù)覽功能

 更新時(shí)間:2024年01月18日 15:36:35   作者:前端Ah  
這篇文章主要為大家詳細(xì)介紹了如何使用?vue3?指令封裝一個(gè)后臺(tái)管理系統(tǒng)圖片預(yù)覽功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

最近公司搭建了一個(gè)新的 vue3 項(xiàng)目,因?yàn)轫?xiàng)目中有很多模塊用到了圖片預(yù)覽功能,項(xiàng)目的 ui 框架用的是element-plus,框架自帶 el-image 組件里面帶了圖片預(yù)覽功能,但是當(dāng)時(shí)我不想用這個(gè)組件,所以就借鑒了它里面預(yù)覽圖片組件的代碼。

復(fù)習(xí)vue3指令的寫法

官方指令文檔

簡(jiǎn)單的例子

<div v-color="red"> 我是紅色的文字</div>
app.directive('color', (el, binding) => {
  // 這會(huì)在 `mounted` 和 `updated` 時(shí)都調(diào)用
  el.style.color = binding.value
})

這時(shí)候 div 里面的文字都變成紅色, v-color="yellow" 就變成了黃色

相關(guān)參數(shù)介紹

  • el:指令綁定到的元素。這可以用于直接操作 DOM。
  • binding:一個(gè)對(duì)象,包含以下屬性。
  • value:傳遞給指令的值。例如在 v-my-directive="1 + 1" 中,值是 2
  • oldValue:之前的值,僅在 beforeUpdate 和 updated 中可用。無論值是否更改,它都可用。
  • arg:傳遞給指令的參數(shù) (如果有的話)。例如在 v-my-directive:foo 中,參數(shù)是 "foo"。
  • modifiers:一個(gè)包含修飾符的對(duì)象 (如果有的話)。例如在 v-my-directive.foo.bar 中,修飾符對(duì)象是 { foo: true, bar: true }。
  • instance:使用該指令的組件實(shí)例。
  • dir:指令的定義對(duì)象。
  • vnode:代表綁定元素的底層 VNode。
  • prevNode:代表之前的渲染中指令所綁定元素的 VNode。僅在 beforeUpdate 和 updated 鉤子中可用。

新建 previewImageDirective.ts 文件

導(dǎo)入相關(guān)函數(shù)及類型,編寫基本的指令代碼

import { DirectiveBinding, h, render } from 'vue';
import { ElImageViewer } from 'element-plus';

export default function (app) {
	app.directive('previewImage', {
		mounted(el: HTMLElement, binding: DirectiveBinding) {
			// 邏輯操作
		},
	});
}
  • DirectiveBinding el的類型
  • h 將組件代碼轉(zhuǎn)成 vnode
  • render 將 vnode 渲染成 html

下面開始編寫相關(guān)指令代碼

首先我們需要?jiǎng)?chuàng)建一個(gè) div 用來包裹我們的預(yù)覽組件,我們來控制這個(gè) div 的顯示隱藏來實(shí)現(xiàn)預(yù)覽組件的彈出和隱藏。

為什么這幾個(gè)變量為啥要定義成全局的,如果寫在指令內(nèi)部 v-previewImage="" 多次 就出現(xiàn)多個(gè)變量,和多個(gè)組件,造成了資源浪費(fèi),然后ElImageViewer組件一個(gè)頁(yè)面要寫多次還會(huì)出現(xiàn)一個(gè)錯(cuò)誤

我給 element 提了issues,現(xiàn)在已經(jīng)修復(fù),但還是推薦我這種寫法

const previewBox = document.createElement('div'); // 創(chuàng)建節(jié)點(diǎn)
previewBox.classList.add('preview-box'); // 給 div 增加類名
let vnode; // 存放 vnode 的變量

編寫指令內(nèi)部代碼

第一步給圖片綁定點(diǎn)擊事件并給圖片添加樣式,當(dāng)鼠標(biāo)滑過添加小手的樣式

export default function (app) {
	app.directive('previewImage', {
		mounted(el: HTMLElement, binding: DirectiveBinding) {
			el.addEventListener('click', () => {
                            el.style.cursor = 'pointer';
                        })
		},
	});
}

第二步 使用 h 函數(shù) 渲染組件 將組件代碼轉(zhuǎn)成 vnode

export default function (app) {
	app.directive('previewImage', {
		mounted(el: HTMLElement, binding: DirectiveBinding) {
			el.addEventListener('click', () => {
                            el.style.cursor = 'pointer';
                        })
                        vnode = h(ElImageViewer, {
				urlList: [binding.value], // 圖片地址
				hideOnClickModal: true, // 允許點(diǎn)擊遮罩層關(guān)閉
			});
		},
	});
}

第三步 使用 render 函數(shù)將 vnode 渲染到我們創(chuàng)建的div 里面,并且將我們創(chuàng)建的 div 插入到 body 里面

export default function (app) {
	app.directive('previewImage', {
		mounted(el: HTMLElement, binding: DirectiveBinding) {
			el.addEventListener('click', () => {
                            el.style.cursor = 'pointer';
                        })
                        vnode = h(ElImageViewer, {
				urlList: [binding.value], // 圖片地址
				hideOnClickModal: true, // 允許點(diǎn)擊遮罩層關(guān)閉
			});
                        render(vnode, previewBox); // 將 vnode 渲染成 html
                        document.body.appendChild(previewBox); // 將 html 插入到 body 標(biāo)簽里面
		},
	});
}

到現(xiàn)在為止我們點(diǎn)擊圖片組件已經(jīng)可以正常的顯示了

第四步當(dāng)點(diǎn)擊遮罩層關(guān)閉的時(shí)候?qū)⑽覀儎?chuàng)建的 div 移除掉就 ok 了

export default function (app) {
	app.directive('previewImage', {
		mounted(el: HTMLElement, binding: DirectiveBinding) {
			el.addEventListener('click', () => {
                            el.style.cursor = 'pointer';
                        })
                        vnode = h(ElImageViewer, {
				urlList: [binding.value], // 圖片地址
				hideOnClickModal: true, // 允許點(diǎn)擊遮罩層關(guān)閉
                                onClose: () => {
                                         el.removeEventListener('click', () => {}); // 移除
                                         document.body.removeChild(previewBox);
					},
			});
                        render(vnode, previewBox); // 將 vnode 渲染成 html
                        document.body.appendChild(previewBox); // 將 html 插入到 body 標(biāo)簽里面
		},
	});
}

將文件導(dǎo)入到 main.ts中

將文件導(dǎo)入 main.ts中然后調(diào)用我們導(dǎo)入的方法傳入 app 就可以在頁(yè)面中使用了

import imageDirective from 'xxxx/previewImageDirective';
const app = createApp(App);
imageDirective(app)

ok 上面就是完整代碼,這樣一個(gè)圖片預(yù)覽指令就完成了

以上就是使用vue3指令封裝一個(gè)圖片預(yù)覽功能的詳細(xì)內(nèi)容,更多關(guān)于vue3圖片預(yù)覽的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于vue利用postcss-pxtorem進(jìn)行移動(dòng)端適配的問題

    關(guān)于vue利用postcss-pxtorem進(jìn)行移動(dòng)端適配的問題

    這篇文章主要介紹了關(guān)于vue利用postcss-pxtorem進(jìn)行移動(dòng)端適配的問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 詳細(xì)解讀VUE父子組件的使用

    詳細(xì)解讀VUE父子組件的使用

    這篇文章主要介紹了詳細(xì)解讀VUE父子組件的使用,今天來講一種子父組件深度耦合的方式,使我們不用額外的創(chuàng)建新的組件,也可以達(dá)到一些效果,下面與你們分享一下
    2023-05-05
  • vue學(xué)習(xí)筆記之過濾器的基本使用方法實(shí)例分析

    vue學(xué)習(xí)筆記之過濾器的基本使用方法實(shí)例分析

    這篇文章主要介紹了vue學(xué)習(xí)筆記之過濾器的基本使用方法,結(jié)合實(shí)例形式分析了vue.js過濾器的基本功能、用法與操作注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • 淺談Vue SPA 首屏加載優(yōu)化實(shí)踐

    淺談Vue SPA 首屏加載優(yōu)化實(shí)踐

    本篇文章主要介紹了淺談Vue SPA 首屏加載優(yōu)化實(shí)踐,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • vue實(shí)現(xiàn)滑動(dòng)解鎖功能

    vue實(shí)現(xiàn)滑動(dòng)解鎖功能

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)滑動(dòng)解鎖功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • uniapp-vue3項(xiàng)目中引入高德地圖的具體操作

    uniapp-vue3項(xiàng)目中引入高德地圖的具體操作

    這篇文章主要介紹了uniapp-vue3項(xiàng)目中引入高德地圖的具體操作,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-05-05
  • 解決vue中無法動(dòng)態(tài)修改jqgrid組件 url地址的問題

    解決vue中無法動(dòng)態(tài)修改jqgrid組件 url地址的問題

    下面小編就為大家分享一篇解決vue中無法動(dòng)態(tài)修改jqgrid組件 url地址的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • vue如何禁止打開調(diào)試模式方法

    vue如何禁止打開調(diào)試模式方法

    這篇文章主要介紹了vue如何禁止打開調(diào)試模式方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 前端vue如何使用高德地圖

    前端vue如何使用高德地圖

    這篇文章主要介紹了前端vue如何使用高德地圖,幫助大家利用vue調(diào)用其他key,完成需求,感興趣的朋友可以了解下
    2020-11-11
  • vue-axios使用詳解

    vue-axios使用詳解

    本篇文章主要介紹了vue-axios使用詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05

最新評(píng)論

长宁区| 左云县| 泸水县| 武定县| 襄城县| 吉林市| 新绛县| 南开区| 宽城| 长宁县| 灵武市| 遂昌县| 丰县| 临沭县| 凉城县| 崇文区| 科技| 陇川县| 景谷| 荆门市| 德兴市| 鄂尔多斯市| 江陵县| 南汇区| 巴彦县| 南阳市| 宁陵县| 嵊泗县| 交口县| 潮安县| 嘉峪关市| 望都县| 丰城市| 阿拉尔市| 成都市| 南城县| 吉木乃县| 安庆市| 大理市| 嵩明县| 年辖:市辖区|