在React中,使用React Context可以实现全局状态共享和更改监听。Context可用于在组件之间共享相同的数据,而无需将数据props逐级传递到子组件。
为了创建一个Context对象,我们可以使用React.createContext方法。例如:
const MyContext = React.createContext(defaultValue);
其中defaultValue是当当前组件没有匹配到Provider时,Context所提供的默认值。
接下来,我们需要创建一个Provider组件来传递数据给后代组件。我们可以将数据作为value属性传递给Provider组件,该组件可以包裹任何组件,并使其成为所属组件树上的所有组件的上下文.
例如:
<MyContext.Provider value={/* some data */}>
{/* child components */}
</MyContext.Provider>
在后代组件中,我们可以使用MyContext.Consumer或useContext hook来访问此数据,并且可以通过更新它们自己的local state,以反映它们的父组件中的更改。
但是如果您希望允许子组件对共享状态进行更改并及时通知父组件,则需要使用另一个React Hook:useContext. 使用这个hook可以轻松地从Context中获取shared state并同时设置共享状态。
例如:
import { useContext } from 'react';
function MyChildComponent() {
const { mySharedState, setMySharedState } = useContext(MyContext);
function handleClick() {
setMySharedState(mySharedState + 1);
}
return (
<div>
<p>{mySharedState}</p>
<button onClick={handleClick}>Increment</button>
</div>
);
}
这里的操作setMySharedState(mySharedState + 1)
执行更新useState Hook 实例中的状态值,该实例当前指向的是父组件 MyContext 的状态,并通过该Context将状态传递给了子组件.
使用React Context与useContext hook 非常适合监听全局的状态更改并及时地向所有组件通知它们。