React 是由 Meta(前 Facebook)开发并开源的 JavaScript UI 库,专注于构建用户界面。它于 2013 年开源,目前已成为最流行的前端技术之一。

react 核心概念

组件(Component)

React 的核心单元是组件(Component)。组件是一个返回 UI 描述的函数(或类),可以像拼积木一样组合成复杂的界面。

function Greeting({ name }) {
  return <h1>Hello, {name}!</h1>;
}

组件分为两类:

  • 函数组件:现代 React 的主流写法,配合 Hooks 使用
  • 类组件:早期写法,新项目不推荐使用

JSX

JSX 是 JavaScript 的语法扩展,允许在 JS 文件中写类似 HTML 的结构。它不是 HTML,会被编译工具(如 Babel、SWC)编译为 React.createElement() 调用。

const element = <div className="container">Hello</div>;

// 编译后等价于:
const element = React.createElement("div", { className: "container" }, "Hello");

详见:JSX 介绍

Props

Props(属性)是组件的输入,由父组件传入,在子组件内部是只读的。

function Button({ label, onClick }) {
  return <button onClick={onClick}>{label}</button>;
}

// 使用
<Button label="提交" onClick={() => console.log("clicked")} />

State

State(状态)是组件内部管理的可变数据。状态变化会触发组件重新渲染。

import { useState } from "react";

function Counter() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>当前计数:{count}</p>
      <button onClick={() => setCount(count + 1)}>+1</button>
    </div>
  );
}

虚拟 DOM

React 在内存中维护一棵虚拟 DOM 树。每次状态更新时,React 通过 Diffing 算法对比新旧虚拟 DOM,计算出最小变更集,再批量更新真实 DOM,从而提升性能。

详见:Virtual DOM

Hooks

Hooks 是 React 16.8 引入的特性,让函数组件也能使用状态和生命周期功能。

useState

管理局部状态。

const [value, setValue] = useState(initialValue);

useEffect

处理副作用(如数据请求、订阅、手动 DOM 操作)。

useEffect(() => {
  // 副作用逻辑
  fetchData();

  return () => {
    // 清理函数(组件卸载时执行)
  };
}, [dependency]); // 依赖数组

依赖数组规则:

  • 省略 → 每次渲染后都执行
  • [] → 只在挂载时执行一次
  • [a, b] → a 或 b 变化时执行

useContext

订阅 React Context,用于跨组件层级传递数据(避免 prop drilling)。

const theme = useContext(ThemeContext);

useRef

持有一个可变引用,变更不触发重渲染。常用于访问 DOM 元素或保存不需要渲染的值。

const inputRef = useRef(null);

// 访问 DOM
inputRef.current.focus();

useMemo / useCallback

用于性能优化,缓存计算结果或函数引用,避免不必要的重计算和子组件重渲染。

const result = useMemo(() => expensiveCalc(a, b), [a, b]);
const handleClick = useCallback(() => doSomething(id), [id]);

数据流

React 遵循单向数据流:数据从父组件通过 Props 流向子组件,子组件通过回调函数向父组件传递事件。

父组件 → props → 子组件
子组件 → callback → 父组件

当多个组件需要共享状态时,通常将状态提升到最近的公共父组件,或使用 Context / 状态管理库(如 Jotai、Zustand、Redux)。

生命周期

函数组件通过 useEffect 模拟类组件的生命周期阶段:

生命周期 类组件 函数组件
挂载后 componentDidMount useEffect(() => {}, [])
更新后 componentDidUpdate useEffect(() => {}, [dep])
卸载前 componentWillUnmount useEffect 返回的清理函数

与框架的关系

React 本身只是 UI 库,不包含路由、数据请求、SSR 等能力。实际项目通常搭配框架使用:

框架 特点
Next.js 生产首选,支持 SSR / SSG / RSC,Vercel 出品
Remix 以 Web 标准为中心,强调服务端渲染
Vite + React 纯 SPA,构建快,适合后台管理系统

React 与 ReactJS 的关系

React 和 ReactJS 是同一个东西,只是叫法不同。React 是 Meta(前 Facebook)在 2013 年开源时的官方名称;ReactJS 是早期社区的非正式叫法,加 “JS” 后缀是为了与其他同名项目区分。现在官方文档、npm 包(react)、GitHub 仓库全部统一使用 React,ReactJS 这一叫法已逐渐淡出。

版本演进

版本 年份 关键变化
0.x 2013–2015 早期版本,JSX 还在实验阶段
v15 2016 稳定期,广泛采用
v16 2017 重写核心(Fiber 架构),引入 Error Boundary
v16.8 2019 Hooks 正式发布,是最重大的 API 转折点,社区全面转向函数式组件
v17 2020 过渡版,无新特性,主要改善升级体验
v18 2022 并发模式(Concurrent Features)、useTransition、自动批处理
v19 2024 React Compiler(自动 memoization)、Server Components 稳定、Actions API、use() hook

v16.8(Hooks)是最关键的分界线:之前以 Class 组件为主,之后社区全面转向函数式组件 + Hooks 写法。

参考资料