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 io操作有什么_Python笔记:文件IO操作

读取文件 使用open()打开文件&#xff0c;文件不存在会抛出IOError错误。 try: f open(/path/to/file, r) print(f.read()) finally: if f: f.close() 文件读取完成一定要close()&#xff0c;为了保证在报错的时候也能close()&#xff0c;这里用了finally语句&#xff0c;更简…

c语言编程被当作病毒,为什么这个微不足道的C程序被检测为病毒?

我有点生锈在C,但我遇到了这个奇怪的问题&#xff1a;我写了这个程序&#xff1a;#include main(){int n;n1;while (n>0){puts("Write a number: ");scanf(" %d",&n);printf("This is the number you wrote: %d\n", n);}}显然绝对没有语法…

太极发送卡片软件_QQ卡片式消息一键发送app

QQ卡片式消息一键发送app这是一款能够帮助你有创意的发送广告的app。属于qq的辅助工具&#xff0c;能够让你发送属于自己的卡片信息。如果你想要给自己打广告或者发送某张图片&#xff0c;或者想要显示应用&#xff0c;就可以使用这款软件&#xff0c;它能够帮你迅速地生成卡片…

c语言中字符串 x,使用c语言解析字符串176x144中的数字

在做jpeg codec的时候&#xff0c;经常需要输入图片的大小&#xff0c;即长和宽。对于一个jpeg图片&#xff0c;它的大小几乎是任意的&#xff0c;所以只能用数字来表示&#xff0c;而不能选择cif&#xff0c;qcif等这类固定的图片格式。在用数字表示图片大小时&#xff0c;大家…

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;根据安装器提示进行安装即可。安装完成…

centos usb转网口_CentOS5.6系统中安装并使用USB无线网卡(配置成功) 转

最近一直在配置linux服务器&#xff0c;因为家里装修的时候没有在墙面预留网络接口&#xff0c;所以我的台式机也使用无线网卡连接网络。在CentOS6.2下安装无线网卡的方法和CentOS5.6的方法是一样的&#xff0c;只是CentOS6.2下安装后&#xff0c;右上角会自动出现NetworkManag…

c语言中执行一次的函数once,iOS只执行一次的方法

IOS开发(64)之GCD任务最多只执行一次1 前言使用 dispatch_once 函数 在 APP 的生命周期内来保证你想确保每段代码只执行一次,即使它在代码的不同地方多次调用(比如单例的初始化)。2 代码实例ZYAppDelegate.m[plain]/一个用于调度一次函数的标识static dispatch_once_t onceToke…

python条件语句练习题_python学习-7 条件语句 while循环 + 练习题

1.死循环while 1 1:print(ok)结果是一直循环2.循环count 0while count < 10:print(count)count count 1print(error)3.练习题~ 使用while循环输出1 2 3 4 5 6 8 9 10count 1while count < 10 : # 或者count < 11if count 7:print( ) # 也可以添加pass&#xff…

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…

微信支持环信_环信客户互动云v5.39已发布:支持微信小程序接入

环信客户互动云v5.39_产品更新说明发布日期&#xff1a;2018-11-06客服模式质检中新增会话ID字段质检中新增会话ID字段&#xff0c;与历史会话中的会话ID对应&#xff0c;支持根据会话ID搜索质检会话&#xff0c;以及在质检详情中查看会话ID。便于质检员发现有问题的会话时&…

Android多线程优劣,Android 开发中用到的几个多线程解析

在开发工程中线程可以帮助我们提高运行速度&#xff0c;Android开发中我知道的线程有四个一个是老生长谈的Thread&#xff0c;第二个是asyncTask,第三个&#xff1a;TimetTask,第四个是Looper,四个多线程各有个的有点&#xff0c;Thread的运行速度是最快的&#xff0c;AsyncTas…

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

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

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

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

ios 点生成线路 百度地图_iOS SDK | 百度地图API SDK

注意事项1、静态库中采用ObjectC实现&#xff0c;因此需要您保证您工程中至少有一个.mm后缀的源文件(您可以将任意一个.m后缀的文件改名为.mm)&#xff0c;或者在工程属性中指定编译方式&#xff0c;即在Xcode的Project -> Edit Active Target -> Build Setting 中找到 C…

android中文转字节数组,如何将Android中的byte []转换为C中的uint8_T数组?

Java没有无符号整数类型,但相机并不真正关心.您可以安全地将从onPictureTaken()回调到达的字节数组转换为uint8_t *.旁注&#xff1a;很可能,图片将以JPEG流形式到达.更新&#xff1a;在C中实现onPictureTaken()的示例以下是您在活动中的所在地&#xff1a;mCamera Camera.ope…

python代码没有反应_没有任何编程经验者不要被Python简明手册误导。

想学python,没有任何编程经验者不要被python简明手册误导。1、python简明手册是一本好书但这本书是针对有经验的程序员看的&#xff0c;详细一点说&#xff0c;有3年以上c/java&#xff0c;、delphi/vb&#xff0c;php等有丰富项目经验的程序员看的&#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款热门笔记本电脑屏幕的表现如何…

layui轮播图切换会有跳动_Layui中轮播图切换函数说明

### Layui中轮播图切换函数说明 ######## 官方文档 [链接][Link 1] #####![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1bmFuOTYx_size_16_color_FFFFFF_t_70]关于轮播图的使用和讲解&#xff0c;官方文档例子都说…