React中的Context定义和目的是什么,怎么应用
Admin 2022-06-06 群英技术资讯 1639 次浏览
在这篇文章中,我们来学习一下“React中的Context定义和目的是什么,怎么应用”的相关知识,下文有详细的讲解,易于大家学习和理解,有需要的朋友可以借鉴参考,下面就请大家跟着小编的思路一起来学习一下吧。Context 提供了一种在组件之间共享数据的方式,而不必显式地通过组件树的逐层传递 props。
应用场景 哪些数据会需要共享?
Context 设计目的是为了共享那些对于一个组件树而言是**“全局”的数据**,例如当前认证的用户、主题或首选语言。
1. 创建并初始化Context
const MyContext = createContex(defaultValue);
创建一个 Context 对象。当 React 渲染一个订阅了这个 Context 对象的组件,这个组件会从组件树中离自身最近的那个匹配的 Provider 中读取到当前的 context 值。
2. 订阅Context
<MyContext.Provider value={/* 某个值 */}>
Provider 接收一个 value 属性,传递给消费组件。一个 Provider 可以和多个消费组件有对应关系。多个 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>
);
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
线程和进程是计算机操作系统的基础概念,在程序员中属于高频词汇,那如何理解呢?Node.js 中的进程和线程又是怎样的呢?下面本篇文章就来一起了解一下,希望对大家有所帮助!
问题:canvas绘制图片,图片变模糊设定一个一定尺寸的canvas,我这里设置的画布大小是400px*400px。当一张图片完全画到画布上的时候,大概率都会出现图片模糊的情况。我拿下面一张图片画到canvas上作为例子,看上去应该比较明显的有模糊的感觉。单方面的去修改图片精度,换成更高清的图片,事实证明确实有一丢丢用
目录配置sass及引入外部scss文件配置sass引入外部scss文件如果显示错误为如下图所示记住此时需要重启项目 npm run dev踩过的坑 Vue引入Sass文件问题来了,为什么呢?配置sass及引入外部scss文件配置sass安装对应依赖node模块npm install node-sass --save-d
这篇文章主要介绍了Vue实现todo应用的示例,帮助大家更好的理解和学习使用vue框架,感兴趣的朋友可以了解下
目录1、携带普通类型参数2、携带复杂类型参数vue页面跳转并传参的八种方式方法一方法二方法三方法四方法五方法六方法七方法八1、携带普通类型参数字符串、数字等。path:要跳转新页面的路由链接query:要携带的参数let pathInfo = this.$router.resolve({ path:/product_
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008