Vue3 Hooks 用法 scrollTop, mousemoveHandler,useCountDown

news2024/7/7 15:38:05

三个实例来自   learn_vue: 【教学工程】学习vue2/vue3 (gitee.com)

 

目录

1. 何为Hooks

 2. 使用场景

  3. 常见的 Hooks 函数

  4. 实例

 4.1简易hook 例子

 4.2 自定义scrolltop例子

 4.3 mousemoveHandler例子

 4.4 useCountDown例子


1. 何为Hooks

   Hooks 是一种函数,用于封装组件中的逻辑。它可以包含状态、计算属性、生命周期钩子等,并且可以在多个组件之间共享和复用。

 2. 使用场景

   - 逻辑复用:通过 Hooks,可以将一组相关的逻辑封装在一个函数中,提高代码的可复用性。
   - 代码组织:使得组件逻辑更加清晰,避免大型组件选项过于臃肿。
   - 提高可读性和维护性:将相关逻辑分离成多个小函数,使得每个函数的职责更加清晰,便于理       解和维护。

  3. 常见的 Hooks 函数

   -  reactive、ref、computed:用于创建响应式数据。
   - watch、watchEffect:用于监听数据变化。
   - onMounted、onUpdated、onUnmounted:用于处理组件的生命周期。
   -  自定义 Hooks:根据业务逻辑封装的自定义函数,例如下述提到的 useCountDown。

  4. 实例

     4.1简易hook 例子

import { ref } from 'vue';
export default function useCounter() {
  const count = ref(0);

  const increment = () => {
    count.value++;
  };

  return {
    count,
    increment,
  };
}

  下述,hooks不是一定要有state

    4.2 自定义scrolltop例子

  注意 一般hooks里包括一些函数钩子,比如mounted,注意 hooks里重要的是state一般被包裹在函数里面,这样不同组件调用 不会共享state

export default function (target=window,dataRef = null){
    let timer=null
    //一键回到顶部 时间默认1000毫秒
    const toTop=(millis=1000)=>{
    yScrollTo(0,millis)
    }
    const yScrollTo=(y,millis=500)=>{
    if(!timer){
    const offset = target.scrollTop-y
     const frameOffset = Math.abs(offset / (millis / 40));
     timer=setInterval(()=>{
     if(offset>0 && target.scrollTop-y >frameOffset)
     {
      target.scrollTop-=frameOffset
     }
     else if(offset<0 && y-target.scrollTop>0)
     target.scrollTop+=frameOffset
     else{
//这部分让平滑动画,直接赋值
     target.scrollTop=y
     clearInterval(timer)
     timer=null
     }
     },40)
    }
    }
    //响应式数据实时滚动距离
    const scrollTop=ref(0)
    const scrollHandler=(e)=>{
//同步scrolltop
    scrollTop.value = target.scrollTop
    }
    //组件挂载时候添加scrollhandler
    onMounted(()=>{
    target.addEventListener("scroll",scrollHandler)
    })
    //组件卸载时候移除scrollhandler
    onUnmounted(()=>{
target.removeEventListener("scroll", scrollHandler)
    })
    onActivated(()=>{
    if(dataRef){
    //如果存在要恢复的数据
    yScrollTo(dataRef.value)
    console.log("滚动位置已恢复为",dataRef.value)
    }
    })
    onDeactivated(()=>{
    if(dataRef){
    console.log("离开时滚动的位置",scrollTop.value)
    dataRef.value = scrollTop.value
    }
    })
    return scrollTop
}

函数两个参数,第一个参数 target=window,获取目标要滚动到的位置,第二个参数dataRef 如果提供 代表要缓存离开时候 当前滚动到的位置 方便下次回来时候恢复到dataRef的位置

防止同时多次调用滚动动画:
timer为空变送没有正在进行的滚动动画 可以启动一个新的滚动动画

4.3 mousemoveHandler例子

function useMouse(){
const state = reactive({
x:0,
y:0
})
const mousemoveHandler=(e)=>{
//更新实时数据
state.x = e.pageX
state.y  = e.pageY
}
//组件挂载时候建立mousemove事件监听器
onMounted(()=>{
window.addEventListener("mousemove",mousemoveHandler)
})
onUnmounted(()=>{
window.removeEventListener("mousemove",mousemoveHandler)
})
return toRefs(state)
//将state里的属性拆开每个都是响应式数据


}
export default mousemoveHandler

4.4 useCountDown例子

