useBreakpoints
响应式视口断点
useBreakpoints 接收一个断点名称到最小宽度(像素)的映射,并告诉你视口已达到哪些断点。它为每个断点订阅一对 window.matchMedia() 查询,因此组件只在视口跨越断点时重新渲染,而不是每次调整大小都渲染。视口宽度达到某个断点后,该断点名称的值为 true;greater、greaterOrEqual、smaller、smallerOrEqual 和 between 可以与任意断点比较。current 列出所有已达到的断点,active 是其中最大的一个。
使用场景
- 在 JavaScript 中切换布局,例如移动端使用抽屉、桌面端使用侧边栏
- 让 JavaScript 逻辑与 CSS 断点保持一致,例如用
breakpointsTailwind对应 Tailwind 的sm到2xl - 根据屏幕尺寸改变列数或条目数
注意事项
- SSR 安全:在服务端和水合期间,hook 假定视口宽度为
defaultWidth像素(默认0),水合完成后再切换到真实宽度,不会产生水合不匹配。 - 移动优先:断点是最小宽度。
between(a, b)在宽度从a起、到b之前(不含b)为 true。 - 可以传入内联对象:hook 按断点数值管理订阅,每次渲染传入新对象不会重新订阅。
- 相关 hooks:只需要单个任意查询时,使用
useMediaQuery。
Usage
Live Editor
function Demo() { const bp = useBreakpoints(breakpointsTailwind); return ( <div> <div>Active breakpoint: {bp.active ?? "below sm"}</div> <div>Reached: {bp.current.join(", ") || "none"}</div> <div>Smaller than md: {bp.smaller("md") ? "Yes" : "No"}</div> <div>Between md and xl: {bp.between("md", "xl") ? "Yes" : "No"}</div> </div> ); };
Result
API
Breakpoints
UseBreakpointsOptions
| 参数名 | 描述 | 类型 | 默认值 |
|---|---|---|---|
| defaultWidth | 在服务端和水合期间假定的视口宽度(像素)。可设为大多数访问者会看到的布局对应的宽度。 | number | 0 |
UseBreakpointsReturn
| 参数名 | 描述 | 类型 | 默认值 |
|---|---|---|---|
| greaterOrEqual | 视口宽度是否大于或等于该断点 | (k: K) => boolean (必填) | - |
| greater | 视口宽度是否大于该断点 | (k: K) => boolean (必填) | - |
| smaller | 视口宽度是否小于该断点 | (k: K) => boolean (必填) | - |
| smallerOrEqual | 视口宽度是否小于或等于该断点 | (k: K) => boolean (必填) | - |
| between | 视口宽度是否大于或等于 a 且小于 b | (a: K, b: K) => boolean (必填) | - |
| current | 视口已达到的所有断点,从小到大排列 | K[] (必填) | - |
| active | 视口已达到的最大断点,小于最小断点时为 undefined | K | undefined (必填) | - |
useBreakpoints
Returns
UseBreakpointsReturn<K>: 每个断点对应一个布尔值(视口宽度达到该断点时为 true),以及比较函数和当前、活动断点
Arguments
| 参数名 | 描述 | 类型 | 默认值 |
|---|---|---|---|
| breakpoints | 断点名称到其最小视口宽度(像素)的映射 | Breakpoints<K> (必填) | - |
| options | 可选参数 | UseBreakpointsOptions | undefined | - |