You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
function get(key) { // 得到instance的fiber
return key._reactInternalFiber;
}
如何得到fiber对应的dom
如果fiber.tag === HostComponent,即fiber 是div、span 等 html 元素类型,则该fiber的stateNode指向的就是具体的 dom节点
如何创建fiber
创建时 fiber 的 tag 有如下 11 种类型
var IndeterminateComponent = 0; // Before we know whether it is functional or class
var FunctionalComponent = 1;
var ClassComponent = 2;
var HostRoot = 3; // Root of a host tree. Could be nested inside another node.
var HostPortal = 4; // A subtree. Could be an entry point to a different renderer.
var HostComponent = 5;
var HostText = 6;
var CallComponent = 7;
var CallHandlerPhase = 8;
var ReturnComponent = 9;
var Fragment = 10;
什么是fiber
所谓
fiber
,它其实是一个react
中的架构,一个fiber
对象代表了一个work
单位优化渲染任务,让一个大组件细化,从同步变成异步,让渲染任务有了优先级。生命周期函数调用不再是同步的,让用户能感知的性能提高了。
fiber
可以把很大的工作分成一个个小块(trunk
),trunk
之间是异步的,每个trunk
之间可以执行别的操作。以
render
函数为界,分为两个阶段,在render
之前改变workInProgress tree
,执行生命周期函数比如componentWillMount
,componentWillReceiveProp
。在render
函数之后,执行componentDidMount
,componentDidUpdate
。在第一个阶段,可能被中断。优势
ui
时,如果很多work
突然运行,可以使动画帧下降。fiber
被视为virtual stack frame
,能定制调用栈优化行为,并能随意中断调用堆栈和手动操作堆栈帧。特性
work
结构
fiber
是一个JavaScript
对象,其中包含组件及组件的输入输出等信息,它也对应于一个组件的一个实例图解
fiber
对象fiber的属性及意义
type
,tag
,key
fiber
的type
和key
就像它们在React
元素中的作用一样。type
描述它对应的组件,可为f App() {},'div'
等。type
在ClassComponent
创建实例时能用到tag
为type
对应组件类型的值可以为构造函数(FunctionalComponent
)或类组件(ClassComponent
)或者html
标签HostComponent
key
在reconciliation
阶段决定如何重用fiber
child
和sibling
这两个属性指向其他
fiber
,描述一个fiber
的递归树结构child
对应一个fiber.props.children
中的第一个childFiber
在
render
方法返回的多元children
时,child
形成一个list
,头指针指向第一个孩子fiber
节点,则child
的sibling
就是第一个孩子fiber
几点的兄弟fiber
节点以上代码,
Parent
的child
为Child1
,Child1
的sibling
就为Child2
return
return fiber
是处理workInProgress
后返回的fiber
,被视为parent fiber
pendingProps
和memoizedProps
props
是应一个函数的参数。在fiber
中,pendingProps
在它执行之前被设置,memoizedProps
在它执行之后被设置当即将到来的
pendingProps
和memoizedProps
相同,标志着fiber
之前的输出能被重用,避免了不必要的工作alternate
work-in-progress
阶段:fiber
只是current fiber
的代替物current fiber
的alternate
是workInProgress
,workInProgress
的alternate
是current
stateNode
在
fiberRoot
中stateNode
指向root
,是一个循环对象,在root.current.alternate
下的fiber
中的stateNode
则是每个fiber
对应的dom
或者instance
fiber与dom及instance的对应关系
dom
中找到fiber
dom
元素中有以__reactInternalInstance
开头的属性,此属性即指向dom
对应的fiber
fiber
从思维导图中可以看到,如果
stateNode
为组件实例instance
,则其中有_reactInternalFiber
属性,指向该组件的fiber
如果
fiber.tag === HostComponent
,即fiber
是div、span
等html
元素类型,则该fiber
的stateNode
指向的就是具体的dom
节点如何创建fiber
创建时
fiber
的tag
有如下11
种类型最基础的创建
fiber
的方法是createFiber
,传入tag、key、internalContextTag
,返回FiberNode
实例reference
The text was updated successfully, but these errors were encountered: