广告
返回顶部
首页 > 资讯 > 精选 >怎么自定义Vue钩子函数
  • 342
分享到

怎么自定义Vue钩子函数

2023-06-29 22:06:22 342人浏览 薄情痞子
摘要

这篇文章主要讲解了“怎么自定义Vue钩子函数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么自定义Vue钩子函数”吧!useWindowResize这是一个基本的钩子,因为它被用在很多项目

这篇文章主要讲解了“怎么自定义Vue钩子函数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么自定义Vue钩子函数”吧!

useWindowResize

这是一个基本的钩子,因为它被用在很多项目中.

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  }}

使用就更简单了,只需要调用这个钩子就可以获得 window 的宽度和高度。

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

useStorage

你想通过在 session storage 或 local storage 中存储数据的值来持久化数据,并将该值绑定到视图?有了一个简单的钩子--useStorage,这将变得非常容易。我们只需要创建一个钩子来返回从存储空间得到的数据,以及一个函数来在我们想要改变数据时将其存储在存储空间。下面是我的钩子。

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** 来格式化数据。如果你不想格式化它,你可以删除它。下面是一个如何使用这个钩子的例子。

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

useNetworkStatus

这是一个有用的钩子,支持检查网络连接的状态。为了实现这个钩子,我们需要为事件 "在线"和 "离线"添加事件监听器。在事件中,我们只是调用一个回调函数,参数为网络状态。下面是我的代码。

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);  })}

调用方式:

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

useCopyToClipboard

剪切板是一个比较常见的功能,我们也可以将它封装成 hook,代码如下所示:

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;  }}

使用如下:

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

useTheme

只是一个简短的钩子来改变网站的主题。它可以帮助我们轻松地切换网站的主题,只需用主题名称调用这个钩子。下面是一个我用来定义主题变量的CSS代码例子。

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

要改变主题,只需要做一个自定义的钩子,它返回一个函数来通过主题名称改变主题。代码如下:

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

使用如下:

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

usePageVisibility

有时,当客户不专注于我们的网站时,我们需要做一些事情。要做到这一点,我们需要一些东西,让我们知道用户是否在关注。这是一个自定义的钩子。我把它叫做 PageVisibility,代码如下:

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);  });}

用法如下:

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

useViewport

有时我们会用宽度来检测当前的用户设备,这样我们就可以根据设备来处理对应的内容。这种场景,我们也可以封装成一个 hook,代码如下:

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  }}

使用如下:

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

useOnClickOutside

当 model 框弹出时,我们希望能点击其它区域关闭它,这个可以使用 clickOutSide,这种场景我们也可以封装成钩子,代码如下:

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);  });}

用法如下:

<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>

useScrollToBottom

除了分页列表,加载更多(或懒惰加载)是一种友好的加载数据的方式。特别是对于移动设备,几乎所有运行在移动设备上的应用程序都在其用户界面中应用了load more。要做到这一点,我们需要检测用户滚动到列表底部,并为该事件触发一个回调。

useScrollToBottom 是一个有用的钩子,支持你这样做。代码如下:

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);  });}

用法如下:

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

useTimer

useTimer 的代码比其他钩子要长一些。useTimer 支持运行一个带有一些选项的定时器,如开始、暂停/恢复、停止。要做到这一点,我们需要使用 setInterval 方法。在这里,我们需要检查定时器的暂停状态。如果定时器没有暂停,我们只需要调用一个回调函数,该函数由用户作为参数传递。为了支持用户了解该定时器当前的暂停状态,除了action useTimer之外,还要给他们一个变量 isPaused,其值为该定时器的暂停状态。代码如下:

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  }}

用法如下:

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

感谢各位的阅读,以上就是“怎么自定义Vue钩子函数”的内容了,经过本文的学习后,相信大家对怎么自定义Vue钩子函数这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 怎么自定义Vue钩子函数