function getTimeDiffer(startDate, endDate){
let timeDiff = endDate-startDate
// 计算过去了多少天
var daysDiffer = parseInt(timeDiffer / (24 * 3600 * 1000));
// console.log(daysDiffer);

// 计算不足一天的时分秒 odd奇数,零头
var oddMillis = timeDiffer % (24 * 3600 * 1000);
var hoursDiffer = parseInt(oddMillis / (3600 * 1000));
// console.log(hoursDiffer);

// 不足一小时的零头毫秒
oddMillis = oddMillis % (3600 * 1000);
var minutesDiffer = parseInt(oddMillis / (60 * 1000));
// console.log(minutesDiffer);

// 计算秒
var secondsDiffer = Math.round((oddMillis % (60 * 1000)) / 1000);
// console.log(secondsDiffer);
return {
daysDiffer,
hoursDiffer,
minutesDiffer,
secondsDiffer,
}

}

const useCountDown = (targetDate)=>{
//targetDate: new Date(2023, 0, 1),
const state = reactive({
days:0,
hours:0,
minutes:0,
seconds:0
})

let timer = null
onMounted(()=>{
timer = setInterval(()=>{
const {daysDiffer,hoursDiffer,minutesDiffer,secondsDiffer}=getTimeDiffer(new Date(),targetDate)
state.days = daysDiffer;
state.hours = hoursDiffer;
state.minutes = minutesDiffer;
state.seconds = secondsDiffer;

},1000)
})
/* 组件卸载时移除定时器 */
onUnmounted(() => {
if (timer) {
clearInterval(timer);
console.log(“timer已移除”);
}
});

// {days,hours,minutes,seconds}
return toRefs(state);

}
export default useCountDown

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1894117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Android面试八股文】你是怎么保证Android设备的时间与服务器时间同步的?(使用NTP和TrueTime方案)

文章目录 一、网络时间协议(NTP)二、使用网络时间协议(NTP)2.1 使用系统提供的 NTP 服务器2.2 使用TrueTime2.2.1 引入TrueTime库2.2.2 初始化 TrueTime2.2.3 用法2.2.4 使用 TrueTime 获取时间2.2.4 自动更新时间2.2.5 注意事项二. 使用 HTTP 请求获取服务器时间2.1. 发送…

技术探索:利用Python库wxauto实现Windows微信客户端的全面自动化管理

项目地址&#xff1a;github-wxauto 点击即可访问 项目官网&#xff1a;wxauto 点击即可访问 &#x1f602;什么是wxauto? wxauto 是作者在2020年开发的一个基于 UIAutomation 的开源 Python 微信自动化库&#xff0c;最初只是一个简单的脚本&#xff0c;只能获取消息和发送…

同方威视受邀盛装亮相2024长三角快递物流展(杭州)助力行业物畅其流

同方威视技术股份有限公司携安全检测产品和综合解决方案&#xff0c;盛装亮相2024长三角快递物流展&#xff08;杭州&#xff09; 展位号&#xff1a;3C馆A07-1 时间&#xff1a;2024年7月8-10日 地址&#xff1a;杭州国际博览中心&#xff08;浙江省杭州市萧山区奔竞大道35…

【路由交换技术】Cisco Packet Tracer基础入门教程(五)

这一期我们来学习端口聚合&#xff0c;这是针对交换机的技术 前言 不知道大家有没有注意到&#xff0c;我们之前的实验在交换机与交换机之间只用一条线连接&#xff0c;像这样 通过今天的学习&#xff0c;我们要用两条线来连接交换机&#xff0c;就像这样&#xff08;为了能…

球形气膜:现代娱乐场馆的最佳选择—轻空间

随着科技的发展和人们对高品质生活的追求&#xff0c;娱乐场馆的建设迎来了新的变革。球形气膜结构凭借其独特的优势&#xff0c;逐渐成为现代娱乐场馆建设的最佳选择。轻空间将介绍球形气膜的优势&#xff0c;并探讨其在不同应用场景中的广泛应用。 球形气膜的优势 1. 独特的建…

Kotlin和Java的一些不同点

1.Kotlin 的变量是没有默认值的&#xff08;因此要求初始化&#xff09;&#xff0c;Java的成员变量是有默认值的 Java的成员变量&#xff1a; String name; // 默认值是 null int count; // 默认值是 0不过其实 Java 也只是成员变量有默认值&#xff0c;局部变量也是没有默…

以品质为初心,以创新为驱动,光明乳业闪耀第十五届中国奶业大会

