react源码解析1.开篇介绍和面试题

news2024/9/26 3:19:40

怎样学习react源码

作为前端最常用的js库之一,熟悉react源码成了高级或资深前端工程师必备的能力,如果你不想停留在api的使用层面或者想在前端技能的深度上有所突破,那熟悉react源码将是你进步的很好的方式。

react的纯粹体现在它的api上,一切都是围绕setState状态更新进行的,但是内部的逻辑却经历了很大的重构和变化,而且代码量也不小,如果只是从源码文件和函数来阅读,那会很难以理解react的渲染流程。优秀工程师几年时间打造的库,必定有借鉴之处,那么我们应该怎样学习react源码呢。

react源码1.3

首先,我们可以从函数调用栈入手,理清react的各个模块的功能和它们调用的顺序,盖房子一样,先搭好架子,对源码有个整体的认识,然后再看每个模块的细节,第一遍的时候切忌纠结每个函数实现的细节,陷入各个函数的深度调用中。其次可以结合一些demo和自己画图理解,react源码中设计大量的链表操作,画图是一个很好的理解指针操作的方式。源码里也有一些英文注释,可以根据注释或者根据此react源码解析文章进行理解。

熟悉react源码并不是一朝一夕的事,想精进自己的技术,必须花时间才行。

react源码1.2

react源码3.2

教程特色

本教程遵循react v17.0.1源码的核心思想,目的是打造一门通俗易懂的react源码解析系列文章。教程从源码的各个模块开始,结合大量demo、示例图解和视频教程,带着大家一步一步调试react源码,教程也会完全遵循react17手写hook和精简版的react方便大家的理解,随着react大版本的更新,此教程也会一直更新。

教程结构

react源码1.1

教程收获

为什么要学习react源码呢,你是使用了api很久,停留在框架使用层面还是会主动去了解框架的逻辑和运行方式呢。跟着教程走,理解起来不费力,你将收获:

  • 面试加分:大厂前端岗都要求熟悉框架底层原理,也是面试必问环节,熟悉react源码会为你的面试加分,也会为你的谈薪流程增加不少筹码
  • 巩固基础知识:在源码的scheduler中使用了小顶堆 这种数据结构,调度的实现则使用了messageChannel,在render阶段的reconciler中则使用了fiber、update、链表 这些结构,lane模型使用了二进制掩码,我们也会介绍diff算法怎样降低对比复杂度。学习本教程也顺便巩固了数据结构和算法、事件循环。
  • 日常开发提升效率:熟悉react源码之后,你对react的运行流程有了新的认识,在日常的开发中,相信你对组件的性能优化、react使用技巧和解决bug会更加得心应手。

相信学完教程之后,你对react的理解一定会上升一个档次,甚至会超过大多数面试官了

常见面试题(带上问题学习吧)

以下这些问题可能你已经有答案了,但是你能从源码角度回答出来吗。

  1. jsx和Fiber有什么关系
  2. react17之前jsx文件为什么要声明import React from ‘react’,之后为什么不需要了
  3. Fiber是什么,它为什么能提高性能

hooks

  1. 为什么hooks不能写在条件判断中

状态/生命周期

  1. setState是同步的还是异步的
  2. componentWillMount、componentWillMount、componentWillUpdate为什么标记UNSAFE

组件

  1. react元素$$typeof属性什么
  2. react怎么区分Class组件和Function组件
  3. 函数组件和类组件的相同点和不同点

开放性问题

  1. 说说你对react的理解/请说一下react的渲染过程
  2. 聊聊react生命周期
  3. 简述diff算法
  4. react有哪些优化手段
  5. react为什么引入jsx
  6. 说说virtual Dom的理解
  7. 你对合成事件的理解
    1. 我们写的事件是绑定在dom上么,如果不是绑定在哪里?
    2. 为什么我们的事件手动绑定this(不是箭头函数的情况)
    3. 为什么不能用 return false 来阻止事件的默认行为?
    4. react怎么通过dom元素,找到与之对应的 fiber对象的?

解释结果和现象

  1. 点击Father组件的div,Child会打印Child吗
function Child() {
  console.log('Child');
  return <div>Child</div>;
}
function Father(props) {
  const [num, setNum] = React.useState(0);
  return (
    <div onClick={() => {setNum(num + 1)}}>
      {num}
      {props.children}
    </div>
  );
}
function App() {
  return (
    <Father>
      <Child/>
    </Father>
  );
}
const rootEl = document.querySelector("#root");
ReactDOM.render(<App/>, rootEl);

