问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

React context几层再用

发布网友 发布时间:2022-05-15 09:07

我来回答

2个回答

懂视网 时间:2022-05-15 13:28

React在版本16.3-alpha里引入了新的Context API,社区一片期待之声。我们先通过简单的例子,看下新的Context API长啥样,然后再简单探讨下新的API的意义。

需要安装16.3-alpha版本的react。构建步骤非本文重点,本文主要和大家分享React 16.3之Context API详解,希望能帮助到大家。

npm install react@next react-dom@next

下面,直接来看代码,如果用过react-redux应该会觉得很眼熟。

首先,创建context实例:

import React from 'react';
import ReactDOM from 'react-dom';

// 创建context实例
const ThemeContext = React.createContext({
 background: 'red',
 color: 'white'
});

然后,定义App组件,注意这里用到了Provider组件,类似react-reduxProvider组件。

class App extends React.Component {

 render () {
 return (
 <ThemeContext.Provider value={{background: 'green', color: 'white'}}>
 <Header />
 </ThemeContext.Provider>
 );
 }
}

接下来,定义HeaderTitle组件。注意:

  1. Title组件用到了Consumer组件,表示要消费Provider传递的数据。

  2. Title组件是App组件,但跳过了Header消费数据。

class Header extends React.Component {
 render () {
 return (
 <Title>Hello React Context API</Title>
 );
 }
}

class Title extends React.Component {
 render () {
 return (
 <ThemeContext.Consumer>
 {context => (
  <h1 style={{background: context.background, color: context.color}}>
  {this.props.children}
  </h1>
 )}
 </ThemeContext.Consumer>
 );
 }
}

最后,常规操作

ReactDOM.render(
 <App />, 
 document.getElementById('container')
);

看下程序运行结果:

为什么有新的Context API

用过redux + react-redux的同学,应该会觉得新的Context API很眼熟。而有看过react-redux源码的同学就知道,react-redux本身就是基于旧版本的Context API实现的。

既然已经有了现成的解决方案,为什么还会有新的Context API呢?

  1. 现有Context API的实现存在一定问题:比如当父组件的shouldComponentUpdate性能优化,可能会导致消费了context数据的子组件不更新。

  2. 降低复杂度:类似redux全家桶这样的解决方案,给项目引入了一定的复杂度,尤其是对方案了解不足的同学,遇到问题可能一筹莫展。新Context API的引入,一定程度上可以不少项目对redux全家桶的依赖。

写在后面

新的Context API,个人对于性能上的提升更加期待些。至于降低复杂度、取代redux之类的,不是我关注的重点。下一步的计划就是多构造点用例来进行对比测试。

热心网友 时间:2022-05-15 10:36

第一层。
在日常的开发中,经常会使用到父子组件的形式,但面对更加复杂的业务时,使用组件的层级经常会多层组件,那如果是用父子组件的传参方式,一层层传递,那代码显得很乱,维护起来也麻烦,React官方也为此推出了Context的API来解决这种问题。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
形容手表很舒服的句子 情侣手表的对话句子 租门面和房东鉴了十年合同,房东要退店面,我可以不退吗,继续经 ...一篇朝花夕拾里十篇小短文的主要内容及作者的情感和主要人物的... 什么叫狼狗 狼狗的生活习性有哪些? 起个姓罗好听的宝宝名字 野火的近义词 个是词语解释 请旌词语解释 手机用什么SIM卡好(用那个公司的哪一种卡)? 小米手机支持移动的电话卡吗?具体支持那些版本的卡? 河南哪有乘坐热气球的? 请问这手机支持什么电话卡 word2007 底纹 现在上网用哪个版本的IE浏览器最好用,最安全啊? 茶浴产品市场调查报告 怎么做产品的市场调查报告? 电脑Ip地址与网络上的其他系统有冲突,而且连不上网,怎么办呀?高手 人民币的主要成分为什么是棉花 猴年杨姓男宝宝的名字 人民币主要成分 梦见死去的亲人有什么含义?谢谢了,大神帮忙啊 做梦梦见死去的人亲人 梦到两个死人一个陌生人一个是死去的亲人这是什么意思 E66证书,签名软件,密匙解答和制作. 求证书水能帮我制作个证书啊,想签名一个软件怎么也签名不了,用直签也不行,迫不得已才到这来求证书。 梦见亲人变成陌生人在我身边被通了一刀流好多血 经常梦到一个已故亲人变成两个不一样性格的人 什么食物含维生素E多 鱼刺卡到喉咙,咽不下去,吐不出来,怎么办?幽默的回答. 鱼刺卡在喉咙上咽不下去怎么办? 想给宝贝取个好听的小名,因为我的名字有个&quot;元&quot;所以如果是儿子就叫元宝(寓意也就是我心里的宝),女儿 为什么钉钉上课时有软件使用时间 c语言编程中的“或”逻辑的符号(也就是两个竖线”从键盘上怎样输入? 昨天晚上微信莫名其妙给别人发图片 手机上没有 我也没见过这张图片_百度问一问 编程中&#x2205;怎么打出来? 在VC编程中~! 这个符号“~”怎么打出来? 为什么微信会主动在我微信自己发送图不该发出图片 编程符号怎么能打的更快,还要经常按Shift啊 编程要用到的特殊符号怎么打 用什么打字输入法好 我是一个高中女生 、起什么英文名好听呢 ?之前想过sarah 、但听起来... vs编程时的“或”怎么打出 帮忙取个好的女生英文名:本人是高中女生,个性安静,处女座,喜欢看书看... 男朋友转账139.21是什么意思? 发红包先发80.50再发77.58然后发139.21是什么意思 我是一个高一的女生,名叫晓妹,我想要一个和我的名字的音相似的好听的英文名,谢谢! 我上高中。需要一个英文名。 本名:夏然 结合所学道法知识,在班会召开中,你会涉及到哪些知识点 七下道法知识点归纳有哪些?