React

返回 JavaScript框架

Meta 开源的声明式 UI 库,基于组件和单向数据流。核心理念:UI = f(state),状态驱动视图更新。


核心概念

JSX

const el = <h1 className="title">Hello, {name}</h1>
// 编译为
const el = React.createElement("h1", { className: "title" }, "Hello, ", name)

组件

// 函数组件(现代推荐)
function Card({ title, children }) {
  return <div className="card"><h2>{title}</h2>{children}</div>
}

Props & State

  • Props:父 → 子的只读数据,单向流动
  • State:组件内部可变数据,变更触发重新渲染

Hooks

Hook用途
useState局部状态
useEffect副作用(数据请求、订阅)
useContext消费 Context
useRefDOM 引用 / 持久化值(不触发渲染)
useMemo缓存计算结果
useCallback缓存函数引用
useReducer复杂状态逻辑
function Counter() {
  const [count, setCount] = useState(0)
 
  useEffect(() => {
    document.title = `count: ${count}`
    return () => { document.title = "app" } // cleanup
  }, [count])
 
  return <button onClick={() => setCount(c => c + 1)}>{count}</button>
}

自定义 Hook

function useFetch(url) {
  const [data, setData] = useState(null)
  const [loading, setLoading] = useState(true)
 
  useEffect(() => {
    fetch(url).then(r => r.json()).then(d => {
      setData(d)
      setLoading(false)
    })
  }, [url])
 
  return { data, loading }
}

状态管理

方案适用场景
useState / useReducer组件局部状态
Context API跨层级轻量共享(主题、语言)
Zustand轻量全局状态,推荐
Jotai原子化状态,细粒度订阅
Redux Toolkit大型项目,复杂状态图
// Zustand
import { create } from "zustand"
 
const useStore = create(set => ({
  count: 0,
  inc: () => set(s => ({ count: s.count + 1 })),
}))

组件模式

受控 vs 非受控

// 受控:value 由 state 管理
<input value={text} onChange={e => setText(e.target.value)} />
 
// 非受控:通过 ref 读取 DOM 值
const ref = useRef()
<input ref={ref} defaultValue="初始值" />

复合组件

// 父组件持有状态,子组件通过 Context 消费
<Tabs defaultValue="a">
  <Tabs.List>
    <Tabs.Trigger value="a">Tab A</Tabs.Trigger>
  </Tabs.List>
  <Tabs.Content value="a">内容 A</Tabs.Content>
</Tabs>

性能优化

// memo:避免父组件渲染时不必要的子组件重渲染
const Child = React.memo(({ value }) => <div>{value}</div>)
 
// lazy + Suspense:路由级代码分割
const Page = React.lazy(() => import("./Page"))
<Suspense fallback={<Spinner />}><Page /></Suspense>

Virtual DOM diffing:React 通过比较虚拟 DOM 树找出最小 DOM 操作集,批量更新真实 DOM。


生态

分类工具
构建Vite(推荐)、CRA(已弃用)
全栈框架Next.js(SSR/SSG)、Remix
路由React Router v6、TanStack Router
数据请求TanStack Query、SWR
表单React Hook Form
UI 组件库shadcn/ui、Ant Design、MUI
测试Vitest + Testing Library

React vs Vue

维度ReactVue
范式库(只管 UI)渐进式框架
模板JSX(JS 中写 HTML)单文件组件(.vue)
响应式不可变 state + 手动触发自动追踪依赖
学习曲线较陡(需理解 Hooks 规则)相对平缓
生态更大,React NativeNuxt.js

Preact(React 的轻量替代)Vue