【react實戰】如何實現監聽窗口大小變化

在日常開發場景中,監聽窗口變化是一個比較常見又很重要的業務功能,其實實現起來也很簡單,今天就來記錄一下具體的實現以及注意事項。

實現思路

在 React 中,可以通過監聽 window 的 resize 事件來檢測可視區域(viewport)的寬度變化。

其中實現的關鍵為:

  • window.innerWidth:獲取瀏覽器可視區域的寬度
  • window 的 resize 事件:監聽窗口大小的變化,但要注意防抖,避免觸發性能問題。雖然 useEffect 只執行兩次,但它注冊的 resize 事件回調會在每次窗口變化時觸發,而這個觸發頻率可能極高
  • 在組件銷毀時正確清理監聽器,移除 resize 事件監聽,避免內存泄漏。

具體實現

import React, { useEffect, useState } from 'react';export default function ViewportWidthTracker() {const [width, setWidth] = useState(window.innerWidth);useEffect(() => {// 監聽窗口大小變化let timeoutId = null;const handleResize = () => {// 每次觸發 resize 時清除之前的定時器clearTimeout(timeoutId);// 設置新的定時器,延遲 150ms 執行timeoutId = setTimeout(() => {setSize({ width: window.innerWidth, height: window.innerHeight });}, 150);};window.addEventListener('resize', handleResize);// 清理監聽器return () => {window.removeEventListener('resize', handleResize);};}, []); // 空依賴數組確保只在組件掛載和卸載時運行return (<div><h1>當前可視區域寬度: {width}px</h1></div>);
}

注意事項

  1. SSR 環境問題:在服務端渲染(如 Next.js)中,window 對象不存在。可通過條件判斷避免錯誤
useEffect(() => {if (typeof window === 'undefined') return;// 監聽邏輯
}, []);
  1. 組件卸載時清理:必須在 componentWillUnmount 或 useEffect 返回的清理函數中移除事件監聽,防止內存泄漏。

封裝自定義 hook

這個場景比較常見,可以封裝為自己的 hook,方便后續調用。

import { useState, useEffect } from 'react';function useWindowSize() {const [size, setSize] = useState({ width: 0, height: 0 });useEffect(() => {// 監聽窗口大小變化let timeoutId = null;const updateSize = () => {// 每次觸發 resize 時清除之前的定時器clearTimeout(timeoutId);// 設置新的定時器,延遲 150ms 執行timeoutId = setTimeout(() => {setSize({ width: window.innerWidth, height: window.innerHeight });}, 150);};window.addEventListener('resize', updateSize);updateSize();return () => window.removeEventListener('resize', updateSize);}, []);return size;
}// 使用自定義 Hook
function MyComponent() {const size = useWindowSize();return (<div>當前窗口: {size.width} x {size.height}</div>);
}

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/84428.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/84428.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/84428.shtml

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

相關文章

AVCap視頻處理成幀和音頻腳本

###############處理原視頻&#xff0c;使其格式和原數據一樣 import os import cv2 import subprocess import json from PIL import Image from pydub import AudioSegmentimport sys import shutil # &#x1f539; 第一步&#xff1a;強制檢測并設置FFmpeg路徑 &#x1f5…

數據冗余對企業運營的隱性成本

從客戶管理到供應鏈優化&#xff0c;再到市場分析&#xff0c;數據無處不在&#xff0c;數據已成為企業運營的核心驅動力。然而&#xff0c;隨著企業IT系統的多樣化和數據量的激增&#xff0c;數據冗余&#xff08;Data Redundancy&#xff09;問題逐漸浮出水面&#xff0c;成為…

HTML原生日期插件增加周次顯示

<div id="app" class="box box-info" style="border-top-color:white;"><!-- // 日期部分 --><div class="date-picker-container" style="position: relative; max-width: 200px;"><!-- 日期輸入框 -…

滲透測試PortSwigger Labs:遭遇html編碼和轉義符的反射型XSS

1 處是我們輸入的標簽被服務器 html 編碼后返回&#xff0c;被瀏覽器當作字符串顯示出來&#xff0c;無法執行 javascript 2 處是唯一能控制的地方&#xff0c;正好在script標簽范圍內&#xff0c;可以嘗試構造 依然存在轉移單引號&#xff0c;我們輸入轉義符\讓服務器添加的轉…

Ansible 錯誤處理:確保高效自動化

當 Ansible 收到命令的非零返回碼或模塊故障時,默認情況下,它會停止在該主機上的執行,并在其他主機上繼續執行。但是,在某些情況下,您可能需要不同的行為。有時非零返回碼表示成功。有時您希望一臺主機上的故障導致所有主機上的執行停止。Ansible 提供了處理這些情況的工具…

【無標題】NP完全問題的拓撲對偶統一解法 ——四色問題到P=NP的普適框架

NP完全問題的拓撲對偶統一解法 ——四色問題到PNP的普適框架 **摘要** 本文提出基于**拓撲膨脹-收縮對偶性**的計算理論框架&#xff0c;突破傳統NP完全性理論局限。通過將離散組合問題轉化為連續幾何問題&#xff0c;并引入規范場量子求解機制&#xff0c;實現四色問題、子…

【Zephyr 系列 19】打造 BLE 模塊完整 SDK:AT 命令系統 + 狀態機 + NVS + OTA 一體化構建

??關鍵詞:Zephyr、BLE 模塊、SDK 構建、AT 命令框架、有限狀態機、Flash 配置、MCUboot OTA ??面向讀者:希望將 BLE 項目標準化、封裝化、支持量產使用的開發團隊與架構師 ??預計字數:5500+ 字 ?? 背景與目標 在完成多個 BLE 功能模塊后,一個企業級產品往往需要:…

機器學習核心概念速覽

機器學習基本概念 有監督學習分類、回歸無監督學習聚類、降維 一維數組 import numpy as np data np.array([1,2,3,4,5]) print(data) print(data.shape) print(len(data.shape))[1 2 3 4 5] (5,) 1二維數組 data2 np.array([[1,2,3],[4,5,6]]) print(data2) print(data2…

在 Java 中實現一個標準 Service 接口,并通過配置動態選擇具體實現類供 Controller 調用

在 Java 中實現一個標準 Service 接口&#xff0c;并通過配置動態選擇具體實現類供 Controller 調用&#xff0c;是解耦和靈活擴展的常見設計模式。 需求分析 當你需要開發一個需要靈活切換業務實現的系統&#xff0c;比如不同環境使用不同策略&#xff08;如測試環境用Mock實…

input+disabled/readonly問題

背景&#xff1a; vue2elementui <el-input v-model"inputForm.projectName" class"input-font" :disabled"projectDisabled" placeholder"請選擇" :readonly"isReadonly"><el-button slot"append"…

Office2019下載安裝教程(2025最新永久方法)(附安裝包)

文章目錄 Office2019安裝包下載Office2019一鍵安裝步驟&#xff08;超詳細&#xff01;&#xff09; 大家好&#xff01;今天給大家帶來一篇超實用的Office2019專業版安裝教程&#xff01;作為日常辦公和學習的必備軟件&#xff0c;Office的安裝對很多朋友來說可能有點復雜&…

【編譯工具】(版本控制)Git + GitHub Actions:自動化工作流如何讓我的開發效率提升200%?

目錄 引言&#xff1a;現代開發中版本控制和 CI/CD 的重要性 一、Git&#xff1a;為什么它是版本控制的首選&#xff1f; &#xff08;1&#xff09;Git 的核心優勢 &#xff08;2&#xff09;Git 高效工作流示例 ① 功能開發流程 ② 緊急修復流程 二、GitHub Acti…

碼蹄杯真題分享

我的個人主頁 我的專欄&#xff1a; 人工智能領域、java-數據結構、Javase、C語言&#xff0c;MySQL&#xff0c;希望能幫助到大家&#xff01;&#xff01;&#xff01; 點贊&#x1f44d;收藏? 1&#xff1a;房間打掃&#xff08;題目鏈接&#xff09; 思路&#xff1a;要想…

小米玄戒O1架構深度解析(二):多核任務調度策略詳解

上篇文章中&#xff0c;就提到了小米玄戒O1的多核任務調度策略&#xff0c;但講得不夠詳細&#xff0c;尤其是對于完全公平調度器和能效感知調度&#xff0c;這次我們就深度剖析一下這兩種調度策略。 目錄 1. 完全公平調度器&#xff08;CFS&#xff09;1.1 完全公平調度基本原…

【技巧】win10和ubuntu互相掛在共享文件夾

回到目錄 【技巧】win10和ubuntu互相掛在共享文件夾 1. ubuntu掛載win10共享文件夾 $ sudo apt update $ sudo apt install cifs-utils $ sudo mkdir /mnt/[這里改為ubuntu共享目錄名] $ sudo mount -t cifs -o usernameadministrator //[這里改為win10機器IP]/[這里改為win…

線程(下)【Linux操作系統】

文章目錄 線程控制線程共享進程地址空間中的所有數據線程會瓜分進程的時間片線程相關庫函數庫函數&#xff1a;pthread_create庫函數&#xff1a;pthread_self庫函數&#xff1a;pthread_join庫函數&#xff1a;pthread_exit庫函數&#xff1a;pthread_cancel[盡量少用]庫函數&…

Linux 任務調度策略

&#x1f31f; 概述 Linux 內核以線程&#xff08;任務&#xff09;為單位進行調度&#xff0c;支持 SCHED_FIFO 和 SCHED_RR&#xff08;實時調度&#xff09;以及 SCHED_OTHER&#xff08;基于 CFS&#xff0c;非實時調度&#xff09;。 &#x1f50d; 調度策略 1. SCHED_…

芯片金屬層M1、M2區別

在芯片設計中&#xff0c;M1&#xff08;第一層金屬&#xff09;和 M2&#xff08;第二層金屬&#xff09;是常見的金屬層&#xff0c;它們在用途、布線方向、設計規則和應用場景等方面存在一些主要區別。以下是詳細對比&#xff1a; 1. 用途 M1&#xff08;第一層金屬&#x…

Linux離線環境下安裝Lean 4開發環境的完整指南

文章目錄 一、準備工作1. 在線環境下載必要文件2. 傳輸文件至離線環境 二、安裝elan工具鏈管理器1. 解壓并安裝elan2. 配置環境變量3. 驗證elan安裝 三、安裝Lean 4二進制包1. 解壓Lean 4二進制文件2. 注冊工具鏈到elan 四、安裝VS Code Lean 4插件1. 使用VS Code界面安裝插件 …

ffmpeg windows 32位編譯

ffmpeg windows 32位編譯 編譯后程序下載 編譯方式 自動編譯工具套件 – https://github.com/m-ab-s/media-autobuild_suite github克隆完成后&#xff0c;雙擊bat文件打開編譯窗口&#xff0c;注意git檢出的目錄需要簡短&#xff0c;最好選一個盤的根目錄。 選擇編譯版本…