react Context

91 阅读2分钟

React 的 ContextuseContext 是用于在组件树中传递数据的特性,从而避免了在每个层级手动传递 props 的繁琐过程。它们提供了一种在组件之间共享如当前认证的用户、主题或首选语言等这些全局信息的方式。

Context API

Context API 在 React 16.3 版本被引入,它包括以下几个部分:

  • React.createContext(defaultValue): 创建一个 Context 对象。这个对象可以持有一个默认值 defaultValue,如果当前上下文的消费组件位于没有匹配 Provider 的情况下,则使用该默认值。
  • <MyContext.Provider value={/ some value /}>: 这个组件允许你为消费组件提供数据。所有消费该 Context 的组件都会重新渲染,当所提供的值变化时。
  • <MyContext.Consumer>...</MyContext.Consumer>: 这个组件让你可以订阅到 context 的变化。它可以接收一个函数作为子元素,该函数接受当前的 context 值并返回一个 React 节点。
  • Class.contextType: 使用 contextType 属性可以在类组件中消费最近的对应 Context 类型的值。
  • useContext(MyContext): 这是一个 Hook,使得函数组件也可以消费对应的 Context。

useContext Hook

useContext 是一个 React Hook,它让你可以在函数组件中订阅到 React 的 Context。使用 useContext(MyContext) 将使你的组件监听 MyContext 的变化。当 Context 的值发生变化时,所有使用该 Context 的组件都会重新渲染。

import React, { useContext } from 'react';

// 创建一个 Context
const MyContext = React.createContext('default value');

function MyComponent() {
  // 使用 useContext 来消费 MyContext
  const value = useContext(MyContext);
  
  return (
    <div>
      The value is: {value}
    </div>
  );
}

function ParentComponent() {
  return (
    // 提供一个新值给 MyContext
    <MyContext.Provider value="provided value">
      <MyComponent />
    </MyContext.Provider>
  );
}

注意事项

  • 如果你只是想替代简单的 prop 钻透问题,那么可能不需要使用 Context。你可以考虑使用“组合”(composition)来代替继承。
  • Context 主要为那些被认为是“全局”的数据设计,比如身份验证状态、主题或者偏好设置。
  • 当你在 Context 中存储复杂的状态逻辑时,请确保你已经充分理解其工作原理,以避免潜在的性能问题和难以调试的代码。

至于您提到的 "Context4",这并不是 React 官方术语或功能名称。可能是您对 Context API 的误解或者是其他框架/库中的概念。如果您是指 React 中的 Context API,以上信息应该涵盖了您需要了解的内容。如果有任何特定的问题或更深入的主题,欢迎继续提问。