日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

十個有用的 Vue.js 自定義 Hook

來源: 責編: 時間:2023-09-28 10:07:09 381觀看
導讀Vue.js 是我使用的第一個 JavaScript 框架。 我可以說 Vue.js 是我進入 JavaScript 世界的第一扇門之一。 目前,Vue.js 仍然是一個很棒的框架。 我認為有了組合 API,Vue.js 只會增長得更多。 在本文中,我將向分享 10 個

Vue.js 是我使用的第一個 JavaScript 框架。 我可以說 Vue.js 是我進入 JavaScript 世界的第一扇門之一。 fkq28資訊網——每日最新資訊28at.com

fkq28資訊網——每日最新資訊28at.com

目前,Vue.js 仍然是一個很棒的框架。 我認為有了組合 API,Vue.js 只會增長得更多。 在本文中,我將向分享 10 個可以使用 Vue.js 制作的有用的自定義鉤hook。fkq28資訊網——每日最新資訊28at.com

01、使用窗口調整大小

這是一個基本的hook。 因為它在許多項目中使用,并且使用純 JavaScript 或任何框架構建它太容易了。 fkq28資訊網——每日最新資訊28at.com

與 Vue 相同,只需幾行代碼即可構建它。 fkq28資訊網——每日最新資訊28at.com

這是我的代碼:fkq28資訊網——每日最新資訊28at.com

import { ref, onMounted, onUnmounted } from 'vue';export function useWindowResize() {  const width = ref(window.innerWidth);  const height = ref(window.innerHeight);  const handleResize = () => {    width.value = window.innerWidth;    height.value = window.innerHeight;  }  onMounted(() => {    window.addEventListener('resize', handleResize)  });  onUnmounted(() => {    window.removeEventListener('resize', handleResize)  })  return {    width,    height  }}

不僅構建簡單,而且使用起來也很容易。 只需要調用這個鉤子即可獲取窗口的寬度和高度:fkq28資訊網——每日最新資訊28at.com

setup() {    const { width, height } = useWindowResize();}

02、使用存儲

您想通過將數據值存儲在會話存儲或本地存儲中并將該值綁定到視圖來持久保存數據嗎? 只需一個簡單的hook——useStorage,一切就變得如此簡單。 fkq28資訊網——每日最新資訊28at.com

我們只需要創建一個hook,返回從存儲中獲取的數據,以及一個在我們想要更改數據時將數據存儲在存儲中的函數。 fkq28資訊網——每日最新資訊28at.com

這是我的代碼。fkq28資訊網——每日最新資訊28at.com

import { ref } from 'vue';const getItem = (key, storage) => {  let value = storage.getItem(key);  if (!value) {    return null;  }  try {    return JSON.parse(value)  } catch (error) {    return value;  }}export const useStorage = (key, type = 'session') => {  let storage = null;  switch (type) {    case 'session':      storage = sessionStorage;      break;    case 'local':      storage = localStorage;      break;    default:      return null;  }  const value = ref(getItem(key, storage));  const setItem = (storage) => {    return (newValue) => {      value.value = newValue;      storage.setItem(key, JSON.stringify(newValue));    }  }  return [    value,    setItem(storage)  ]}

在我的代碼中,我使用 JSON.parse 和 JSON.stringify 來格式化數據。 fkq28資訊網——每日最新資訊28at.com

如果您不想格式化它,可以將其刪除。 這是如何使用此hook的示例。fkq28資訊網——每日最新資訊28at.com

const [token, setToken] = useStorage('token');setToken('new token');

03、使用網絡狀態

這是一個有用的hook,支持檢查網絡連接的狀態。 為了實現這個hook,我們需要為“在線”和“離線”事件添加事件監聽器。 fkq28資訊網——每日最新資訊28at.com

在事件中,我們只是調用一個回調函數,參數為網絡狀態。 fkq28資訊網——每日最新資訊28at.com

