Vue3 Hooks 用法 scrollTop, mousemoveHandler,useCountDown

三個實例來自? ?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-yconst 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+=frameOffsetelse{
//這部分讓平滑動畫,直接賦值target.scrollTop=yclearInterval(timer)timer=null}},40)}}//響應式數據實時滾動距離const scrollTop=ref(0)const scrollHandler=(e)=>{
//同步scrolltopscrollTop.value = target.scrollTop}//組件掛載時候添加scrollhandleronMounted(()=>{target.addEventListener("scroll",scrollHandler)})//組件卸載時候移除scrollhandleronUnmounted(()=>{
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.pswp.cn/diannao/40839.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40839.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40839.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue css 鏈式布局模式

<div class"pp-wrap"> <div class"pp-left"><!--跳活動反思--><div class"even-box" v-for"(item,index) in trackingPtoPLeftList" :key"index" click"jumpReview(item)"><div …

echarts柱狀選中shadow陰影背景寬度設置

使用line&#xff0c;寬度增大到所需要的寬度&#xff0c;設置下顏色透明度就行 tooltip: {trigger: axis,//把陰影的層級往下降z:-15,axisPointer: {type: line,lineStyle: {color: rgba(150,150,150,0.3),width: 44,type: solid,},}, }, series: [{type: bar,barWidth:20,//…

python自動化辦公之BeautifulSoup爬取并解析html文本

用到的庫&#xff1a;BeautifulSoup 實現效果&#xff1a;爬取網站內容&#xff0c;拿到html文本并解析html文本 代碼&#xff1a; 先爬取 # 先導入requests包 import requests urlhttps://www.baidu.com responserequests.get(url) # 做1個斷言&#xff0c;如果執行成功&a…

【C語言】—— 文件操作(上)

【C語言】—— 文件操作&#xff08;上&#xff09; 一、 為什么使用文件二、 什么是文件2.1、 程序文件2.2、 數據文件2.3、 文件名2.4、二進制文件與文本文件 三、 文件的打開和關閉3.1、流和標準流&#xff08;1&#xff09;流&#xff08;2&#xff09;標準流 3.2、文件指針…

64.函數參數和指針變量

目錄 一.函數參數 二.函數參數和指針變量 三.視頻教程 一.函數參數 函數定義格式&#xff1a; 類型名 函數名(函數參數1,函數參數2...) {代碼段 } 如&#xff1a; int sum(int x&#xff0c;int y) {return xy; } 函數參數的類型可以是普通類型&#xff0c;也可以是指針類…

Python可實現各種算法庫之algorithms使用詳解

概要 在軟件開發和計算機科學領域,算法是解決問題的核心工具。Python 作為一種廣泛使用的編程語言,提供了多種內置和第三方庫來實現各種算法。algorithms 庫是一個集合了多種常用算法和數據結構的 Python 庫,旨在幫助開發者快速實現和應用這些算法。本文將詳細介紹 algorit…

QT元對象系統的用法技巧

文章目錄 聲明對象屬性獲取對象的屬性和方法通過對象名稱查找對象判斷對象的繼承關系給類添加額外的信息Qt的元對象系統是Qt框架的一個核心特性,它為對象提供了運行時類型信息、屬性系統、信號和槽機制以及動態屬性功能。這個系統是由Qt的元對象編譯器(MOC)支持的,MOC是一個預…

代碼隨想錄-DAY②-數組——leetcode 977 | 209

977 思路 使用兩個指針分別指向位置 0 和 n?1&#xff0c;每次比較兩個指針對應的數&#xff0c;選擇較大的那個逆序放入答案并移動指針。這種方法無需處理某一指針移動至邊界的情況。 時間復雜度&#xff1a;O(n) 空間復雜度&#xff1a;O(1) 代碼 class Solution { pub…

SpringCloud Feign 報錯 Request method ‘POST‘ not supported 的解決辦法

通過SpringCloud Feign 調用其他項目或微服務的接口方法時報Request method ‘POST‘ not supported 的錯誤&#xff1a; 問題出現原因&#xff1a; 可能的原因是 Feign 默認使用的請求方法為 POST&#xff0c;而不是 GET。另外也有可能是由于消費方法和接口方法使用的注解不…

拼多多店鋪電話采集軟件使用步驟解析

要快速訪問拼多多店鋪鏈接&#xff0c;可以使用一個提供快速訪問功能的拼多多店鋪鏈接程序。以下是使用步驟的簡要解析&#xff1a; 下載和安裝程序&#xff1a;首先&#xff0c;在可靠的下載平臺或官方網站上下載并安裝拼多多店鋪鏈接程序。確保選擇一個可信賴的程序&#xff…

Dialog設置背景透明和尺寸

class TestDialog(context: Context?,var clickListener: OnClickCallBack) : Dialog(context!!) {lateinit var binding:TestDialogBindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding TestDialogBinding.inflate(Lay…

軟件測試面試題:Redis的五種數據結構,以及使用的場景是什么?

字符串&#xff08;Strings&#xff09;&#xff1a;簡單直接&#xff0c;就像記事本一樣&#xff0c;用來存儲和快速訪問簡單的數據&#xff0c;比如緩存網頁或者保存用戶會話信息。 列表&#xff08;Lists&#xff09;&#xff1a;有序的數據集合&#xff0c;適合用來存儲按…

Ollama基于Casaos一鍵部署,并接入Dify知識庫,無需再為API付費

什么是Ollama Ollama是一個開源的大型語言模型服務工具&#xff0c;它幫助用戶快速的運行大模型。浪浪云將它做為一鍵部署通過簡單的安裝&#xff0c;用戶可以執行一條命令就可以運行開源大型語言模型&#xff0c;如 llama3 ,通以千問。極大地簡化了部署和管理LLM的過程&#x…

modelscope可控細節的長文檔摘要

modelscope可控細節的長文檔摘要嘗試 本文的想法來自今年OpenAI cookbook的一篇實踐&#xff1a;summarizing_long_documents&#xff0c;目標是演示如何以可控的細節程度總結大型文檔。 如果我們想讓大語言模型總結一份長文檔&#xff08;例如 10k 或更多tokens&#xff09;&…

6個步驟實現Postman接口壓力測試(建議收藏)

&#x1f345; 視頻學習&#xff1a;文末有免費的配套視頻可觀看 &#x1f345; 點擊文末小卡片 &#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 這里講是postman做接口并發測試&#xff0c;基礎用法不做贅述 1、第一步接口可以通的情況下點擊…

Proteus-51單片機-DS18B20多點測溫

DS18B20多點測溫 一、Proteus仿真演示 每個DS18B20都有一個唯一的64位序列號,這使得在同一總線上可以掛載多個傳感器,無需額外的地址分配。主機(通常為單片機)通過特定的時序控制,可以依次讀取各個DS18B20的溫度數據,實現分布式測溫。 二、代碼特點 三、開發環境介紹 本…

基于Arduino平臺開源小車的初步使用體驗

創作原因&#xff1a;偶然有機會接觸到基于Arduino平臺的開源智能小車&#xff0c;初步使用后與大家分享。因使用時間不常&#xff0c;可以純當個樂子看看&#xff0c;感謝大家的閱讀&#xff01; 圖&#xff1a;一款基于Arduino平臺的開源小車 一、開發環境 Misly&#xff1…

el表達式筆記及ognl

文章目錄 spel底層spel核心代碼TokenKind源碼 spel本地調試 spel示例spel list例子spel 對象例子spel list例子SimpleEvaluationContext 類找不到##### spel 如何表示包含(也就是like)? spel官網文檔 ognl表達式ognl和表達式語言的區別 這里重點說下SPEL(Spring Expression La…

shark云原生-日志體系-filebeat高級配置(適用于生產)

文章目錄 1. filebeat.inputs 靜態日志收集器2. filebeat.autodiscover 自動發現2.1. autodiscover 和 inputs2.2. 如何配置1.2.1. Providers 提供者1.2.2. Providers kubernetes templates1.2.3. 基于提示&#xff08;hints&#xff09;的自動發現支持的 **hints**的完整列表&…

windows搭建mqtt服務器,并配置DTU收集傳感器數據

1.下載并安裝emqx服務器 參考&#xff1a;Windows系統下本地MQTT服務器搭建&#xff08;保姆級教程&#xff09;_mqtt windows-CSDN博客 這里我下載的是emqx-5.3.0-windows-amd64.zip版本 下載好之后&#xff0c;放到服務器的路徑&#xff0c;我這里放的地方是&#xff1a;C…