整理一些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元素。
类组件是面向对象编程,需要创建实例并且保存实例,占用了一定的内存;
函数组件,不用创建实例,直接输入返回输出,是函数式编程