在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
Context定义和目的Context 提供了一种在组件之间共享数据的方式,而不必显式地通过组件树的逐层传递 props。 应用场景 哪些数据会需要共享?
使用步骤1. 创建并初始化Context const MyContext = createContex(defaultValue); 创建一个 Context 对象。当 React 渲染一个订阅了这个 Context 对象的组件,这个组件会从组件树中离自身最近的那个匹配的 2. 订阅Context <MyContext.Provider value={/* 某个值 */}> Provider 接收一个 这里有两个相关的概念
3. 使用Conext 3.1 React组件中使用 const value = useContext(MyContext); 在消费组件中引用Context。value会从组件树中离自身最近的那个匹配的Provider中读取到当前的Context值。 3.2 纯函数式组件中使用 在纯函数式的组件中,可以使用 <MyContext.Consumer> {value => /* 基于 context 值进行渲染*/} </MyContext.Consumer> 4. Context的更新 4.1 自上而下更新Context 自上而下更新指的是更新Provider的value值。当 Provider 的 //App.js // .... export default function App() { //... // const {contextValue, setContextValue} = React.useState(initialValue); // function to update the context value function updateContext(newValue) { // ... // 更新contextValue, ConsumerComponent1, ConsumerComponent2, ConsumerComponent3, ConsumerComponent11都会触发重新渲染。 setContextValue(newValue) } ... return ( <App> <MyContext.Provider value={contextValue}> <ConsumerComponent1> <ConsumerComponent11> // .... </ComsumerComponent11> </ConsumerComponent1> <ConsumerComponent2 /> <ConsumerComponent3 /> </MyContext.Provider> </App> ); } 4.2 自下而上(从消费组件)更新Context 在某些情况下,需要在某个消费组件内更新 // app.js export default function App() { ... const {contextValue, setContextValue} = React.useState(initialValue); // function to update the context value function updateContext(newValue) { // ... // 更新contextValue, ConsumerComponent1, ConsumerComponent2, ConsumerComponent3, ConsumerComponent11都会触发重新渲染。 setContextValue(newValue) } ... return ( <App> <MyContext.Provider value={contextValue}> <ConsumerComponent1> <ConsumerComponent11 updateValue={updateContext}> // 通过回调形式的props, 在ConsumerComponent11中更新contextValue, 因为contextValue属于最顶层的Provider的值,所以也会触发ConsumerComponent1, ConsumerComponent2, ConsumerComponent3重新渲染。 </ComsumerComponent11> </ConsumerComponent1> <ConsumerComponent2 /> <ConsumerComponent3 /> </MyContext.Provider> </App> ); } 4.3 Provider嵌套 在一些情况下,可能会出现同一个Context的provider嵌套的情况,这时候可以理解为两个Context。不同的是, ... const {contextValue, setContextValue} = React.useState(initialValue); // function to update the context value function updateContext(newValue) { // ... // 更新contextValue, ConsumerComponent1, ConsumerComponent2, ConsumerComponent3, ConsumerComponent11都会触发重新渲染。 setContextValue(newValue) } ... return ( <App> <MyContext.Provider value={contextValue}> <ConsumerComponent1> <ConsumerComponent11 /> </ConsumerComponent1> <ConsumerComponent2> ... // 如果只希望更新ComsumerComponent21, ComsumerComponent22中的值 const localContextValue = useContext(MyContext); // 从上一层Provider中获取当前值 const {tempContextValue, setTempContextValue} = React.useState(localContextValue); function updateTempContext(newValue) { // 这里更新以后只会触发ConsumerComponent21和ConsumerComponent22的重新渲染 setTempContextValue(newValue); } // 这里新建Provider,在ConsumerComponent21和ConsumerComponent22之间共享数据。 <MyContext.Provider value={tempValue}> <ConsumerComponent21> // 在ConsumerComponent21中通过useContext(MyContext)订阅 // 获取到的值为离自身最近的那个匹配的Provider中读取到的Context值,即tempValue </ConsumerComponent21> <ConsumerComponent22> </ConsumerComponent22> </MyContext.Provider value={contextValue}> </ConsumerComponent2> <ConsumerComponent3 /> </MyContext.Provider> </App> ); 官方文档 官方文档请参考下边的基础和高级教程。 Hook API 索引 – React (reactjs.org) 以上就是React中的Context应用场景分析的详细内容,更多关于React中的Context的资料请关注极客世界其它相关文章! |
请发表评论