欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

vue3?hook如何重構(gòu)DataV的全屏容器組件

今天小編給大家分享一下vue3 hook如何重構(gòu)DataV的全屏容器組件的相關(guān)知識點,內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

成都創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計制作、成都網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的沽源網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

實現(xiàn)

創(chuàng)建組件

fullScreenContainer.vue

<template>
  <div id="dv-full-screen-container" :ref="autoBindRef">
    <slot></slot>
  </div>
</template>
<script setup lang="ts">
import { useAutoResize } from '@/hooks/useAutoResize'
const { autoBindRef } = useAutoResize()
</script>

自定義一個hook,導(dǎo)出一個autoBindRef綁定ref

自定義hook文件

useAutoResize.ts

import { ref } from 'vue';
export function useAutoResize() {
    let domRef = ref<HTMLElement | null>();
    function autoBindRef() {
    }
    return {
        autoBindRef
    }
}
1、綁定domRef

確保先獲取到dom元素,邏輯才可以繼續(xù)往下走。

創(chuàng)建一個函數(shù),用于檢測獲取正確的dom元素

function getRefDom(ref: HTMLElement | ComponentPublicInstance): HTMLElement | null {
  // ref指向dom,則返回ref
  // isElement檢查指定的值是否為DOM元素
  if (isElement(ref)) {
    return ref as HTMLElement
  }
  // 若ref指向組件實例,通過$el獲取dom元素
  if (isElement((ref as ComponentPublicInstance).$el)) {
    return (ref as ComponentPublicInstance).$el
  }
  return null
}

自動綁定組件domRef

export function useAutoResize() {
    let domRef = ref<HTMLElement | null>();
    const autoBindRef = once((ref: HTMLElement | ComponentPublicInstance) =>  {
        const  dom = getRefDom(ref);
        if(!dom) {
            console.warn("綁定組件domRef失敗!")
            return;
        }
        domRef.value = dom;
    })
    return {
        autoBindRef
    }
}
2、初始化
export function useAutoResize() {
    onMounted(() => {
        initDom(domRef.value)
        initConifg(domRef.value)
    })
}

mounted時期,dom都已掛載完畢,故需在此周期獲取dom元素。

2.1、初始化dom
function initDom(dom:HTMLElement) {
    const { clientWidth = 0, clientHeight = 0 } = dom || {}
    if(!dom) {
        console.warn("獲取dom節(jié)點失敗,組件渲染可能異常!")
        return
    } else if(!clientWidth || !clientHeight) {
        console.warn("組件寬度或高度為0px,可能會出現(xiàn)渲染異常!")
        return
    }
    // 設(shè)置縮放比例
    if(typeof setAppSacle === 'function') setAppScale(dom)
}
2.2、初始化設(shè)備

獲取到dom后,將獲取到的設(shè)備屏幕分辨率寬高設(shè)置給dom。

function initConfig(dom:HTMLElement) {
    const { width, height } = screen || {}
    dom.style.width = `${width}px`;
    dom.style.height = `${height}px`;
}
2.3、設(shè)置縮放效果
function setAppScale(dom:HTMLElement){
    const currentWidth = document.body.clientWidth;
    const { width } = screen || {};
    dom.style.transform = `scale(${currentWidth / width})`;
}

當(dāng)dom元素改變/窗口大小變化時,觸發(fā)這個函數(shù)。

3、監(jiān)聽/移除事件

需要同時對dom元素和窗口大小的變化監(jiān)聽

dom元素監(jiān)聽

這里我們使用MutationObserver來對dom元素的變化來監(jiān)聽

function observerDomResize(dom: HTMLElement, callback: () => void) {
    const observer = new MutationObserver(callback);
    observer.observe(dom, {
        attributes: true,
        attributeFilter: ['style'],
        attributeOldValue: true,
    })
    return observer
}

在mounted周期內(nèi)設(shè)置監(jiān)聽

export function useAutoResize() {
    const handleInitDom = () => {
        initDom(domRef.value)
    }
    onMounted(() => {
        initDom(domRef.value)
        initConifg(domRef.value)
        observerDomResize(domRef.value, handleInitDom)
        window.removeEventListener('resize', handleInitDom);
    })
}

但是如果我們直接這樣寫,他就會頻繁調(diào)用handleInitDom函數(shù),造成性能浪費,所以使用防抖函數(shù)先包裝一下事件處理函數(shù)handleInitDom再調(diào)用。

export function useAutoResize() {
    const domSizeEffectDisposer: (() => void)[] = [];
    const debounceInitDomFun = debounce(handleInitDom, 300)
    onMounted(() => {
        initDom(domRef.value)
        initConifg(domRef.value)
        observerDomResize(domRef.value, debounceInitDomFun)
        window.removeEventListener('resize', debounceInitDomFun);
        domSizeEffectDisposer.push(
          () => {
            if (!observer) return
            observer.disconnect();
            observer.takeRecords();
            observer = null;
          },
          () => {
            window.removeEventListener('resize', debounceInitDomFun);
          }
        );
    })
}

監(jiān)聽了事件,那么在組件卸載時就要清除它

onUnmounted(() => {
    domSizeEffectDisposer.forEach(disposer => disposer())
  })

以上就是“vue3 hook如何重構(gòu)DataV的全屏容器組件”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享文章:vue3?hook如何重構(gòu)DataV的全屏容器組件
當(dāng)前網(wǎng)址:http://aaarwkj.com/article20/gpjico.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護、商城網(wǎng)站自適應(yīng)網(wǎng)站、品牌網(wǎng)站建設(shè)、云服務(wù)器響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計
国产精品果亚洲av无人区一区| 天堂av在线观看播放| 欧美一区二区三区人妻熟妇| 欧美日韩国产综合下一页| 国产夫妻性生活国产视频| 亚洲精品一区二区三区高潮| 欧美中文字幕精在线不卡| 国产欧美日韩另类在线| 一区二区三区亚洲精品在线| 国产我不卡在线观看免费| 91嫩草中文字幕在线| 久久精品一区二区日韩| 91成人精品永久在线观看| 亚洲奇米精品一区二区| 欧美中日韩精品免费在线| 亚洲成人精品久久久| 国产一区二区精品久久岳| 日韩精品一区二区视频| 91一区二区亚洲嫩草| 免费女同一区二区三区| 尤物在线免费观看视频| 国产乱子一区二区三区| 精品毛片在线播放网站不卡| 青青草日韩欧美在线观看| 漂亮人妻被中出中文字幕| 精品国产精品中文字幕| 午夜福利片免费在线观看| 国产无遮挡又黄又爽网站| 国产一区二区三区日本精品| 国内精品免费视频不卡| 日韩欧美一区亚洲一区| 日本人妻免费在线观看| 国内精品人妻在线中文字幕| 天堂av在线一区二区三区| 农村人妻一区二区三区视频 | 欧美日本黄色一级视频| 欧美小黄片在线免费看| 日韩二区三区精品视频| 91啪在线观看91色| 天堂久久天堂av色综合| 中文字幕在线感觉av|