前言
React是一个用于构建界面的JavaScript库。它的核心是跟踪组件状态变化并将更新后的状态更新到屏幕上。在React中,我们把这个过程称为 reconciliation (协调)。通过调用setState方法,React检查状态或属性是否已更改,并在UI层上更新。
背景介绍
首先看一个简单的例子:
class ClickCounter extends React.Component {
constructor(props) {
super(props);
this.state = {count: 0};
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.setState((state) => {
return {count: state.count + 1};
});
}
render() {
return [
<button key="1" onClick={this.handleClick}>Update counter</button>,
<span key="2">{this.state.count}</span>
]
}
}
这是一个简单的计数器的例子, 点击按钮,组件的状态就会在处理程序中更新,组件的状态的更新反过来会引起span元素的内容更新。
下面是在协调阶段,React内部会有各种活动。以下是计数器在协调阶段所做的操作:
- 更新state的count属性
- 检查并比较ClickCounter的子代以及props
- 更新span元素
协调期间还会执行其他活动,例如调用生命周期方法,更新ref。这些活动在Fiber架构中统称为"work"(工作)。work的类型取决于React元素的类型。React元素有多种类型,比如类组件,函数组件,Portals,DOM节点等。而React元素类型则是由React.createElement的第一个参数决定。React.createElement函数在render创建元素中调用。
React.createElement到Fiber
JSX编译
<button key="1" onClick={this.onClick}>Update counter</button>
<span key="2">{this.state.count}</span>
JSX在经过编译后,会得到如下的结果。这是render方法真正返回的结果
class ClickCounter {
...
render() {
return [
React.createElement(
'button',
{
key: '1',
onClick: this.onClick
},
'Update counter'
),
React.createElement(
'span',
{
key: '2'
},
this.state.count
)
]
}
}
React.createElement函数会返回如下的结果:
[
{
$$typeof: Symbol(react.element),
type: 'button',
key: "1",
props: {
children: 'Update counter',
onClick: () => { ... }
}
},
{
$$typeof: Symbol(react.element),
type: 'span',
key: "2",
props: {
children: 0
}
}
]
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!