设计思路
- 初始值处理:通过
window.innerWidth
获取初始窗口宽度,并根据这个宽度判断初始布局模式。
- 依赖管理:使用
useEffect
Hook来监听窗口大小变化,依赖数组为空,确保只在组件挂载和卸载时执行副作用。在副作用函数中,使用window.addEventListener
添加窗口大小变化的监听,在组件卸载时使用window.removeEventListener
移除监听,以避免内存泄漏。
- 状态管理:使用
useState
Hook来存储当前窗口宽度和布局模式。
自定义Hook代码
import { useState, useEffect } from 'react';
const useWindowSize = () => {
const [windowWidth, setWindowWidth] = useState(window.innerWidth);
const [layoutMode, setLayoutMode] = useState(window.innerWidth < 768? 'mobile' : 'desktop');
useEffect(() => {
const handleResize = () => {
const width = window.innerWidth;
setWindowWidth(width);
setLayoutMode(width < 768? 'mobile' : 'desktop');
};
window.addEventListener('resize', handleResize);
return () => {
window.removeEventListener('resize', handleResize);
};
}, []);
return { windowWidth, layoutMode };
};
export default useWindowSize;
在组件中使用的示例
import React from'react';
import useWindowSize from './useWindowSize';
const App = () => {
const { windowWidth, layoutMode } = useWindowSize();
return (
<div>
<p>Window Width: {windowWidth}</p>
<p>Layout Mode: {layoutMode}</p>
</div>
);
};
export default App;