react的导出是怎么实现的_从零开始开发一个 React

这个是从零开始开发一个 React 系列的第七篇。想要访问之前的内容可以点击下方的链接进行访问:

  1. 最简单的实现,包括 vdom 结构,createElement,ReactDOM.render
  2. 增加 Class 的支持
  3. 增加 JSX 的支持
  4. 增加 state 支持
  5. 增加声明周期
  6. 增加 dom-diff(调和算法)

先行知识

学习这个课程之前呢,需要各位了解 React 的 api,以及做了什么事情。

如果完全不了解的话,不建议您继续往下看。

如果你已经具备了相关 React 的知识,那么就让我们开始吧。

本章要实现的效果

本章主要实现 react 的 Context API。

Context 提供了一个无需为每层组件手动添加 props,就能在组件树间进行数据传递的方法。

在一个典型的 React 应用中,数据是通过 props 属性自上而下(由父及子)进行传递的,但这种做法对于某些类型的属性而言是极其繁琐的(例如:地区偏好,UI 主题),这些属性是应用程序中许多组件都需要的。Context 提供了一种在组件之间共享此类值的方式,而不必显式地通过组件树的逐层传递 props。

开始实现

我们继续拿官网的一个关于Context基础API的例子来做。

我们需要将theme从顶层的APP组件传递到最下层的Button,从而Button能够根据主题的不同显示不同的样式,不使用Context的话是这样的:

019ef301db3c63a13b2879c49ddfffe5.png

使用Context的话是这样的:

fa50597d29852fd1b209dd5a828a53c4.png

代码如下:

