React 的 Context 和 useContext 是用于在组件树中传递数据的特性,从而避免了在每个层级手动传递 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,以上信息应该涵盖了您需要了解的内容。如果有任何特定的问题或更深入的主题,欢迎继续提问。