相关参考视频讲解:进入学习

  1. 打印顺序是什么
function Child() {
  useEffect(() => {
    console.log('Child');
  }, [])
  return <h1>child</h1>;
}

function Father() {
  useEffect(() => {
    console.log('Father');
  }, [])

  return <Child/>;
}

function App() {
  useEffect(() => {
    console.log('App');
  }, [])

  return <Father/>;
}
  1. useLayoutEffect/componentDidMount和useEffect的区别是什么
class App extends React.Component {
  componentDidMount() {
    console.log('mount');
  }
}

useEffect(() => {
  console.log('useEffect');
}, [])
  1. 如何解释demo_4、demo_8、demo_9出现的现象

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

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

相关文章

【神经网络】LSTM

1.什么是LSTM 长短期记忆&#xff08;Long short-term memory, LSTM&#xff09;是一种特殊的RNN&#xff0c;主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说&#xff0c;相比普通的RNN&#xff0c;LSTM能够在更长的序列中有更好的表现。 LSTM区别于RNN地方…

Java查漏补缺(09)异常概述、Java异常体系、常见的错误和异常、异常的处理、手动抛出异常对象:throw、自定义异常

Java查漏补缺&#xff08;09&#xff09;异常概述、Java异常体系、常见的错误和异常、异常的处理、手动抛出异常对象&#xff1a;throw、自定义异常本章专题与脉络1. 异常概述1.1 什么是生活的异常1.2 什么是程序的异常1.3 异常的抛出机制1.4 如何对待异常2. Java异常体系2.1 T…

【JAVA】xxl-job服务搭建

xxl-job服务搭建 1.下载xxl-job项目 https://github.com/xuxueli/xxl-job 2.数据库表创建 3.修改配置 注意&#xff1a;这是两个项目&#xff0c;一个是xxl-job前台&#xff0c;一个是xxl-job执行器&#xff0c;找到这两个项目得配置文件&#xff0c;修改配置。 配置文件地址…

day54【代码随想录】二刷数组

文章目录前言一、二分查找&#xff08;力扣724&#xff09;二、移除元素&#xff08;力扣27&#xff09;【双指针】三、有序数组的平方&#xff08;力扣977&#xff09;【双指针】四、合并两个有序数组&#xff08;力扣88&#xff09;五、长度最小的子数组&#xff08;力扣209&…

前端学习第二阶段-第3章 Flex 伸缩布局

3-1 移动端基础知识 01-移动端基础 02-视口 03-meta视口标签 04-物理像素与物理像素比 05-二倍图 06-背景缩放background-size 07-背景二倍图以及多倍图切图 08-移动端开发选择 09-移动端技术解决方案 10-移动端特殊样式 11-移动端技术选型 12-流式布局 3-2 移动端电商首页制作…

Python基础—while循环

(1)while循环&#xff1a; 语法格式&#xff1a; while 条件&#xff1a;   执行语句1……   执行语句2…… 适用条件&#xff1a;无限循环 死循环 while True:print(条件是真的&#xff01;)代码实例&#xff1a; i 0 # 创建一个计数的变量 while i < 5: # Truepr…

感知趋势,洞察发展:2023(第十届)趋势与预测大会成功举办

2023年2月23日&#xff0c;运联年会&#xff1a;2023&#xff08;第十届&#xff09;趋势与预测大会在深圳机场凯悦酒店成功闭幕。自2014年开始&#xff0c;“运联年会&#xff1a;趋势与预测”已经连续举办九届。这场大会&#xff0c;既是一次行业性的“年终总结”&#xff0c…

【Java开发】JUC基础 01:进程、线程、多线程

1 进程与线程1.1 进程开发写的代码称为程序&#xff0c;那么我们将程序运行起来&#xff0c;我们称之为进程&#xff1b;进程就是申请一块内存空间&#xff0c;将数据放到内存空间中去&#xff0c;是系统进行资源分配和调度的基本单位。&#x1f4cc; 程序与进程的区别程序是数…

QML Item

在QML中所有的可视项目都继承自Item&#xff0c;虽然Item本身没有可视化的外观&#xff0c;但它定义了可视化项目的所有属性。 Item可以作为容器使用&#xff1a; Item{Rectangle{id:retc}Rectangle{id:retc1}Rectangle{id:retc2}Rectangle{id:retc3}} item拥有children属性…

MyBatis学习笔记(七) —— 特殊SQL的执行