// Context 可以让我们无须明确地传遍每一个组件,就能将值深入传递进组件树。
// 为当前的 theme 创建一个 context(“light”为默认值)。
const ThemeContext = React.createContext('light');class App extends React.Component {render() {// 使用一个 Provider 来将当前的 theme 传递给以下的组件树。// 无论多深,任何组件都能读取这个值。// 在这个例子中,我们将 “dark” 作为当前的值传递下去。return (<ThemeContext.Provider value="dark"><Toolbar /></ThemeContext.Provider>);}
}// 中间的组件再也不必指明往下传递 theme 了。
function Toolbar(props) {return (<div><ThemedButton /></div>);
}class ThemedButton extends React.Component {// 指定 contextType 读取当前的 theme context。// React 会往上找到最近的 theme Provider,然后使用它的值。// 在这个例子中,当前的 theme 值为 “dark”。static contextType = ThemeContext;render() {return <Button theme={this.context} />;}
}

通过代码发现这里一共需要实现的API有React.createContext, 还有一个contextType.其中React.createContext是会返回一个对象。这个对象有一个key为Provider的组件。 这个组件接受一个value的prop并将其作为context的值。 contextType是一个静态属性,也就说所有的组件实例都公用一个,没必要都产生一个。我们的组件从Context里读取最新的数据即可。

接下来我们分别实现React.createContextcontextType

导出 React.createContext API

我们首先要做的第一件事情就是导出createContextAPI, 尽管这个API我们还没写,我们先占个位置。

const React = {createElement,Component: require("./component"),
+  createContext: require("./context").createContext
};

实现数据的存储

我们新建一个文件context.js 我们先放一个空壳子进去,接下来我们就要实现这个,其实代码很简单。


+ import React from './mini-react';
+ import Component from './component';+ export function createContext(defaultValue) {
+	return {
+		Provider: class Provider extends Component {
+			render() {
+				return <div></div>
+			}	
+		}
+	}
+}

接下来我们填充具体的逻辑,逻辑很简单,直接上代码。

import React from './mini-react';
import Component from './component';export function createContext(defaultValue) {return {Provider: class Provider extends Component {render() {
+				const currentValue = this.props.value;
+				Provider.currentValue = currentValue || defaultValue;return <div></div>}	}}
}

实现数据的读取

两行代码搞定了context数据的更新逻辑,如何让所有组件都能接受到里面的值呢? 接下来我们需要修改下Component的实现。

简单增加一行代码:

class Component {constructor(props) {this.props = props;
+    this.context = this.constructor.contextType && this.constructor.contextType.Provider.currentValue;...}...
}

总结

本节实现了React的Context API相关的功能, 下一节我们引入Ref(文章未更新)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551936.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python列表生成式内必须定义匿名函数_Python基础-----基础概念总结

Python基础-----基础概念总结 Python程序的构成 构成图行连接符&#xff1a;\对象基本构成和内存示意图对象及其引用&#xff08;变量&#xff09;标识符 基本用法命名规则变量和简单的赋值语句 变量声明必须初始化删除变量和垃圾回收机制链式复制系列解包赋值常量&#xff08;…

英语四级c语言,2017年大学英语四级精选试题练习

2017年大学英语四级精选试题练习勤奋和智慧是双胞胎&#xff0c;懒惰和愚蠢是亲兄弟。以下是小编为大家搜索整理的2017年大学英语四级精选试题练习&#xff0c;希望能给大家带来帮助!更多精彩内容请及时关注我们应届毕业生考试网!1、Courses with the numbers 800 or above are…

如何获取图像的驱动_Adobe Camera Raw 12 Mac(Raw格式图像ps插件) v12.2.1.417

Adobe Camera Raw 12 Mac版可以让摄影师在熟悉的Photoshop界面内打开并编辑这些RAW文件&#xff0c;极大的方便了摄影师的工作。Adobe Camera Raw 12 for Mac安装教程下载完成后&#xff0c;双击CameraRaw_12_2_1.pkg文件打开&#xff0c;根据安装器提示进行安装即可。安装完成…

c语言error ld returned,[Error] ld returned 1的错误

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include #include #include #include#define MAX 101#define N 1000#define M 250000/*函数功能&#xff1a;利用字符串实现超长数加减法运算 */void jianfa(int a[],int b[],int f);int lena,lenb,da1,db1; /* 把lena,l…

qc成果报告范例_QC推进这样做才是货真价值!| 看机电股份的QC报告

​❖QC小组活动是激发全体员工聪明才智、改善现场管理、提升企业综合竞争力的有效方法&#xff01;QC学习是QC活动推行的基础&#xff0c;高层参与则是QC活动推行的保障。-为进一步提升企业高层对QC的认识及重视&#xff0c; 5月20日下午&#xff0c;机电股份开展QC活动阶段汇报…

android白色字体代码,Android实现状态栏白底黑字效果示例代码

前言本文主要给大家介绍了关于Android如何实现状态栏白底黑字的相关内容&#xff0c;分享出来供大家参考学习&#xff0c;下面话不多说了&#xff0c;来一起看看详细的介绍吧。一、描述在项目中有的时候Ui设计状态栏背景颜色是白色的&#xff0c;虽然还挺好看&#xff0c;不过可…

android iphone对比度,对比度对比:显示器优势明显_苹果 MacBook Pro_液晶显示器评测-中关村在线...

紧接着&#xff0c;我们来看看对比度方面&#xff0c;戴尔P2412Hb液晶显示器以及华硕N53S、三星305V4A、神舟A560-i7D5优雅、联想B470e、富士通LH532、戴尔Inspiron 14R-7420、索尼VPCEG-212T、惠普Pavilion g4、宏碁5755G和苹果MacBook Pro这10款热门笔记本电脑屏幕的表现如何…

android语法高亮编辑器,HighlightTextEditor

软件简介语法高亮HighlightTextEditor是一个安卓代码语法高亮控件&#xff0c;目前已经支持200多种语言&#xff0c;近90多种主题配色方案&#xff0c;同时支持lua扩展&#xff0c;以及自定义语言配置。强烈推荐&#xff0c;一款不可多得的开源控件。支持的语言&#xff1a;aba…

java类初始化顺序_Java 类的初始化顺序

静态代码块&#xff1a;用staitc声明&#xff0c;jvm加载类时执行&#xff0c;仅执行一次构造代码块&#xff1a;类中直接用{}定义&#xff0c;每一次创建对象时执行执行顺序优先级&#xff1a;静态块,main(),构造块,构造方法1. 构造函数public HelloWorld(){ }关于构造函数&am…

docker 获取宿主机ip_Docker基础修炼6——网络初探及单机容器间通信

如果觉得文章有帮助&#xff0c;欢迎点击头像关注我获取更多原创文章&#xff0c;同时也欢迎转发。同时也可以在我的历史文章中找到Linux操作系统相关的服务器运维管理入门系列文章&#xff0c;欢迎交流。前文演示docker容器内部数据共享与持久化&#xff0c;本文继续讨论docke…

html设计动画小黄人,CSS3实现可爱的小黄人动画

每次看到CSS3动画就心痒痒想试一下&#xff0c;记得一个多月前看了白树哥哥的一篇博客&#xff0c;突然开窍&#xff0c;于是拿他提供的demo试了一下&#xff0c;感觉很棒&#xff01;下图为demo提供的动画帧设计稿。自己也想说搞一个DIY的动画出来&#xff0c;可是&#xff0c…

python函数进阶小结_python之函数进阶

1. 今日内容 1.1 函数的参数 *的魔性用法 函数形参最终顺序 1.2名称空间 全局名称空间&#xff0c;局部名称空间&#xff0c;内置名称空间 取值顺序与加载顺序 作用域 内置函数&#xff1a;globals() locals() 1.3 高阶函数&#xff08;函数的嵌套&#xff09; 1.4关键字&#…

鸿蒙空间是什么星辰变,飞升之后做什么《星辰变》神魔妖界收伏奇珍异兽

十年经典&#xff0c;再续流星!由阅文白金作者“我吃西红柿”同名小说改编《星辰变》手游正在火热预约中&#xff0c;现在前往游戏官网即可预约游戏获得专属福利。作为一款由修真小说改编的手游作品&#xff0c;《星辰变》手游拥有着超千万字的游戏剧本&#xff0c;并且依照小说…

大数据数据收集数据困难_大数据就是好数据吗?研究人员在处理大数据集时遭遇的 5 大挑战...

大数据给每个科研领域的研究方式带来了前所未有的变化。每个领域中&#xff0c;研究人员可使用的工具皆有显著性&#xff0c;大数据现在逐渐成为横跨各学科领域的共同工具。大数据集的可取得性以及可存储并共享大量的数据的能力为研究人员打开了科学探索的几条途径。数据是研究…

docker privileged作用_docker总结

docker基本命令是一个开源的应用容器引擎&#xff1b;是一个轻量级容器技术&#xff1b;docker主机(Host)&#xff1a;安装了Docker程序的机器&#xff08;Docker直接安装在操作系统之上&#xff09;&#xff1b;docker客户端(Client)&#xff1a;连接docker主机进行操作&#…

edge播放视频HTML5黑屏,edge不能播放网页视频怎么办-修复edge浏览器播放视频黑屏的方法 - 河东软件园...

Microsoft Edge是微软在更新win10系统的同时发布的一款新浏览器&#xff0c;它基于IE浏览器设计&#xff0c;是新一代的微软指定浏览器&#xff01;这款浏览器从上市到现在一直都是备受争议的软件&#xff0c;有的用户喜欢使用IE&#xff0c;也有用户喜欢Edge。在使用新版本的e…

c语言乘法口诀表的流程图_例18:C语言编程实现九九乘法表

例18&#xff1a;C语言编程实现九九乘法表&#xff0c;样式要求长方形、右三角形、左三角形。解题思路&#xff1a;这个问题的算法很简单&#xff0c;就是两个for循环的嵌套&#xff0c;三角形的样式就是多了一些空格。长方形源代码演示&#xff1a;#include<stdio.h>//头…

python包和目录有什么不同_python模块和包的区别

在计算机程序的开发过程中&#xff0c;随着程序代码越写越多&#xff0c;在一个文件里代码就会越来越长&#xff0c;越来越不容易维护。为了编写可维护的代码&#xff0c;我们把很多函数分组&#xff0c;分别放到不同的文件里&#xff0c;这样&#xff0c;每个文件包含的代码就…

2021年宝鸡中学高考成绩查询,宝鸡中学排名前十名,2021年宝鸡中学排名一览表

很多家长关心宝鸡2020年最新的中学排名&#xff0c;选择一所好的中学尤为重要&#xff0c;本文小编整理了一些关于2020年宝鸡最新的中学排名相关数据&#xff0c;仅供参考。一、宝鸡中学排名前十名名单排名学校名称人气所在省所在市类型1扶风县扶风高中2822陕西宝鸡市省级示范高…

linux卸载python3_linux卸载python3

广告关闭 腾讯云11.11云上盛惠 &#xff0c;精选热门产品助力上云&#xff0c;云服务器首年88元起&#xff0c;买的越多返的越多&#xff0c;最高返5000元&#xff01; 一、卸载自带python1.rpm -qa | grep python | xargs rpm -e --allmatches --nodeps强制卸载自带的python以…