Skip to content

Context Hook

字数
658 字
阅读时间
3 分钟

上下文 Hook 允许从祖先组件接收信息,而无需将其作为 props 传递

useContext

基础用法

tsx
// 1. 创建 Context
const ThemeContext = createContext('light')

// 2. 提供 Context
function App() {
  return (
    <ThemeContext.Provider value="dark">
      <ThemedButton />
    </ThemeContext.Provider>
  )
}

// 3. 消费 Context
function ThemedButton() {
  const theme = useContext(ThemeContext)
  return <button className={theme}>按钮</button>
}

实际应用示例

tsx
// 用户信息 Context
const UserContext = createContext({
  user: null,
  login: () => {},
  logout: () => {}
})

// Provider 组件
function UserProvider({ children }) {
  const [user, setUser] = useState(null)

  const login = (userData) => {
    setUser(userData)
  }

  const logout = () => {
    setUser(null)
  }

  return (
    <UserContext.Provider value={{ user, login, logout }}>
      {children}
    </UserContext.Provider>
  )
}

// 在需要用户信息的组件中使用
function UserProfile() {
  const { user, logout } = useContext(UserContext)

  if (!user) return <div>请登录</div>

  return (
    <div>
      <h2>{user.name}</h2>
      <button onClick={logout}>退出登录</button>
    </div>
  )
}

// 应用入口
function App() {
  return (
    <UserProvider>
      <UserProfile />
    </UserProvider>
  )
}

使用场景

  • 全局主题配置
  • 用户认证信息
  • 语言偏好设置
  • 全局状态管理
  • 共享数据或函数

注意事项

Context 适用于需要在组件树中广泛共享的数据。过度使用 Context 可能导致组件复用性降低。因此,对于局部状态,推荐使用 props 传递或状态提升。

Context vs 状态管理库(valtio、zustand等)的区别

  1. Context

    • 是 React 原生的依赖注入机制
    • 主要用于传递数据,不包含状态管理功能
    • 每次 Context 值变化,所有消费该 Context 的组件都会重新渲染
    • 适用于:
      • 静态数据或低频更新的数据
      • 主题、语言等全局配置
      • 较小规模的应用
  2. Valtio

    • 基于 Proxy 的响应式状态管理
    • 可以像普通对象一样直接修改状态
    • 精确更新,只有使用到的属性变化才会触发重渲染
    • 适用于:
      • 需要频繁更新的复杂状态
      • 对性能要求较高的场景
      ts
      // Valtio 示例
      const state = proxy({ count: 0 })
      state.count++ // 直接修改
  3. Zustand

    • 极简的状态管理库
    • 基于 hook 的 API 设计
    • 支持状态分片,可以只订阅部分状态
    • 适用于:
      • 中大型应用的状态管理
      • 需要良好性能和可维护性的场景
      ts
      // Zustand 示例
      const useStore = create((set) => ({
        count: 0,
        increment: () => set((state) => ({ count: state.count + 1 }))
      }))

选择建议:

  • 简单的全局配置 → Context
  • 复杂的状态管理 → Zustand/Valtio
  • 需要响应式特性 → Valtio
  • 需要更好的性能和扩展性 → Zustand

贡献者

页面历史