最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 深入理解React协调算法

    正文概述 掘金(dyhtps)   2021-02-19   612

    前言

    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>
            ]
        }
    }
    

    深入理解React协调算法

    这是一个简单的计数器的例子, 点击按钮,组件的状态就会在处理程序中更新,组件的状态的更新反过来会引起span元素的内容更新。

    下面是在协调阶段,React内部会有各种活动。以下是计数器在协调阶段所做的操作:

    1. 更新state的count属性
    2. 检查并比较ClickCounter的子代以及props
    3. 更新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
            }
        }
    ]
    

    起源地下载网 » 深入理解React协调算法

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元