react怎么实现响应式?

在 React 中实现响应式布局通常有三大类方案:


✅ 一、用 CSS 实现响应式(最常用)

React 本质上只是 UI 渲染库,真正的响应式布局还是依靠 CSS 来完成。


1. 使用媒体查询(Media Query)

最基础也最通用的方法:

复制代码
.container {
  width: 100%;
}

@media (max-width: 768px) {
  .container {
    padding: 12px;
  }
}

@media (min-width: 1024px) {
  .container {
    padding: 24px;
  }
}

React 组件引用即可:

复制代码
<div className="container">内容</div>

2. 使用 Flex + Grid 自适应布局

例如:

复制代码
.list {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 16px;
}

<div className="list">
  <Card />
  <Card />
  <Card />
</div>

浏览器会自动根据屏幕宽度调整列数。


3. 使用响应式 CSS 框架

如果你不想写媒体查询,可以使用:

🧩 Ant Design

复制代码
import { Row, Col } from "antd";

<Row gutter={16}>
  <Col xs={24} sm={12} md={8} lg={6}>内容</Col>
  <Col xs={24} sm={12} md={8} lg={6}>内容</Col>
</Row>

🧩 Bootstrap

🧩 Tailwind CSS(极推荐)

示例:

复制代码
<div className="p-4 md:p-8 lg:p-16">
  <p className="text-base md:text-xl lg:text-2xl">
    响应式文字
  </p>
</div>

✅ 二、在 React 中用 JS 监听窗口尺寸(更灵活)

当你需要根据屏幕宽度动态调整 组件逻辑 (例如渲染不同组件)时,你可以使用 useEffect + window.resize:

复制代码
import { useState, useEffect } from "react";

function useWindowWidth() {
  const [width, setWidth] = useState(window.innerWidth);

  useEffect(() => {
    const handleResize = () => setWidth(window.innerWidth);
    window.addEventListener("resize", handleResize);
    return () => window.removeEventListener("resize", handleResize);
  }, []);

  return width;
}

使用:

复制代码
const width = useWindowWidth();
return width < 768 ? <MobileMenu /> : <DesktopMenu />;

✅ 三、使用成熟的 Hook 库

1. useMediaQuery(推荐)

例如 @uidotdev/usehooks:

复制代码
npm install @uidotdev/usehooks

import { useMediaQuery } from "@uidotdev/usehooks";

const isSmall = useMediaQuery("(max-width: 768px)");

return (
  <div>{isSmall ? "移动端" : "桌面端"}</div>
);

2. react-responsive

复制代码
npm i react-responsive

import { useMediaQuery } from "react-responsive";

const isTabletOrMobile = useMediaQuery({ query: "(max-width: 768px)" });

return <div>{isTabletOrMobile ? "手机" : "电脑"}</div>;

📌 总结:最佳实践

场景 最佳方案
单纯布局适配 CSS Media Query / Grid / Flex
快速项目 / UI 库 AntD + Col/Row 或 Tailwind CSS
根据屏宽渲染不同组件 useMediaQuery / JS 监听宽度
有复杂交互、高度自定义 自己写 hook(useWindowWidth)

相关推荐
粥里有勺糖12 分钟前
安利一下最近用的桌面“Agent” | T3 Code
前端·github·ai编程
xy345318 分钟前
Axure 9.0 动态面板基本操作
前端·ui·html·axure·原型·产品设计
不停喝水26 分钟前
【前端转全栈java速通课】 项目实战④7-11节 操作数据库-登录-注册-修改密码-注销-mubatis-plus简化crud-
java·前端·数据库
一水鉴天1 小时前
统一对象拓扑(UOT)设计全链定稿:从三件事分离到三继承 之1 20261010(豆包“查看聊天内容”继续)
前端·css
栖凤1 小时前
Java 的 try-catch 在 Agent 里失效了,我用了 5 个模式才兜住
java·前端·python
粥里有勺糖2 小时前
视野修炼第136期 | 前端小恐龙"Deno"被收购
前端·github·ai编程
修炼的dance2 小时前
页面塞了13.88 MB字体,导出的PDF只有71 KB
前端
qq_369173632 小时前
如何将 AI 生成的 HTML 网页发布成在线链接?不用自己搭建服务器
前端·人工智能·html·效率工具·html 发布
风花一世月2 小时前
⚡ 我把一座含氢能源园区搬进了浏览器(五类能流实时算守恒,在线直接玩)
前端·人工智能
羲云2 小时前
Claude 越界事件之后:Agent 权限设计为什么不能只靠提示词
前端