跳到主要内容

React:关于react的一些问题

· 阅读需 4 分钟

整理一些react相关问题

jsx和Fiber的关系

jsx就是JavaScript的扩展语法,是React.createElement的语法糖,我们可以直接通过html的格式来表现节点结构和信息。

Fiber,就是用来存储节点的信息以及节点的优先级。

在初次渲染的时候,通过jsx对象来调用createFiberFromElement生成Fiber。在更新阶段,通过对比新的jsx和老的jsx,生成新的 Fiber树。

react17后可以不用引入“import React from ‘react’”

之前jsx通过编译后,变成了React.createElement,这样不引入react,就会报错。

react17改变了编译的方式,变成了jsx.createElement。

Fiber为什么可以提高性能?

Fiber是一个js对象,包含了节点信息、优先级、更新队列,也是一个工作单元。

Fiber在构建好workInProgress Fiber树后就切换成current Fiber,在内存中一次性切换,这样可以提高性能。

Fiber可以中断异步更新,作为工作单元,可以在时间片段内执行,结束后还没有完成的工作就暂停,在下次时间片段执行之前的工作,最后返回Fiber。Fiber可以在协调的时候,进行对应的diff,让最后的更新应用到真实DOM上。

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

因为hooks是按照顺序存储在链表中的,如果把hook放在条件判断中,就不无法保持链表的顺序。

setState是异步还是同步的

是异步的,因为react把多个state合并更新的

为什么部分生命周期函数标记了UNSAFE

新的Fiber架构可以在schedule的调度下实现暂停、继续,排列优先级。当优先级高的任务打断了优先级低的任务时,优先级低的人物就会被跳过,所有的生命周期可能执行多次,

标记UNSAFE表示这些生命周期过时,但是依然有效。

React元素的$$typeof属性

$$typeof属性,表示react元素类型,是一个symbol类型

React是如何区分类组件和函数组件的

类组件prototype上有isReactComponent属性

函数组件和类型的相同与不同

相同的地方就是都可以接收props和返回react元素。

类组件是面向对象编程,需要创建实例并且保存实例,占用了一定的内存;

函数组件,不用创建实例,直接输入返回输出,是函数式编程