7、特殊SQL的执行 7.1、模糊查询 模糊查询的三种方式&#xff1a; 方式1&#xff1a;select * from t_user where username like ‘%${mohu}%’ 方式2&#xff1a;select * from t_user where username like concat(‘%’,#{mohu},‘%’) 方式3&#xff1a;select * from t_u…

DolphinScheduler跨版本升级1.3.8至3.0.1

DolphinScheduler跨版本升级1.3.8至3.0.1Refer背景基础环境依赖版本升级修改pom.xml问题解决MYSQL升级1.文件替换2.修改表结构t_ds_process_definitiont_ds_alertt_ds_process_instance3.时间参数修改4.数据库升级DOLPHIN安装zookeeper集群创建用户dolphinscheduler_env.shinst…

指针变量作为函数参数详解,形参和实参之间的值传递如何传递?如何改变指针变量所指向的变量?

函数的参数不仅可以是整型&#xff0c;浮点型&#xff0c;字符型等数据&#xff0c;还可以是指针类型&#xff1b;它的作用是将一个变量的地址传送到另一个函数中。 关于地址&#xff0c;指针&#xff0c;指针变量可以参考我的上一篇文章&#xff1a; 地址&#xff0c;指针&…

线程的基本方法

线程等待&#xff1a;wait方法 调用wait方法的线程会进入WAITING状态&#xff0c;只有等到其他线程的通知或程序被中断才会返回。调用wait方法后会释放对象的锁&#xff0c;因此 wait方法一般被用于同步方法或同步代码块中 。 线程睡眠&#xff1a;sleep方法 调用sleep方法会导…

Spring Boot 版本升级2.2.11.RELEASE至2.7.4

2.2.11.RELEASE > 2.7.4项目更新spring-boot-starter-parent 主依赖&#xff0c;导致项目跑不起了日志也没有输出有用信息&#xff0c;自己查看源码调试启动入口打断点&#xff0c;一步步进入方法定位项目停止代码我的项目执行到SpringApplication.class 的152行代码会停止项…

华为HCIE学习之Openstack Glance组件(glance对接swift)

文章目录一、Glance的结构二、服务部署流程三、将glance存储在swift中1、默认使用swift来存储2、指定可以存在swift中3、swift版本4、keystone的endpoint地址&#xff08;当glance去找swift时通过keystone去找&#xff09;5、租户名:用户名&#xff0c;用户必须拥有admin角色6、…

【C语言】自定义类型:结构体、枚举、联合

目录 1.结构体 1.1结构体类型 1.2结构体的自引用 1.3结构体的初始化 1.4结构体内存对齐 //对齐 //offsetof //修改默认对齐数 1.5结构体传参 2.位段 2.1位段的内存开辟 2.2位段的内存分配 3.枚举 4.联合&#xff08;共用体&#xff09; //判断大小端 1.结构体…

【GO】k8s 管理系统项目23[前端部分–工作负载-Pod]

k8s 管理系统项目[前端部分–工作负载-Deployment] 1. 代码部分 1.1 准备工作 由于Pod页面和Deployment内容差不多.那么就直接把Deployment的内容复制过来.再做修改. 替换Deployment为Pod替换Deploy为Pod替换deployment为pod替换deploy为pod禁用新增的按钮,删除新增方法,表…

django后端服务、logstash和flink接入VictoriaMetrics指标监控

0.简介 通过指标监控可以设置对应的告警&#xff0c;快速发现问题&#xff0c;并通过相应的指标定位问题。 背景&#xff1a;使用的 VictoriaMetrics(简称 VM) 作为监控的解决方案&#xff0c;需要将 django 服务、logstash 和 flink 引擎接入进来&#xff0c;VM 可以实时的获…

SpringBoot:SpringBoot配置文件.properties、.yml 和 .ymal(2)

SpringBoot配置文件1. 配置文件格式1.1 application.properties配置文件1.2 application.yml配置文件1.3 application.yaml配置文件1.4 三种配置文件优先级和区别2. yaml格式2.1 语法规则2.2 yaml书写2.2.1 字面量&#xff1a;单个的、不可拆分的值2.2.2 数组&#xff1a;一组按…

操作系统权限提升(十八)之Linux提权-内核提权

Linux 内核提权 Linux 内核提权原理 内核提权是利用Linux内核的漏洞进行提权的&#xff0c;内核漏洞进行提权一般包括三个环节&#xff1a; 1、对目标系统进行信息收集&#xff0c;获取到系统内核信息及版本信息&#xff1b; 2、根据内核版本获取其对应的漏洞以及EXP 3、使…