建了一個(gè)新的 vue3 項(xiàng)目,因?yàn)轫?xiàng)目中有很多模塊用到了圖片預(yù)覽功能,項(xiàng)目的 ui 框架用的是element-plus,框架自帶 el-image 組件里面帶了圖片預(yù)覽功能,但是當(dāng)時(shí)我不想用這個(gè)組件,所以就借鑒了它里面預(yù)覽圖片組件的代碼。
簡(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ù)介紹
導(dǎo)入相關(guān)函數(shù)及類型,編寫(xiě)基本的指令代碼
import { DirectiveBinding, h, render } from 'vue';
import { ElImageViewer } from 'element-plus';
export default function (app) {
app.directive('previewImage', {
mounted(el: HTMLElement, binding: DirectiveBinding) {
// 邏輯操作
},
});
}
下面開(kāi)始編寫(xiě)相關(guān)指令代碼
首先我們需要?jiǎng)?chuàng)建一個(gè) div 用來(lái)包裹我們的預(yù)覽組件,我們來(lái)控制這個(gè) div 的顯示隱藏來(lái)實(shí)現(xiàn)預(yù)覽組件的彈出和隱藏。
為什么這幾個(gè)變量為啥要定義成全局的,如果寫(xiě)在指令內(nèi)部 v-previewImage="" 多次 就出現(xiàn)多個(gè)變量,和多個(gè)組件,造成了資源浪費(fèi),然后ElImageViewer組件一個(gè)頁(yè)面要寫(xiě)多次還會(huì)出現(xiàn)一個(gè)錯(cuò)誤
我給 element 提了issues,現(xiàn)在已經(jīng)修復(fù),但還是推薦我這種寫(xiě)法
const previewBox=document.createElement('div'); // 創(chuàng)建節(jié)點(diǎn)
previewBox.classList.add('preview-box'); // 給 div 增加類名
let vnode; // 存放 vnode 的變量
編寫(xiě)指令內(nèi)部代碼
export default function (app) {
app.directive('previewImage', {
mounted(el: HTMLElement, binding: DirectiveBinding) {
el.addEventListener('click', ()=> {
el.style.cursor='pointer';
})
},
});
}
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)閉
});
},
});
}
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)可以正常的顯示了
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中然后調(diào)用我們導(dǎo)入的方法傳入 app 就可以在頁(yè)面中使用了
import imageDirective from 'xxxx/previewImageDirective';
const app=createApp(App);
imageDirective(app)
ok 上面就是完整代碼,這樣一個(gè)圖片預(yù)覽指令就完成了
使用 vue3 指令封裝一個(gè)后臺(tái)管理系統(tǒng)圖片預(yù)覽功能
原文鏈接:https://juejin.cn/post/7324653675456364596
天給小伙伴們分享一個(gè)超棒的Vue圖片任意裁剪插件VueImgCutter。
vue-img-cutter 基于 vue2.x 構(gòu)建的輕量級(jí)剪切圖片組件。支持移動(dòng)圖像、放大縮小圖片、任意移動(dòng)圖片、固定比例/尺寸、遠(yuǎn)程圖片裁剪等功能。
功能特色
安裝
$ npm i vue-img-cutter -S
使用插件
<template>
<div id="app">
<ImgCutter
label="選擇圖片"
:isModal="false"
:boxWidth="800"
:boxHeight="500"
:cutWidth="300"
:cutHeight="300"
:sizeChange="true"
:moveAble="true"
WatermarkText="水印文字"
v-on:cutDown="cutDown"
>
<div class="btn btn-primary" slot="open">選擇本地圖片</div>
</ImgCutter>
</div>
</template>
<script>
import ImgCutter from 'vue-img-cutter'
export default {
components: { ImgCutter },
data() {
return {}
},
methods: {
cutDown(res) {
let imgSrc=res.dataURL;
console.log(imgSrc);//輸出為base64數(shù)據(jù)
}
}
}
</script>
設(shè)置模態(tài)彈框模式
<ImgCutter :isModal="true"></ImgCutter>
模態(tài)框模式
參數(shù)配置
插槽Slot
<ImgCutter v-on:cutDown="cutDown">
<button slot="open">選擇圖片</button>
</ImgCutter>
返回值
最后附上示例及項(xiàng)目地址
# 演示地址
https://ihtmlcss.com/demo/dist/#/croptool
# 倉(cāng)庫(kù)地址
https://github.com/acccccccb/vue-img-cutter
ok,就介紹到這里。希望對(duì)你有幫助!感興趣的同學(xué)可以去了解下哈~
為了豐富 Naive Admin 生態(tài),近期我們一直在精雕細(xì)琢,日夜奮戰(zhàn),終于又迎來(lái)了Arco Vue Pro 正式發(fā)布上線!
ArcoDesign 是由字節(jié)跳動(dòng) GIP UED 團(tuán)隊(duì)和架構(gòu)前端團(tuán)隊(duì)聯(lián)合推出的企業(yè)級(jí)設(shè)計(jì)系統(tǒng),在打磨了近 3 年之后,通過(guò)字節(jié)內(nèi)部大量業(yè)務(wù)沉淀和驗(yàn)證,開(kāi)源了 ArcoDesign 設(shè)計(jì)系統(tǒng),旨在讓社區(qū)聽(tīng)見(jiàn)更多的聲音,為更多中小型企業(yè)及個(gè)人設(shè)計(jì)師和開(kāi)發(fā)者提效,創(chuàng)造更多高效美觀的“最佳實(shí)踐”。
Naive Admin Arco 是一個(gè)基于 Vue3.0、Vite、 Arco Vue、TypeScript 中后臺(tái)解決方案。
Naive Admin Arco 企業(yè)級(jí)中后臺(tái)前端框架,使用最新的前端技術(shù)棧,并提煉了典型的業(yè)務(wù)模型,頁(yè)面,包括二次封裝組件、動(dòng)態(tài)菜單、權(quán)限校驗(yàn)、粒子化權(quán)限控制等功能,它可以幫助你快速搭建企業(yè)級(jí)中后臺(tái)項(xiàng)目
響應(yīng)式、多主題,多配置,快速集成,開(kāi)箱即用
最新技術(shù)棧,使用 Vue 3、Typescript、Pinia、Vite 等前端前沿技術(shù)
強(qiáng)大的鑒權(quán)系統(tǒng),對(duì)路由、菜單、功能點(diǎn)等支持 3 種鑒權(quán)模式,滿足不同的業(yè)務(wù)鑒權(quán)需求
持續(xù)更新,實(shí)用性頁(yè)面模板功能和交互,隨意搭配組合,讓構(gòu)建頁(yè)面變得簡(jiǎn)單化
更多頁(yè)面、功能,組件,請(qǐng)直接在線預(yù)覽查看
AdminPro
Naive Admin NaiveUi 生態(tài)最優(yōu)秀的中后臺(tái)框架,全面的系統(tǒng)配置,優(yōu)質(zhì)模板,常用組件,真正一站式開(kāi)箱即用
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。