2024年7月3日&#xff0c;以“数智赋能引领产业发展增长点&#xff0c;科技创新驱动奶业新质生产力”为主题的中国奶业协会第十五届奶业大会奶业20强&#xff08;D20&#xff09;论坛暨2024中国奶业展览会隆重召开&#xff0c;光明乳业党委书记、董事长黄黎明受邀出席会议&…

Linux 压测工具---ab

安装 yum -y install httpd-tools 本文用于压测k8s集群内pod&#xff0c;k8s集群master可直接测试pod ip 命令&#xff1a; ab -n 10000 -c 100 http://10.42.8.212/ 其中&#xff0c;-n表示请求数&#xff0c;-c表示并发数&#xff0c;ip必须有”/“&#xff0c;表示此目录…

如何清理电脑内存?让电脑运行如飞!

电脑内存&#xff08;RAM&#xff09;的清理对于维持系统的流畅运行至关重要。随着使用时间的增加&#xff0c;系统内存会被各种应用程序和后台进程占用&#xff0c;导致系统响应变慢&#xff0c;甚至出现卡顿现象。通过有效地清理内存&#xff0c;可以提升电脑的性能&#xff…

5.基于SpringBoot的SSMP整合案例-数据层开发

目录 1.新建项目 2.实体类开发&#xff1a; 2.1在pom.xml中增加Lombok坐标&#xff1a; 2.2添加Book实体类 3.数据层开发&#xff1a; 3.1 配置MyBatisPlus与Druid 3.2创建数据层接口 3.3写测试类 3.4点击运行&#xff1a; 4.数据层快速开发&#xff1a; 4.1配置MyB…

【数据结构】02.顺序表

一、顺序表的概念与结构 1.1线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构&#xff0…

HighConcurrencyCommFramework c++通讯服务器框架 :简介-信号处理

项目是4月份左右做的现在整理到博客上&#xff0c;顺便加深一下印象 介绍 项目描述:该项目是使用 C 实现的高并发服务器脚手架&#xff0c;包含线程池和连接池等技术&#xff0c;支持开发者进行二次开发复用&#xff0c;只需 要添加对应业务逻辑即可完成通信服务器、网络交易…

【Termius】详细说明MacOS中的SSH的客户端利器Termius

希望文章能给到你启发和灵感~ 如果觉得有帮助的话,点赞+关注+收藏支持一下博主哦~ 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境二、软件的安装2.1 Termius界面介绍2.1.1 Hosts 主机列表2.1.2 SFTP 文件传输2.1.3 Port ForWarding 端口转发2.1.4 Snippets 片…

afrog-漏洞扫描(挖洞)工具【了解安装使用详细】

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、afrog介绍 afrog 是一款性能卓越、快速稳定、PoC可定…

全面教程:在Ubuntu上快速部署ZeroTier,实现Windows与VSCode的局域网无缝访问

文章目录 1 背景介绍2 Windows上的操作3 Ubuntu上的操作4 连接 1 背景介绍 在现代工作环境中&#xff0c;远程访问公司内网的Ubuntu主机对于开发者来说是一项基本需求。然而&#xff0c;由于内网的限制&#xff0c;传统的远程控制软件如向日葵和todesk往往无法满足这一需求。作…

【后端面试题】【中间件】【NoSQL】MongoDB查询过程、ESR规则、覆盖索引的优化

任何中间件的面试说到底都是以高可用、高性能和高并发为主&#xff0c;而高性能和高并发基本是同时存在的。 性能优化一直被看作一个高级面试点&#xff0c;因为只有对原理了解得很透彻的人&#xff0c;在实践中才能找准性能优化的关键点&#xff0c;从而通过各种优化手段解决性…

YOLOv5改进 | 损失函数 | EIoU、SIoU、WIoU、DIoU、FocuSIoU等多种损失函数

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a; 《YOLOv5入门 …

VsCode允许JSON文件注释

打开设置 配置 输入&#xff1a;文件关联或者Files: Associations

Qt实现检测软件是否多开

Qt实现检测软件是否多开 在桌面软件开发中&#xff0c;软件通常要设置只允许存在一个进程&#xff0c;像一些熟知的音乐软件&#xff0c;QQ音乐这种。而这些软件在限制只有一个进程的同时&#xff0c;通常还会有双击桌面图标唤醒已运行的后台进程的功能。关于双击桌面唤醒已运…

Android广播机制

简介 某个网络的IP范围是192.168.0.XXX&#xff0c;子网 掩码是255.255.255.0&#xff0c;那么这个网络的广播地址就是192.168.0.255。广播数据包会被发送到同一 网络上的所有端口&#xff0c;这样在该网络中的每台主机都将会收到这条广播。为了便于进行系统级别的消息通知&…