這是我的代碼:fkq28資訊網——每日最新資訊28at.com

import { onMounted, onUnmounted } from 'vue';export const useNetworkStatus = (callback = () => { }) => {  const updateOnlineStatus = () => {    const status = navigator.onLine ? 'online' : 'offline';    callback(status);  }  onMounted(() => {    window.addEventListener('online', updateOnlineStatus);    window.addEventListener('offline', updateOnlineStatus);  });  onUnmounted(() => {    window.removeEventListener('online', updateOnlineStatus);    window.removeEventListener('offline', updateOnlineStatus);  })}

只是簡單易用。 fkq28資訊網——每日最新資訊28at.com

目前,我使用參數“online”/“offline”調用回調函數。 您可以將其更改為真/假或任何您想要的。fkq28資訊網——每日最新資訊28at.com

useNetworkStatus((status) => {     console.log(`Your network status is ${status}`);}

04、使用復制到剪貼板

將文本復制到剪貼板是每個項目中都很流行的功能。 我知道我們可以創建一個函數來代替鉤子來做到這一點。 fkq28資訊網——每日最新資訊28at.com

但我喜歡數字 10,所以我決定在這篇文章中加入這個hook。 這個hook非常簡單,只需返回一個支持將文本復制到剪貼板的函數即可。fkq28資訊網——每日最新資訊28at.com

function copyToClipboard(text) {  let input = document.createElement('input');  input.setAttribute('value', text);  document.body.appendChild(input);  input.select();  let result = document.execCommand('copy');  document.body.removeChild(input);  return result;}export const useCopyToClipboard = () => {  return (text) => {    if (typeof text === "string" || typeof text == "number") {      return copyToClipboard(text);    }    return false;  }}

在我的代碼中,我在函數 copyToClipboard 中將邏輯復制文本放入剪貼板。 我知道我們有很多方法可以做到這一點。 你可以在此功能中嘗試最適合你的方法。 fkq28資訊網——每日最新資訊28at.com

至于如何使用,調用即可。fkq28資訊網——每日最新資訊28at.com

const copyToClipboard = useCopyToClipboard();copyToClipboard('just copy');

05、使用主題

只需一個簡短的鉤子即可更改網站的主題。 它可以幫助我們輕松切換網站的主題,只需用主題名稱調用此hook即可。 這是我用來定義主題變量的 CSS 代碼示例。fkq28資訊網——每日最新資訊28at.com

html[theme="dark"] {   --color: #FFF;   --background: #333;}html[theme="default"], html {   --color: #333;   --background: #FFF;}

要更改主題,我們只需要創建一個自定義掛鉤,它將返回一個通過主題名稱更改主題的函數。 fkq28資訊網——每日最新資訊28at.com

這是我的這個鉤子的代碼:fkq28資訊網——每日最新資訊28at.com

export const useTheme = (key = '') => {  return (theme) => {    document.documentElement.setAttribute(key, theme);  }}

而且使用起來太方便了。fkq28資訊網——每日最新資訊28at.com

const changeTheme = useTheme();changeTheme('dark');

06、使用頁面可見性

有時,當客戶不關注我們的網站時,我們需要做一些事情。 為此,我們需要一些東西來讓我們知道用戶是否集中注意力。 這是一個定制的hook。 fkq28資訊網——每日最新資訊28at.com

我稱之為 usePageVisibility,下面是該hook的代碼:fkq28資訊網——每日最新資訊28at.com

import { onMounted, onUnmounted } from 'vue';export const usePageVisibility = (callback = () => { }) => {  let hidden, visibilityChange;  if (typeof document.hidden !== "undefined") {    hidden = "hidden";    visibilityChange = "visibilitychange";  } else if (typeof document.msHidden !== "undefined") {    hidden = "msHidden";    visibilityChange = "msvisibilitychange";  } else if (typeof document.webkitHidden !== "undefined") {    hidden = "webkitHidden";    visibilityChange = "webkitvisibilitychange";  }  const handleVisibilityChange = () => {    callback(document[hidden]);  }  onMounted(() => {    document.addEventListener(visibilityChange, handleVisibilityChange, false);  });  onUnmounted(() => {    document.removeEventListener(visibilityChange, handleVisibilityChange);  });}

要使用這個hook,我們只需要創建一個帶有客戶端隱藏狀態(焦點狀態)參數的回調函數。fkq28資訊網——每日最新資訊28at.com

usePageVisibility((hidden) => {   console.log(`User is${hidden ? ' not' : ''} focus your site`);});

07、使用視口

在第一個自定義hook中,我們構建了useWindowRezie,它可以幫助我們查看窗口的當前寬度和高度。 fkq28資訊網——每日最新資訊28at.com

我認為這對于那些想要構建適用于多種屏幕尺寸的東西的人很有幫助。 fkq28資訊網——每日最新資訊28at.com

在我處理過的案例中,我們經常使用寬度來檢測當前用戶設備。 它可以幫助我們在他們的設備上安裝一些東西。 fkq28資訊網——每日最新資訊28at.com

在此hook中,我將使用 useWindowResize 構建相同的內容,但它返回設備名稱而不是寬度和高度值。 fkq28資訊網——每日最新資訊28at.com

這是這個hook的代碼。fkq28資訊網——每日最新資訊28at.com

import { ref, onMounted, onUnmounted } from 'vue';export const MOBILE = 'MOBILE'export const TABLET = 'TABLET'export const DESKTOP = 'DESKTOP'export const useViewport = (config = {}) => {  const { mobile = null, tablet = null } = config;  let mobileWidth = mobile ? mobile : 768;  let tabletWidth = tablet ? tablet : 922;  let device = ref(getDevice(window.innerWidth));  function getDevice(width) {    if (width < mobileWidth) {      return MOBILE;    } else if (width < tabletWidth) {      return TABLET;    }    return DESKTOP;  }  const handleResize = () => {    device.value = getDevice(window.innerWidth);  }  onMounted(() => {    window.addEventListener('resize', handleResize);  });  onUnmounted(() => {    window.removeEventListener('resize', handleResize);  });  return {    device  }}

它是如此容易。 除了默認的設備尺寸之外,當我們使用包含手機和平板電腦尺寸的參數對象調用該hook時,用戶可以修改它。 這是我們使用它的方式:fkq28資訊網——每日最新資訊28at.com

const { device } = useViewport({ mobile: 700, table: 900 });

08、使用OnClickOutside

目前,模態被用于許多應用程序中。 它對于許多用例(表單、確認、警告等)確實很有幫助。 fkq28資訊網——每日最新資訊28at.com

我們經常用它處理的流行操作之一是用戶在模式之外單擊。 useOnClickOutside 對于這種情況是一個有用的hook。 fkq28資訊網——每日最新資訊28at.com

我們只需要一個 ref 元素、回調函數并將其綁定到窗口事件中。 這是我的代碼(適用于桌面和移動設備):fkq28資訊網——每日最新資訊28at.com

import { onMounted, onUnmounted } from 'vue';export const useOnClickOutside = (ref = null, callback = () => {}) => {  function handleClickOutside(event) {    if (ref.value && !ref.value.contains(event.target)) {      callback()    }  }  onMounted(() => {    document.addEventListener('mousedown', handleClickOutside);  })  onUnmounted(() => {    document.removeEventListener('mousedown', handleClickOutside);  });}

正如我所說,要使用它,我們只需要使用參數 ref 元素和回調函數來調用它。fkq28資訊網——每日最新資訊28at.com

<template>    <div ref="container">View</div></template><script>import { ref } from 'vue';export default {    setup() {        const container = ref(null);        useOnClickOutside(container, () => {            console.log('Clicked outside');         })    }}</script>

09、使用滾動到底部

除了分頁列表之外,加載更多(或延遲加載)是加載數據的一種友好方式。 特別是對于移動設備,幾乎在移動設備上運行的應用程序都會在其 UI 中加載更多負載。 為此,我們需要檢測用戶滾動到列表底部并觸發該事件的回調。 fkq28資訊網——每日最新資訊28at.com

useScrollToBottom 是一個有用的hook來支持您這樣做。 這是我構建該hook的代碼:fkq28資訊網——每日最新資訊28at.com

import { onMounted, onUnmounted } from 'vue';export const useScrollToBottom = (callback = () => { }) => {  const handleScrolling = () => {    if ((window.innerHeight + window.scrollY) >= document.body.scrollHeight) {      callback();    }  }  onMounted(() => {    window.addEventListener('scroll', handleScrolling);  });  onUnmounted(() => {    window.removeEventListener('scroll', handleScrolling);  });}

在我的hook中,我通過條件“((window.innerHeight + window.scrollY) >= document.body.scrollHeight)”檢測到底部。 fkq28資訊網——每日最新資訊28at.com

我們有很多方法來檢測它。 如果您的項目符合其他條件,我們就使用它們。 以下是如何使用此hook的示例:fkq28資訊網——每日最新資訊28at.com

useScrollToBottom(() => { console.log('Scrolled to bottom') })

10、使用定時器

最后,我們來到最后一個鉤子。 這個鉤子的代碼比其他鉤子要長一些。 useTimer 將支持我們運行帶有一些選項的計時器,例如開始、暫停/恢復、停止。 fkq28資訊網——每日最新資訊28at.com

為此,我們需要使用 setInterval 方法,在該方法中,我們將推送處理函數。 在那里,我們需要檢查計時器的暫停狀態。 fkq28資訊網——每日最新資訊28at.com

如果計時器沒有暫停,我們只需要調用一個回調函數,該函數由用戶作為參數傳遞。 fkq28資訊網——每日最新資訊28at.com

為了支持用戶了解該計時器的當前暫停狀態,除了 useTimer 操作之外,還為他們提供一個變量 isPaused ,其值作為計時器的暫停狀態。 fkq28資訊網——每日最新資訊28at.com

這是我構建該hook的代碼:fkq28資訊網——每日最新資訊28at.com

import { ref, onUnmounted } from 'vue';export const useTimer = (callback = () => { }, step = 1000) => {  let timerVariableId = null;  let times = 0;  const isPaused = ref(false);  const stop = () => {    if (timerVariableId) {      clearInterval(timerVariableId);      timerVariableId = null;      resume();    }  }  const start = () => {    stop();    if (!timerVariableId) {      times = 0;      timerVariableId = setInterval(() => {        if (!isPaused.value) {          times++;          callback(times, step * times);        }      }, step)    }  }  const pause = () => {    isPaused.value = true;  }  const resume = () => {    isPaused.value = false;  }  onUnmounted(() => {    if (timerVariableId) {      clearInterval(timerVariableId);    }  })  return {    start,    stop,    pause,    resume,    isPaused  }}

這是使用 useTimer hook的一種方法:fkq28資訊網——每日最新資訊28at.com

function handleTimer(round) {          roundNumber.value = round;    }const {     start,    stop,    pause,    resume,    isPaused} = useTimer(handleTimer);

到這里,我已經跟大家分享了10 個有用的 Vue.js hook。 我認為它們的構建和使用都很簡單。 我只是為那些想要在 Vue.js 中使用這些鉤子的人提供一些注釋。fkq28資訊網——每日最新資訊28at.com

請記住刪除要添加到窗口的事件。 Vue 為我們提供了一個有用的組合 API onUnmounted ,它可以幫助我們在卸載hook之前運行我們的操作。 fkq28資訊網——每日最新資訊28at.com

在我構建的每個鉤子中,我總是刪除 onUnmounted 中的事件偵聽器。fkq28資訊網——每日最新資訊28at.com

僅在真正需要時才使用反應變量。 如果您想使用一個存儲某些內容的變量,并且希望在數據更改時同步其數據,那么,讓我們使用反應式變量。 fkq28資訊網——每日最新資訊28at.com

但如果它只是一個在我們的hook中存儲數據的變量(計數器、標志......),我認為你不需要使用反應變量。fkq28資訊網——每日最新資訊28at.com

如果可以的話,不要在鉤子中進行硬編碼(設置固定值)。 fkq28資訊網——每日最新資訊28at.com

我認為我們只需要將邏輯存儲在我們的hook中。 關于配置值,我們應該讓用戶填寫它(例如:useViewport)。fkq28資訊網——每日最新資訊28at.com

最后,在我的文章中,我與您分享了10 個有用的 Vue 自定義hook,我希望它們對您有所幫助。 Vue.js 是一個很棒的框架,我希望你可以用它構建更多很棒的東西。 fkq28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-11829-0.html十個有用的 Vue.js 自定義 Hook

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 您可能會錯過的七個有用的 GIT 命令

下一篇: 微軟在 GitHub 上線開發工具包,助力開發者使用 Rust 語言編寫 Windows 驅動

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美在线|欧美| 亚洲黑丝在线| 国产精品女人网站| 国产欧美日韩不卡| 亚洲电影av在线| 99re视频这里只有精品| 亚洲一级电影| 久久久亚洲高清| 欧美久久久久久蜜桃| 欧美日韩亚洲激情| 国产乱人伦精品一区二区| 国产专区综合网| 亚洲久久一区| 香蕉久久夜色| 欧美成人精品一区二区三区| 国产精品白丝黑袜喷水久久久| 国产美女精品人人做人人爽| 精品成人在线视频| 一区二区三区欧美日韩| 欧美一区二区视频网站| 欧美交受高潮1| 国产日本亚洲高清| 亚洲美女av网站| 久久激情网站| 欧美性猛交xxxx乱大交退制版 | 欧美午夜女人视频在线| 国产一区91| 夜夜嗨av一区二区三区免费区| 欧美一区二区三区精品| 欧美日本视频在线| 狠狠爱成人网| 亚洲影视在线播放| 欧美激情第10页| 国产一区二区成人久久免费影院| 一本不卡影院| 免费亚洲电影| 国产亚洲精品7777| 亚洲视频免费| 欧美激情精品久久久久久黑人 | 亚洲一卡久久| 欧美寡妇偷汉性猛交| 国产午夜精品美女视频明星a级 | 在线看欧美日韩| 欧美一区二视频在线免费观看| 欧美日韩精品伦理作品在线免费观看| 国产真实久久| 午夜精品在线观看| 欧美视频三区在线播放| 亚洲欧洲一区| 久久综合色综合88| 国产一级久久| 欧美在线观看视频在线 | 亚洲美女网站| 美国三级日本三级久久99| 国产婷婷一区二区| 亚洲制服少妇| 欧美亚州在线观看| 日韩手机在线导航| 欧美大尺度在线观看| 精品白丝av| 久久九九精品99国产精品| 噜噜噜噜噜久久久久久91| 国产一本一道久久香蕉| 先锋影院在线亚洲| 国产精品久久毛片a| 亚洲午夜在线观看视频在线| 欧美日韩午夜| 一本到高清视频免费精品| 欧美精品免费观看二区| 91久久亚洲| 欧美不卡三区| 最近中文字幕mv在线一区二区三区四区| 久久免费高清| 一区国产精品| 噜噜噜91成人网| 亚洲国产欧美在线人成| 欧美va亚洲va国产综合| 亚洲国产毛片完整版| 欧美不卡在线视频| 亚洲精品美女久久7777777| 欧美激情第二页| 亚洲精品字幕| 欧美日精品一区视频| 宅男噜噜噜66一区二区66| 欧美日韩综合| 亚洲自拍偷拍麻豆| 国产女精品视频网站免费 | 欧美一区二区三区四区高清| 国产欧美日韩亚州综合| 久久超碰97中文字幕| 今天的高清视频免费播放成人 | 国产视频亚洲| 久久久人成影片一区二区三区| 极品裸体白嫩激情啪啪国产精品 | 国产亚洲福利| 久久久另类综合| 亚洲国产精品久久久久秋霞不卡| 欧美sm视频| 亚洲桃色在线一区| 国产精品日韩欧美一区二区三区 | …久久精品99久久香蕉国产| 欧美va天堂| aa级大片欧美三级| 国产精品欧美日韩一区| 欧美专区第一页| 黄色亚洲免费| 欧美激情视频一区二区三区在线播放 | 国产午夜精品久久| 久久综合九九| 蜜臀久久99精品久久久久久9 | 国产有码在线一区二区视频| 久久尤物视频| 99精品国产高清一区二区| 国产精品免费aⅴ片在线观看| 久久国产直播| 亚洲电影免费观看高清完整版在线 | 影音先锋中文字幕一区| 欧美精品日韩精品| 亚洲欧美国产制服动漫| 黄色av日韩| 欧美日韩高清不卡| 欧美一区二区三区视频在线观看 | 国产综合久久| 欧美精品性视频| 午夜久久久久久| 亚洲国产高清在线| 国产精品久久久久久户外露出| 久久er精品视频| 亚洲欧洲在线看| 国产精品影音先锋| 欧美a级大片| 午夜精品久久久久| 亚洲国产91精品在线观看| 国产精品久久久久久久久| 久久亚洲精品网站| 一区二区三区四区五区精品| 黑人极品videos精品欧美裸| 欧美三级在线视频| 久久亚洲视频| 亚洲综合色噜噜狠狠| 亚洲国产精品专区久久| 国产精品一二一区| 欧美成人资源网| 欧美在线观看一二区| 一本久道久久久| 亚洲成人自拍视频| 国产精品综合久久久| 欧美乱妇高清无乱码| 久久人人爽人人爽| 午夜精品国产精品大乳美女| 亚洲精品综合| 激情综合亚洲| 国产精品一区二区在线观看网站 | 99riav国产精品| 国内成人精品2018免费看| 欧美三级欧美一级| 麻豆freexxxx性91精品| 亚洲欧美日韩一区| 日韩午夜电影在线观看| 亚洲成人在线视频播放| 国产午夜精品全部视频播放| 欧美日韩国产美女| 久热精品在线视频| 小处雏高清一区二区三区| 一区二区三区精品| 最新国产の精品合集bt伙计| 国产一区二区三区久久精品| 国产精品久久久久久久久久免费看| 欧美福利电影在线观看| 久久久综合香蕉尹人综合网| 午夜一区二区三区不卡视频| 在线视频欧美精品| 亚洲另类一区二区| 亚洲国产91| 激情综合电影网| 国产一区二区日韩精品欧美精品 | 亚洲成色777777女色窝| 国产主播在线一区| 国产午夜精品理论片a级大结局| 国产精品入口66mio| 欧美性猛交xxxx免费看久久久| 欧美精品三区| 欧美激情国产高清| 欧美肥婆bbw| 欧美不卡三区| 欧美国产精品v| 欧美成年人在线观看| 美女尤物久久精品| 免费h精品视频在线播放| 久久综合激情| 免费看精品久久片| 免费日韩av| 欧美成人日本| 欧美激情亚洲另类| 欧美精品福利视频| 欧美精品免费在线观看| 欧美人与禽性xxxxx杂性| 欧美国产乱视频| 女仆av观看一区| 欧美精品日韩精品| 欧美日韩理论| 欧美性做爰猛烈叫床潮| 国产精品欧美在线| 国产欧美一区二区三区视频 |