useState惰性初始化
export function useWindowSize(): WindowSize {
const [size, setSize] = useState<WindowSize>(() => {
if (typeof window === "undefined") {
return { width: 1024, height: 768 };
}
return {
width: window.innerWidth,
height: window.innerHeight,
};
});
- useState 为什么可以传匿名函数? 通常我们要么传一个值,要么传一个函数。传入函数这种写法叫做 「惰性初始化」 (Lazy Initialization)。
为什么要这么做? 性能优化: 如果初始值的计算非常消耗性能(比如读取 LocalStorage、进行复杂数学计算),通过传入函数,React 只会在组件首次渲染时执行一次这个函数。如果不传函数直接算,那么每次组件重新渲染(Re-render)时,这个计算逻辑都会跑一遍,虽然结果只在第一次有用,后续都会被忽略,但这造成了浪费。 兼容 SSR (服务端渲染): 这是你代码中最重要的原因。
