成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

vue3+ts+elementPLus實(shí)現(xiàn)v-preview指令

瀏覽:204日期:2022-06-09 18:26:21
目錄
  • 引文
  • 目錄
  • 文件內(nèi)容
    • previewImage.vue
    • preview.ts
  • 使用
    • 開(kāi)發(fā)中可能遇到的問(wèn)題
      • 總結(jié)

        引文

        最近在用 vue3+ts 開(kāi)發(fā)公司的后臺(tái)系統(tǒng),因?yàn)楹笈_(tái)多處需要圖片放大預(yù)覽的功能,就想著封裝一個(gè)v-preview指令,這樣在需要預(yù)覽的圖片上加個(gè) v-preview就可以預(yù)覽啦。

        目錄

        在這里就不列我的項(xiàng)目目錄啦,想嘗試的朋友可以這樣創(chuàng)建目錄

        -- preview
        ---- previewImage.vue
        ---- preview.ts

        文件內(nèi)容

        previewImage.vue

        普普通通vue3組件,記得全局注冊(cè)

        <template>
        ? ? <div @click="dialogVisible = true">
        ? ? ? ? <slot>
        ? ? ? ? ? ? <img :src="props.src" />
        ? ? ? ? </slot>
        ? ? </div>
        ? ? <el-dialog v-model="dialogVisible" title="查看圖片" @close="close">
        ? ? ? ? <img :src="imgSrc" />
        ? ? </el-dialog>
        </template>
        <script setup lang="ts">
        ? ? import { ref, getCurrentInstance, ComponentInternalInstance, onMounted } from "vue"
        ? ? import { ElDialog } from "element-plus"
        ? ? const props = defineProps({
        ? ? ? ? src: String
        ? ? })
        ? ? const dialogVisible = ref(false)
        ? ? const imgSrc = ref("")
        ? ? // 插槽形式
        ? ? onMounted(() => {
        ? ? ? ? const { proxy } = getCurrentInstance() as ComponentInternalInstance
        ? ? ? ? let slot = proxy?.$slots?.default?.()
        ? ? ? ? if(slot){
        ? ? ? ? ? ? // 獲取插槽內(nèi)容設(shè)置imgSrc地址
        ? ? ? ? ? ? imgSrc.value = slot?.[0]?.props?.src
        ? ? ? ? }
        ? ? })
        ? ? const setSrc = (v: string) => {
        ? ? ? ? imgSrc.value = v
        ? ? }
        ? ? // 組件觸發(fā)
        ? ? if (props.src) {
        ? ? ? ? setSrc(props.src)
        ? ? }
        ? ? // 指令觸發(fā)
        ? ? const show = () => {
        ? ? ? ? dialogVisible.value = true
        ? ? }
        ? ? const close = () => {?
        ? ? ? ? // 彈窗關(guān)閉移除dom
        ? ? ? ? if (document.getElementById("previewDom")) {
        ? ? ? ? ? ? document.body.removeChild(document.getElementById("previewDom") as HTMLElement)
        ? ? ? ? }
        ? ? }
        ? ? defineExpose({
        ? ? ? ? show,
        ? ? ? ? setSrc
        ? ? })
        </script>

        preview.ts

        對(duì)previewImage組件進(jìn)行拓展,全局注冊(cè)preview指令(這個(gè)注冊(cè)代碼就不放了呦)
        需要注意的是vue3拓展組件和vue2有所不同,vue2用Vue.extend就可以拿到組件構(gòu)造器,vue3這邊則是使用createApp

        import { Component, createApp } from "vue"
        import PreviewImageVue from "@/components/PreviewImage.vue"
        function mountComponent(RootComponent: Component) {
        ? ? const app = createApp(RootComponent)
        ? ? const root = document.createElement("div")
        ? ? root.setAttribute("id", "previewDom")
        ? ? document.body.appendChild(root)
        ? ? return {
        ? ? ? ? instance: app.mount(root),
        ? ? ? ? unmount() { // 這里unmout沒(méi)用到,因?yàn)榻M件中dialog的close事件這里監(jiān)聽(tīng)不到,我就在組件內(nèi)進(jìn)行卸載了
        ? ? ? ? ? ? console.log("unmount")
        ? ? ? ? ? ? document.body.removeChild(root)
        ? ? ? ? }
        ? ? }
        }
        const preview = {
        ? ? mounted(el: any) {
        ? ? ? ? el.style.cursor = "zoom-in"
        ? ? ? ? el.addEventListener("click", () => {
        ? ? ? ? ? ? let imgSrc = el.getAttribute("src")
        ? ? ? ? ? ? let { instance, unmount } = mountComponent(PreviewImageVue)
        ? ? ? ? ? ? ;(instance as any).setSrc(imgSrc)
        ? ? ? ? ? ? ;(instance as any).show()
        ? ? ? ? })
        ? ? }
        }
        export default preview

        使用

        本地資源測(cè)試

        <div>
        ? ? <!-- 普通圖片 -->
        ? ? <img src="~@/assets/images/logo.png">
        ? ? <!-- 組件形式使用預(yù)覽組件、需要注意路徑(使用絕對(duì)路徑) -->
        ? ? <PreviewImage src="/src/assets/images/logo.png"></PreviewImage>
        ? ? <!-- 組件插槽形式預(yù)覽組件、需要注意路徑(使用絕對(duì)路徑) -->
        ? ? <PreviewImage>
        ? ? ? ? <img src="/src/assets/images/logo.png">
        ? ? </PreviewImage>
        ? ? <!-- 指令使用預(yù)覽組件 -->
        ? ? <img src="~@/assets/images/logo.png" v-preview>
        </div>

        開(kāi)發(fā)中可能遇到的問(wèn)題

        • 獲取proxy時(shí)使用getCurrentInstance時(shí)編輯器會(huì)報(bào)錯(cuò),斷言成ComponentInternalInstance就不報(bào)錯(cuò)了。
        • 獲取插槽內(nèi)容時(shí)需要 proxy?.$slots?.default?.() 這樣判斷取值,不然編輯器也會(huì)報(bào)錯(cuò)。
        • 暴露給外部使用的方法/屬性需通過(guò)defineExpose暴露出去
        • 注意拓展組件方式。vue2用Vue.extend,vue3用createApp
        • 使用的時(shí)候注意路徑問(wèn)題

        總結(jié)

        之前都是用vue2開(kāi)發(fā)項(xiàng)目,此次項(xiàng)目是vue3的第一次實(shí)踐,使用下來(lái)感覺(jué)ts寫(xiě)起來(lái)比較冗余,很多編輯器報(bào)錯(cuò)都需要時(shí)間去解決,可能不是開(kāi)發(fā)組件庫(kù)都是業(yè)務(wù)需求,對(duì)類(lèi)型接口的定義使用很少。個(gè)人不是很喜歡ts,還是js來(lái)的簡(jiǎn)單粗暴。

        到此這篇關(guān)于vue3+ts+elementPLus實(shí)現(xiàn)v-preview指令的文章就介紹到這了,更多相關(guān)vue3 v-preview指令內(nèi)容請(qǐng)搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!

        標(biāo)簽: JavaScript
        成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
        欧美精品aⅴ在线视频| 亚洲日本免费电影| 国产精品美女www爽爽爽| 国产精品中文字幕一区二区三区| 狼狼综合久久久久综合网| 亚洲视频 欧洲视频| 国产精品久久毛片a| 国产成人在线观看免费网站| 欧美色图在线观看| 午夜精品成人在线视频| 亚洲免费大片| 亚洲日本在线天堂| 激情综合网址| 亚洲主播在线播放| 在线日韩欧美| 国产精品久久久久久久久晋中| kk眼镜猥琐国模调教系列一区二区| 9191精品国产综合久久久久久| 日本vs亚洲vs韩国一区三区| 一本久久a久久精品亚洲| 午夜视频一区在线观看| 国产欧美一级| 亚洲色图在线播放| 在线成人黄色| |精品福利一区二区三区| 合欧美一区二区三区| 中文字幕在线观看一区二区| 红桃视频国产一区| 国产精品美女一区二区在线观看| 狠狠久久婷婷| 亚洲免费观看高清完整版在线观看熊| av成人天堂| 亚洲一区二区高清| 色哟哟精品一区| 日本伊人色综合网| 欧美日精品一区视频| 老司机免费视频一区二区| 色94色欧美sute亚洲线路一ni| 日本在线不卡视频一二三区| 欧洲在线/亚洲| 韩日欧美一区二区三区| 欧美一级精品在线| 成人丝袜18视频在线观看| 精品国产伦一区二区三区观看方式| 成人小视频免费观看| 精品久久国产字幕高潮| 色综合视频在线观看| 国产精品国产三级国产三级人妇 | 欧美高清不卡| 国产精品二区一区二区aⅴ污介绍| 亚洲经典在线看| 亚洲高清不卡在线| 精品视频1区2区3区| 99视频有精品| 亚洲欧洲精品一区二区三区 | 国产高清不卡一区| 久久综合久久99| 国产在线精品二区| 亚洲综合一区二区三区| 在线亚洲一区观看| 国产suv精品一区二区6| 欧美极品另类videosde| 国产亚洲一区在线播放| 人禽交欧美网站| 日韩一区二区三| 韩国av一区| 五月综合激情日本mⅴ| 欧美日韩国产系列| 99久久精品99国产精品| 亚洲欧洲精品一区二区三区| 免费不卡亚洲欧美| 国产一区二区精品久久99| 日韩一卡二卡三卡国产欧美| 午夜一区在线| 精品国产乱码久久久久久浪潮| 美女在线一区二区| 捆绑变态av一区二区三区| 日本人妖一区二区| 中文字幕欧美一| 亚洲一区久久| 国产一区自拍视频| 97久久超碰国产精品| 一区二区三区在线观看欧美 | 五月开心婷婷久久| 欧美精品一区二区精品网| 国产女主播视频一区二区| 亚洲黄色av一区| 亚洲一区在线播放| 亚洲日本在线观看| 亚洲综合在线观看视频| 亚洲第一二三四区| 国产精品一级黄| 久久久99精品久久| 一本到三区不卡视频| 99精品视频一区| 日韩高清在线观看| 国产肉丝袜一区二区| 久久综合一区二区三区| 91在线国内视频| 欧美aaa在线| 国产精品久久久久一区二区三区共| 91国产免费观看| 黄色欧美成人| 国产一区二区免费看| 亚洲最大成人综合| 久久久精品中文字幕麻豆发布| 久久一区欧美| 91麻豆精东视频| 秋霞影院一区二区| 中文字幕第一区二区| 欧美日韩日本视频| 在线精品观看| 国产aⅴ精品一区二区三区色成熟| 亚洲人成小说网站色在线| 欧美一区二区视频在线观看2022| 国产精品视频福利| 91麻豆国产在线观看| 久久精品国产99久久6| 中文字幕一区在线观看视频| 91精品国产乱| 色婷婷久久久综合中文字幕| 欧美另类一区| 国内精品不卡在线| 亚洲电影在线免费观看| 日本一区二区三区在线观看| 欧美日韩三级一区| 性感少妇一区| 狠狠色狠狠色综合人人| 成人中文字幕在线| 精油按摩中文字幕久久| 亚洲国产一二三| 亚洲天天做日日做天天谢日日欢| 日韩欧美的一区| 欧美日韩一级二级| 久久一区免费| 亚洲一区三区在线观看| 欧美日韩妖精视频| 国产成人免费av在线| 久久精品二区亚洲w码| 亚洲一区二区三区激情| 日韩一区二区在线观看视频播放| 久久久久看片| 99精品热视频只有精品10| 午夜精品免费| 97精品国产露脸对白| 国产乱国产乱300精品| 视频一区视频二区中文| 一区二区三区欧美久久| 国产欧美精品在线观看| 欧美电影免费观看高清完整版 | 欧美日韩一区在线播放| 不卡的电视剧免费网站有什么| 国产专区欧美精品| 日本午夜精品视频在线观看| 一区二区日韩av| 中文字幕亚洲综合久久菠萝蜜| 国产视频一区二区在线| 日韩免费观看高清完整版 | 久久综合九色综合久99| 香蕉久久夜色精品国产| 国产欧美一级| 一本色道久久综合| 999在线观看精品免费不卡网站| 亚洲午夜黄色| 亚洲午夜精品福利| 国内精品国语自产拍在线观看| 色综合天天综合狠狠| 欧美在线观看天堂一区二区三区| 菠萝蜜视频在线观看一区| 岛国av在线一区| 粉嫩在线一区二区三区视频| 国产成人av电影在线| 国产一区二区成人久久免费影院| 九一九一国产精品| 日韩电影免费一区| 日韩在线一区二区| 日韩电影一区二区三区| 蜜桃视频一区二区三区| 麻豆精品在线播放| 久久99国产精品久久99| 精品无人区卡一卡二卡三乱码免费卡| 免费xxxx性欧美18vr| 韩国一区二区三区| 国产福利精品一区| 成人精品视频一区二区三区| 91丝袜美女网| 国产精品黄色| 亚洲黄页一区| 在线视频精品一区| 国产日韩综合| 久久综合福利| 欧美精品一二三| 精品三级在线观看| 国产人久久人人人人爽| 自拍偷拍国产精品| 午夜久久久久久电影| 青青草97国产精品免费观看| 久久国产精品99久久久久久老狼| 国产一区二区网址| 成人精品小蝌蚪|