react常用组件及作用(React中的Context应用场景分析)
react常用组件及作用
React中的Context应用场景分析Context定义和目的Context 提供了一种在组件之间共享数据的方式,而不必显式地通过组件树的逐层传递 props。
应用场景 哪些数据会需要共享?
使用步骤Context 设计目的是为了共享那些对于一个组件树而言是**“全局”的数据**,例如当前认证的用户、主题或首选语言。
1. 创建并初始化Context
const MyContext = createContex(defaultValue);
创建一个 Context 对象。当 React 渲染一个订阅了这个 Context 对象的组件,这个组件会从组件树中离自身最近的那个匹配的 Provider
中读取到当前的 context 值。
2. 订阅Context
<MyContext.Provider value={/* 某个值 */}>
Provider 接收一个 value
属性,传递给消费组件。一个 Provider 可以和多个消费组件有对应关系。多个 Provider 也可以嵌套使用,里层的会覆盖外层的数据。
这里有两个相关的概念
- Provider - Context提供者,或Context的订阅者。可以理解为通过Provider为其内部组件订阅了Context值的变动,一旦Context值有变化,就会触发内部组件重新渲染。
- Comsumer - Context消费者(消费组件),或者叫Context使用者。即在Provider内部使用
useContext()
来使用或消费Context的组件。这些组件通过useContext()获取、使用Context的最新值。
3. 使用Conext
3.1 React组件中使用
const value = useContext(MyContext);
在消费组件中引用Context。value会从组件树中离自身最近的那个匹配的Provider中读取到当前的Context值。
3.2 纯函数式组件中使用
在纯函数式的组件中,可以使用Consumer
来引用context的值。如果没有上层对应的Provider,value等同于传递给createContext()
的defaultValue
.
<MyContext.Consumer> {value => /* 基于 context 值进行渲染*/} </MyContext.Consumer>
4. Context的更新
4.1 自上而下更新Context
自上而下更新指的是更新Provider的value值。当 Provider 的 value
值发生变化时,它内部的所有消费组件内通过useContext
获取到的值会自动更新,并触发重新渲染。
//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
在某些情况下,需要在某个消费组件内更新context
,并且适配到整个程序。比如通过应用程序的setting
组件修改UI风格。 这时就需要通过回调将更新一层层传递到对应的Provider,更新Provide对应的value
,从而触发所有相关消费组件的更新。
// 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)
Context – React (reactjs.org)
以上就是React中的Context应用场景分析的详细内容,更多关于React中的Context的资料请关注开心学习网其它相关文章!
- react怎么绑定state(react纯函数组件setState更新页面不刷新的解决)
- react定时任务(手把手带你用React撸一个日程组件)
- react怎么添加动态html(react中的DOM操作实现)
- react自适应布局如何实现(React实现分页效果)
- react路由原理解析(React配置子路由的实现)
- linux虚拟内存实现需要哪六种机制(解析Linux高性能网络IO和Reactor模型)
- react组件的参数怎样定义的(详解React中组件之间通信的方式)
- react组件封装成函数方法(React虚拟列表的实现)
- react中state的作用是什么(React中useEffect 与 useLayoutEffect的区别)
- vscode react插件(基于visual studio code + react 开发环境搭建过程)
- react加载优化(React星星评分组件的实现)
- reactnative ios(详解React Native与IOS端之间的交互)
- react常见问题(React编程中需要注意的两个错误)
- reacthooks基础使用(React 小技巧教你如何摆脱hooks依赖烦恼)
- react和antd项目教程(React引入antd-mobile+postcss搭建移动端)
- react usestate实现原理(浅谈react useEffect闭包的坑)
- 文明6金币太少怎么办 文明6无限刷钱教程(文明6金币太少怎么办)
- 开国中将,王牌军63军首任政委,两个连襟一个上将一个少将传为佳话(王牌军63军首任政委)
- 臭名昭著的731部队最高负责人 石井四郎(臭名昭著的731部队最高负责人)
- 王牌部队,你看的剧情我看的时尚(你看的剧情我看的时尚)
- 被鉴定的古董价值300万 当心,你可能遇到诈骗了(被鉴定的古董价值300万)
- 英语难学吗(初中英语难学吗)
热门推荐
- yii框架使用教程(Yii框架连表查询操作示例)
- div左右布局自适应(如何让一个div居于页面正中间实现方法)
- php框架使用方法大全(PHP MVC框架中类的自动加载机制实例分析)
- phpsession登录功能(php实现session共享的实例方法)
- dedecms独立页面怎么加(DEDECMS实现文章tag关键词自动生成列表页的方法)
- css时钟(网页中时光轴CSS实现)
- 简述python2与python3的不同点(Python2与Python3的区别实例分析)
- MongoDB聚合函数
- 如何删除docker中已停止的容器(一条命令重启所有已停止的docker容器操作)
- mysql与oracle体系结构(详解MySQL实时同步到Oracle解决方案)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9