跳转至

React 通信与路由

组件通信

通信模式概览

graph TD
    A["组件通信"] --> B["直接关系"]
    A --> C["间接关系"]

    B --> B1["父 → 子"]
    B --> B2["子 → 父"]

    C --> C1["兄弟组件"]
    C --> C2["跨层级"]
    C --> C3["全局状态"]

    B1 --> B1a["Props"]
    B2 --> B2a["回调函数"]

    C1 --> C1a["状态提升"]
    C2 --> C2a["Context API"]
    C3 --> C3a["Redux/Zustand"]

通信方法对比

模式 复杂度 性能 使用场景 示例
Props ⭐ 简单 ⭐⭐⭐ 高 父到子 <Child name={name} />
Callbacks ⭐⭐ 中等 ⭐⭐⭐ 高 子到父 <Child onClick={handleClick} />
状态提升 ⭐⭐ 中等 ⭐⭐ 中等 兄弟通信 共同父级状态
Context API ⭐⭐⭐ 复杂 ⭐⭐ 中等 跨层级共享 主题,用户数据
Redux/Zustand ⭐⭐⭐⭐ 很复杂 ⭐ 低 全局状态管理 大型应用

状态管理

Context API

何时使用: - 全局配置/轻共享: 主题、国际化、用户会话等 - 局部范围 Provider: 避免全局污染

Redux 要点

三原则: 1. 单一数据源: 整个应用的状态存储在一个 store 中 2. 只读 state: 唯一改变 state 的方法是触发 action 3. 纯函数修改: 使用纯函数 reducer 来执行修改

react-redux: - Provider + connect/hooks - useSelector / useDispatch

中间件: - thunk, logger - 链式增强 dispatch

graph LR
  UI[React Components] -->|dispatch action| A[Store]
  A -->|notify| UI
  A --> R[Reducers]
  R --> A

目录组织建议

  • 按功能模块拆分: actions/reducer/views 同目录
  • 或按角色: actions/reducers/...
  • 统一导出入口: index.ts 便于按需引入

状态管理决策树

flowchart TD
    A["需要共享状态?"] -->|"否"| B["本地组件状态<br/>useState/useReducer"]

    A -->|"是"| C["多少个组件?"]

    C -->|"2-3个组件"| D["直接关系?"]
    C -->|"很多组件"| E["什么类型的数据?"]

    D -->|"是"| F["Props + Callbacks"]
    D -->|"否"| G["状态提升"]

    E -->|"UI状态<br/>(theme, language)"| H["Context API"]
    E -->|"业务数据<br/>(user, products)"| I["多复杂?"]

    I -->|"简单"| J["Context + useReducer"]
    I -->|"复杂"| K["Redux/Zustand<br/>+ Middleware"]

    style B fill:#e1f5fe
    style F fill:#e8f5e8
    style G fill:#e8f5e8
    style H fill:#fff3e0
    style J fill:#fff3e0
    style K fill:#ffebee

选择指南表格

场景 推荐方案 优点 缺点
单个组件 useState / useReducer 简单,快速 不可共享
父子组件 Props + Callbacks 直接,高性能 范围有限
兄弟组件 状态提升 清晰数据流 可能导致属性钻取
主题/语言 Context API 内置,简单 重新渲染所有消费者
用户会话 Context + useRequest 响应式更新 中等复杂度
复杂业务逻辑 Redux/Zustand 可预测,可调试 学习曲线
实时数据 useRequest + polling 自动更新 网络开销

性能对比

方案 包大小 运行时性能 开发体验
本地状态 ⭐⭐⭐ 最小 ⭐⭐⭐ 优秀 ⭐⭐⭐ 简单
Props/Callbacks ⭐⭐⭐ 最小 ⭐⭐⭐ 优秀 ⭐⭐ 良好
Context API ⭐⭐⭐ 最小 ⭐⭐ 良好 ⭐⭐ 良好
Redux ⭐ 大 ⭐ 一般 ⭐⭐⭐ 优秀
Zustand ⭐⭐ 小 ⭐⭐ 良好 ⭐⭐⭐ 优秀

React Router

路由类型对比

路由类型 URL 格式 服务器配置 SEO 友好 使用场景
BrowserRouter /about 需要回退 ✅ 是 生产应用
HashRouter /#/about 无需配置 ❌ 否 静态托管

React Router 架构

graph TD
    A["URL 变化"] --> B["路由检测"]

    B --> C["BrowserRouter<br/>(History API)"]
    B --> D["HashRouter<br/>(Hash Change)"]

    C --> E["路由匹配"]
    D --> E

    E --> F["组件渲染"]

    G["导航"] --> G1["Link/NavLink"]
    G --> G2["useNavigate (v6)"]
    G --> G3["useHistory (v5)"]

    G1 --> A
    G2 --> A
    G3 --> A

路由钩子对比

钩子 版本 用途 返回值
useParams v5 & v6 获取 URL 参数 参数对象
useLocation v5 & v6 获取当前位置 位置对象
useHistory v5 only 编程式导航 历史对象
useNavigate v6 only 编程式导航 导航函数

参数传递方法

方法 语法 使用场景 示例
动态路由 /user/:id 必需参数 /user/123
查询参数 ?name=value 可选参数 /search?q=react
状态对象 { state: data } 复杂数据 携带数据导航