返回顶部
首页 > 资讯 > 前端开发 > JavaScript >十个有用的自定义Vue钩子函数总结
  • 426
分享到

十个有用的自定义Vue钩子函数总结

2024-04-02 19:04:59 426人浏览 独家记忆
摘要

目录useWindowResizeuseStorageuseNetworkStatususeCopyToClipboarduseThemeusePageVisibilityuseVi

Vue 是我使用的第一个 js 框架。可以说,Vue 是我进入javascript世界的第一道门之一。目前,Vue 仍然是一个很棒的框架。随着 composition api 的出现,Vue 只会有更大的发展。在这篇文章中,我将介绍 10 个有用的自定义钩子,让我们的代码更加好看。

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://lsjlt.com/news/145324.html(转载时请注明来源链接)

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

猜你喜欢
  • 十个有用的自定义Vue钩子函数总结
    目录useWindowResizeuseStorageuseNetworkStatususeCopyToClipboarduseThemeusePageVisibilityuseVi...
    99+
    2024-04-02
  • 怎么自定义Vue钩子函数
    这篇文章主要讲解了“怎么自定义Vue钩子函数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么自定义Vue钩子函数”吧!useWindowResize这是一个基本的钩子,因为它被用在很多项目...
    99+
    2023-06-29
  • vue自定义指令directives及其常用钩子函数说明
    目录自定义指令directives及常用钩子函数说明钩子函数vue 全局定义局部定义(vue-cli)钩子函数里面的参数vue 自定义指令 directives选项dire...
    99+
    2024-04-02
  • shell自定义函数的6个特点总结
    最近系统的学习了一下shell的函数,总体感觉根其他语言的函数差不多,不过它也有自身的特点 一,调用函数必须在定义函数的后,不然会报错的 fun fun (){ echo "aaaaaa" } fu...
    99+
    2022-06-04
    自定义 函数 shell
  • vue自定义指令directives及其常用钩子函数的示例分析
    这篇文章主要为大家分析了vue自定义指令directives及其常用钩子函数的示例分析的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“vue自定义指令dire...
    99+
    2023-06-28
  • Vue中钩子函数有什么用
    这篇文章给大家分享的是有关Vue中钩子函数有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Vue-Router导航守卫有的时候,我们需要通过路由来进行一些操作,比如最常见的...
    99+
    2024-04-02
  • vue钩子函数的作用是什么
    Vue钩子函数的作用是在组件生命周期的不同阶段执行特定的代码逻辑。它们使开发者能够在组件的不同生命周期阶段进行自定义操作,以满足不同...
    99+
    2023-08-08
    vue
  • vue的生命周期钩子函数有哪些
    vue的生命周期钩子函数有:1.beforeCreate,对应阶段为创建前;2.created,对应阶段为创建后;3.beforemount,对应阶段为载入前;4.mounted,对应阶段为载入后;5.beforeUpdate,对应阶段为更...
    99+
    2024-04-02
  • Vue生命周期中的八个钩子函数相机
    目录1、beforeCreate和created函数2、beforeMount和mounted函数3、beforeUpdate和updated函数4、beforeDestroy和de...
    99+
    2024-04-02
  • python钩子函数的作用有哪些
    Python钩子函数的作用有以下几个: 在特定事件发生时触发执行。钩子函数可以在特定事件发生时被调用,比如在程序启动、关闭、异常...
    99+
    2023-10-24
    python
  • 理解Vue2.x和Vue3.x自定义指令用法及钩子函数原理
    目录Vue2.x用法全局注册局部注册使用钩子函数钩子函数的参数Vue3.x用法全局注册局部注册使用钩子函数较 Vue2.x 相比, 钩子函数有变化Vue2.x用法 全局注册 Vue....
    99+
    2024-04-02
  • Vue中callHook钩子函数的作用是什么
    这期内容当中小编将会给大家带来有关Vue中callHook钩子函数的作用是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Vue实例在不同的生命周期阶段,都调用了cal...
    99+
    2024-04-02
  • vue的生命周期钩子函数怎么应用
    本篇内容介绍了“vue的生命周期钩子函数怎么应用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在vue中,生命周期钩子函数指的是当生命周期经...
    99+
    2023-06-29
  • Android中使用自定义ViewGroup的总结
    分类 自定义Layout可以分为两种情况。 自定义ViewGroup,创造出一些不同于LinearLayout,RelativeLayout等之类的ViewGroup。比如...
    99+
    2022-06-06
    Android
  • 如何使用自定义结构定义通用函数而不列出所有结构?
    在PHP中,如果我们想要使用自定义结构来定义通用函数,而不必列出所有的结构,有一个高效的方法可以实现。这种方法是通过使用可变数量的参数来达到目的。通过在函数定义中使用省略号(...)作...
    99+
    2024-02-09
  • Android自定义view 你所需要知道的基本函数总结
    Android自定义view 你所需要知道的基本函数 首先 往Canvas上面draw需要一个Paint。 画笔常用的函数有哪些呢。由于木有调试环境,函数基本上默写,有错请评论...
    99+
    2022-06-06
    view 函数 Android
  • Vue生命周期中的八个钩子函数相机是怎样的
    Vue生命周期中的八个钩子函数相机是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、beforeCreate和created函数beforeCreate和created...
    99+
    2023-06-22
  • vue中自定义组件双向绑定的三种方法总结
    目录1. 父组件使用v-model绑定2. 父组件使用v-model绑定3. 父组件使用:name.sync绑定官方文档地址 1. 父组件使用v-model绑定 子组件props接收...
    99+
    2024-04-02
  • vue button的@click方法无效钩子函数没有执行问题
    目录Vue项目中使用button绑定click事件事件无法触发methods中的方法解决办法跨域问题userData is not definedVue的第四个bug 钩子函数(mo...
    99+
    2024-04-02
  • MySQL基础篇(03):系统和自定义函数总结,触发器使用详
    本文源码:GitHub·点这里 || GitEE·点这里 一、系统封装函数 MySQL 有很多内置的函数,可以快速解决开发中的一些业务需求,大概包括流程控制函数,数值型函数、字符串型函数、日期时间函数...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作