什么是 React?非开发者的通俗指南
React 是一个用于构建用户界面的 JavaScript 库,也就是人们看到并点击的那部分应用。你用一个个可复用的组件搭建屏幕,比如一个按钮、一张商品卡片或一整个页面;React 会让屏幕与你的数据保持同步:当数据变化时,React 会更新依赖该数据的页面部分。它由 Facebook(现为 Meta)创建,是开源项目,也是最广泛使用的网页应用构建方式之一。
用 AI 构建应用时,它为什么重要
如果你用 AI 工具构建网页应用,它很可能是用 React 写的。许多 AI 应用构建工具默认使用 React,因为它流行、文档完善,而且 AI 模型学习过的 React 代码数量极其庞大。
你不需要会写 React 也能用 AI 构建应用。但了解一点基础知识,能帮你:
- 准确地描述修改。 “把 ProductCard 组件里的价格加粗”比“让价格在某处更显眼”清楚得多。
- 理解错误信息。 像“Cannot read properties of undefined”或“Too many re-renders”这样的提示,就更容易读懂了。
- 做出合理的选择。 普通的 React 应用在浏览器中渲染,这会影响搜索可见性和首次加载速度。了解这一点,有助于你决定什么时候该要求采用不同的架构。
- 以后与开发者合作。 React 是常见技能,开发者通常可以很快接手一个 React 代码库。
一个日常类比
想想乐高积木。你不必从一整块石头上雕出整个模型,而是用标准的积木拼搭。几块积木拼成一个轮子;四个轮子加上其他部件,就成了一辆车。如果你想让每辆车的轮子都是红色的,只需修改一次轮子的设计。
React 组件就是这些积木。一个 Button 组件被用在 ProductCard 里,ProductCard 又用在 ProductGrid 里,而 ProductGrid 是 ShopPage 的一部分。修改一次 Button,应用里所有的按钮都会随之改变。
类比的另一半是:想象每当你修改说明书时,乐高模型都会自动重新搭建。这正是 React 的另一个诀窍:你描述在当前数据下屏幕应该是什么样子,React 会自行判断页面上需要改动什么。
核心概念
组件
组件就是一个返回一段界面的 JavaScript 函数。React 的文档将组件描述为拥有自身逻辑和外观的一部分界面。组件名以大写字母开头。
JSX
组件通常用 JSX 编写,它看起来像是混在 JavaScript 里的 HTML:
function Greeting() {
return <h1>Welcome back!</h1>;
}
JSX 并非必需,但 React 的文档指出大多数项目都会使用它。它在浏览器运行之前会被转换为普通的 JavaScript。
Props
Props 是传入组件的输入,就像可复用零件上的设置项:
<ProductCard name="Lavender Candle" price={24} />
同一个 ProductCard 可以显示任何商品。
State
State 是组件记住的、可以在应用运行时变化的信息,例如菜单是否打开、搜索框里输入了什么、购物车里有多少件商品。当 state 变化时,React 会重新渲染该组件,使屏幕与之保持一致。
Hooks
Hooks 是名称以 use 开头的函数,例如 useState(记住一个值)和 useEffect(在渲染后运行代码,比如获取数据)。你会在 AI 生成的 React 代码中频繁见到它们。
实例:购物车计数器
假设你的网店有一个“加入购物车”按钮,以及一个显示商品数量的购物车图标。用 React 写出来大致如下:
import { useState } from "react";
function Shop() {
const [cartCount, setCartCount] = useState(0);
return (
<div>
<CartIcon count={cartCount} />
<ProductCard
name="Lavender Candle"
price={24}
onAdd={() => setCartCount(cartCount + 1)}
/>
</div>
);
}
function CartIcon({ count }) {
return <span>Cart ({count})</span>;
}
function ProductCard({ name, price, onAdd }) {
return (
<div>
<h2>{name}</h2>
<p>${price}</p>
<button onClick={onAdd}>Add to cart</button>
</div>
);
}
当顾客点击“加入购物车”时会发生以下事情:
- 按钮的
onClick调用onAdd,onAdd再调用setCartCount。 - React 把
cartCount状态从 0 更新为 1。 - React 重新渲染
Shop,并把count={1}传给CartIcon。 - 页面显示“Cart (1)”。没有人写过“找到购物车文字并修改它”的代码——屏幕会跟随数据变化。
这里也有局限。这个计数保存在浏览器内存中。刷新页面后,它会回到 0。要保留购物车内容,你需要把它保存到持久的地方,比如 Cookie、浏览器存储,或通过后端存入数据库。React 负责屏幕,它并不负责存储你的数据。
React 在网页应用中的位置
| 组成部分 | 作用 | 常见选择 |
|---|---|---|
| UI 库 | 构建界面 | React |
| 语言 | 代码所用的编程语言 | JavaScript 或 TypeScript |
| 构建工具 | 把源代码转换为浏览器可加载的文件,并运行开发服务器 | Vite |
| 框架(可选) | 提供路由、服务端渲染、数据加载 | Next.js、React Router |
| 样式 | 决定外观 | Tailwind CSS、CSS 文件 |
| 后端 | 业务逻辑、数据、密钥 | Node.js、Python 等 |
| 数据库 | 存储数据 | Postgres 等 |
“Vite + React”应用在浏览器中渲染(即单页应用)。Next.js 应用可以先在服务器上渲染页面,这有助于搜索引擎抓取,也能加快首次加载速度。
常见术语解释
| 术语 | 含义 |
|---|---|
| 组件(Component) | 一个可复用的界面部件,以函数的形式编写。 |
| JSX | 写在 JavaScript 中、类似 HTML 的语法,用来描述组件。 |
| Props | 传入组件的输入。 |
| State | 组件记住的、会随时间变化的数据。 |
| Hook | 以 use 开头的函数,用于为组件添加状态等功能。 |
| 渲染 / 重新渲染(Render / re-render) | React 在变化之后重新计算屏幕应显示的内容。 |
| 单页应用(SPA) | 只加载一次,之后通过 JavaScript 更新页面、而不是加载新页面的应用。 |
| 服务端渲染(SSR) | 在发送给浏览器之前,先在服务器上生成页面的 HTML。 |
| npm 包 | 可以安装使用的可复用代码库,例如日期选择器或图表库。 |
| React Native | 用于构建原生移动应用的相关项目。 |
常见错误与误解
- “React 是一种编程语言。” 它是一个库,用 JavaScript(或 TypeScript)编写,并在其中使用。
- “React 会保存我的数据。” State 存在浏览器中,刷新后就会消失。需要长期保存的数据必须依赖后端和数据库。
- 把密钥写进 React 代码。 React 应用中的所有内容都会发送到访客的浏览器,因此放在那里的 API 密钥等于公开。密钥应保存在服务器端。
- “React 应用无法在搜索中排名。” 仅在客户端渲染对搜索不利,但预渲染或服务端渲染可以解决大部分问题。
- 巨型组件。 一个 1,000 行的组件,无论对人还是对 AI 来说,都很难安全地修改。请要求拆分成更小的组件。
- 以为 React 网页应用就是手机应用。 它在浏览器中运行,包括在手机上,但它并不是 App Store 中的应用。
可以向 AI 构建工具提出的要求
- “把这个页面拆分成小的、有名称的组件,并告诉我每个组件位于哪个文件中。”
- “让 ProductCard 组件可以复用,以 name、price 和 image 作为 props。”
- “把购物车保存到数据库中,这样刷新页面后内容也不会丢失。”
- “所有 API 密钥都保存在服务器端;React 代码应当调用我们自己的 API。”
- “为来自服务器的数据添加加载中和错误状态。”
- “如果这些页面的搜索可见性很重要,请对它们进行预渲染,或使用服务端渲染的架构。”
- “用通俗的语言解释这个错误是什么意思,以及它来自哪个组件。”
想了解更宏观的背景,可参阅前端与后端;想审查 AI 写出的代码,可参阅如何审查 AI 生成的代码。
Mythex 中的 React
除非你另外指定,Mythex 新建项目时会使用 Vite + React + TypeScript + Tailwind,并在你聊天时运行实时预览。你可以在第一条提示词中指定其他架构,例如“使用 Next.js”或“纯静态 HTML 落地页”,Mythex 会根据你的描述来选择;没有专门的设置页面。关于技术如何选定,参阅文档中的技术选择页面。免费版的代码编辑器为只读;在 Pro 版中,你可以直接编辑 React 代码,并将项目导出,以便在其他地方继续开发。
常见问题
简单来说,什么是 React?
React 是一个用于构建用户界面的 JavaScript 库。你用一个个可复用的组件搭建屏幕,比如一个按钮、一张商品卡片或一整个页面;当底层数据变化时,React 会更新屏幕上的内容。
React 是框架还是库?
React 自称为库:它专注于构建界面。基于它的框架,比如 Next.js,会额外提供路由、服务端渲染和数据加载等功能。
为什么 AI 应用构建工具常用 React?
React 是最广泛使用的网页界面构建方式之一,因此有大量的 React 代码和文档可供 AI 模型学习。它的组件结构也便于进行小范围、有针对性的修改。
React 对 SEO 不利吗?
本身并不会。完全在浏览器中渲染的 React 应用,某些爬虫较难读取,但 React 也可以预渲染或在服务器端渲染,例如通过 Next.js,这基本上就能解决大部分问题。
React 和 React Native 是一回事吗?
不是。React 用于构建在浏览器中运行的网页界面,React Native 则沿用相同的理念来构建原生的 iOS 和 Android 应用。两者共享一些概念,但大部分构建模块并不相同。