本文链接: https://www.lsjlt.com/news/326562.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么自定义Vue钩子函数
    这篇文章主要讲解了“怎么自定义Vue钩子函数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么自定义Vue钩子函数”吧!useWindowResize这是一个基本的钩子,因为它被用在很多项目...
    99+
    2023-06-29
  • 十个有用的自定义Vue钩子函数总结
    目录useWindowResizeuseStorageuseNetworkStatususeCopyToClipboarduseThemeusePageVisibilityuseVi...
    99+
    2022-11-13
  • vue自定义指令directives及其常用钩子函数说明
    目录自定义指令directives及常用钩子函数说明钩子函数vue 全局定义局部定义(vue-cli)钩子函数里面的参数vue 自定义指令 directives选项dire...
    99+
    2022-11-13
  • Vue中钩子函数怎么用
    小编给大家分享一下Vue中钩子函数怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在Vue 中可以把一系列复杂的操作包装为一...
    99+
    2022-10-19
  • vue自定义指令directives及其常用钩子函数的示例分析
    这篇文章主要为大家分析了vue自定义指令directives及其常用钩子函数的示例分析的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“vue自定义指令dire...
    99+
    2023-06-28
  • Vue怎么自定义hook函数
    这篇文章主要介绍“Vue怎么自定义hook函数”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue怎么自定义hook函数”文章能帮助大家解决问题。定义什么是hook本质是一个函数,把 setup 函...
    99+
    2023-07-02
  • Vue怎么自定义hooks函数
    本文小编为大家详细介绍“Vue怎么自定义hooks函数”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue怎么自定义hooks函数”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在Vue当中,一个非常重要的功能就...
    99+
    2023-07-05
  • Vue中callHook钩子函数怎么调用
    这篇“Vue中callHook钩子函数怎么调用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue中callHook钩子函数...
    99+
    2023-07-04
  • Vue中钩子函数有什么用
    这篇文章给大家分享的是有关Vue中钩子函数有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Vue-Router导航守卫有的时候,我们需要通过路由来进行一些操作,比如最常见的...
    99+
    2022-10-19
  • vue钩子函数的作用是什么
    Vue钩子函数的作用是在组件生命周期的不同阶段执行特定的代码逻辑。它们使开发者能够在组件的不同生命周期阶段进行自定义操作,以满足不同...
    99+
    2023-08-08
    vue
  • linux钩子函数怎么调用
    在Linux中,钩子函数可以通过以下几种方式进行调用: 信号处理函数:可以使用signal()函数或sigaction()函数来...
    99+
    2023-10-24
    linux
  • PHP自定义扩展的钩子功能是什么
    本篇内容主要讲解“PHP自定义扩展的钩子功能是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP自定义扩展的钩子功能是什么”吧!php生命周期大概5个阶段,模块初始化阶段php_modul...
    99+
    2023-06-22
  • vue的生命周期钩子函数怎么应用
    本篇内容介绍了“vue的生命周期钩子函数怎么应用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在vue中,生命周期钩子函数指的是当生命周期经...
    99+
    2023-06-29
  • vue生命周期钩子函数是什么
    本篇内容主要讲解“vue生命周期钩子函数是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue生命周期钩子函数是什么”吧!vue生命周期钩子函数vue生命周期即为一个组件从出生到死亡的一个完...
    99+
    2023-06-30
  • 理解Vue2.x和Vue3.x自定义指令用法及钩子函数原理
    目录Vue2.x用法全局注册局部注册使用钩子函数钩子函数的参数Vue3.x用法全局注册局部注册使用钩子函数较 Vue2.x 相比, 钩子函数有变化Vue2.x用法 全局注册 Vue....
    99+
    2022-11-12
  • 详解Vue 自定义hook 函数
    目录定义使用封装发ajax请求的hook函数(ts版本)定义 什么是hook 本质是一个函数,把 setup 函数中使用的 Composition API (组合API)进行了封装类...
    99+
    2022-11-13
  • Vue中callHook钩子函数的作用是什么
    这期内容当中小编将会给大家带来有关Vue中callHook钩子函数的作用是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Vue实例在不同的生命周期阶段,都调用了cal...
    99+
    2022-10-19
  • 使用vue-router钩子函数怎么实现路由守卫
    这篇文章给大家介绍使用vue-router钩子函数怎么实现路由守卫,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。全局钩子函数beforeEach:beforeEach一共接收三个参数,分别是to、from、next;t...
    99+
    2023-06-14
  • shell中怎么自定义函数
    shell中怎么自定义函数,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、定义函数代码如下:function fname(){statements;}或代码如...
    99+
    2023-06-09
  • MySQL中怎么自定义函数
    MySQL中怎么自定义函数,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。控制流程函数  case...when  根据值判断返...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作