成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

React源碼解析 - ReactClass.js

Big_fat_cat / 1856人閱讀

摘要:下面,我將從上到下挑選出能給自己一些啟發(fā)的源碼做注解。省略了很多代碼通過這段精簡的,我們看到,,返回的是一個構造函數(shù),該函數(shù)原型繼承于,并將參數(shù)中定義的屬性合并到其中。

ReactClass.js

源文件: https://github.com/facebook/react/blob/master/src/isomorphic/classic/class/ReactClass.js

2017.4.9 更新 自15.5版本開始,createClass將不再包含到react核心庫,而需要從一個獨立的npm package - create-react-class獲取。更新說明

我們最常用的React.createClass方法就是在這個文件中定義的(JSX代碼最終都要轉換成createClass這種形式的)。這也是我閱讀react源碼過程中,打算詳細解讀的第一個文件。下面,我將從上到下挑選出能給自己一些啟發(fā)的源碼做注解。有些代碼,已有注釋,就不在這里粘貼了。包含__DEV__的代碼段,也暫且忽略。

"use strict";

"use strict";是es5語法中用來定義嚴格模式的。顧名思議,嚴格模式使得js引擎校驗js語法的時候,標準更加嚴格。一些在非嚴格模式下被忽略的非友好的語法,在嚴格模式下會直接報錯。所以,總是使用嚴格模式,使得js代碼更加安全。這是一個好習慣。

var ReactBaseClasses = require("ReactBaseClasses");
var ReactElement = require("ReactElement");
var ReactNoopUpdateQueue = require("ReactNoopUpdateQueue");

ReactBaseClasses定義了React.ComponentReact.PureComponent兩個類,此處不展開。

ReactElement定義了一些操作React Element的方法,比如creatEelment,cloneElement,createFactory

ReactNoopUpdateQueue是默認的updater對象。當我們setState的時候,就會馬上調用updater.enqueueReplaceState方法,將新的state放入一個隊列中,異步處理。

var emptyObject = require("fbjs/lib/emptyObject");
var invariant = require("fbjs/lib/invariant");
var warning = require("fbjs/lib/warning");

fbjs是一個工具集,是獨立于react的另一個項目,被facebook不同項目所共享,如relay。

invariant用在一些強制條件不被滿足的地方,比如變量類型用錯。invariant在react項目中大量地使用,必須要細看一下。找到invariant文件的位置。繼續(xù)只關注值得學習的地方。

var args = [a, b, c, d, e, f];
var argIndex = 0;
error = new Error(
    format.replace(/%s/g, function() { return args[argIndex++]; })
);

get新技能,原來string的replace方法,是可以遞歸調用的。

warninginvariant類似,也會在瀏覽器中輸出紅色的提示,只是warning輸出的是警告信息,消息體中帶有warning字樣。warning所在的文件位置。

type SpecPolicy =
| "DEFINE_ONCE"
| "DEFINE_MANY"
| "OVERRIDE_BASE"
| "DEFINE_MANY_MERGED";

// ...
/**
 * @interface ReactClassInterface
 * @internal
 */
var ReactClassInterface: {[key: string]: SpecPolicy} = {
    mixins: "DEFINE_MANY",
    // ...
}

要理解上面一段代碼,就必須要了解react所用的類型系統(tǒng)Flow了。

type SpecPolicy定義了一個枚舉類型。

注釋中的@interface讓我誤以為ReactClassInterface是一個接口類型,其實不然,查flow文檔,才確定其為Object Type。它規(guī)定這個object中的每個key必須是一個string,值必須是SpecPolicy類型。[key: string]中的key本身只是種注解而已,為了方便代碼的閱讀,沒有實際的意義,你可以把它改為name等任何字符串。

// ... 省略了很多代碼
var ReactClassComponent = function() {};
Object.assign(
  ReactClassComponent.prototype,
  ReactComponent.prototype,
  ReactClassMixin,
);

var ReactClass = {
    createClass: function(spec) {
        var Constructor = identity(function(props, context, updater) {
            this.props = props;
            this.context = context;
            this.refs = emptyObject;
            // ...
        };
        Constructor.prototype = new ReactClassComponent();
        Constructor.prototype.constructor = Constructor;
        
        // ...
        
        mixSpecIntoComponent(Constructor, spec);
        
        // ...
        return Constructor;
    }
}

通過這段精簡的createClass,我們看到,createClass,返回的是一個構造函數(shù),該函數(shù)原型繼承于ReactClassComponent,并將參數(shù)spec中定義的屬性合并到其prototype中。如果結合createClass的一個實例來看個文件,就更容易理解了。比如:

const Contacts = React.createClass({
    propTypes: {
    
    },
    getDefaultProps() {
        return {
          
        };
    },
    render() {
        return (
          
); } });

基中,Contacts就是一個函數(shù),一個構造函數(shù)??梢杂脕砩?b>React.Component。

至此,這個800多行的React.createClass核心代碼,就理順了。

原文:http://react.apptravel.cn/article/59

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/82386.html

相關文章

  • react解析: render的FiberRoot(三)

    摘要:查看創(chuàng)建核心函數(shù)源碼行調用函數(shù)創(chuàng)建是相關,不用管源碼行這個指的是調用創(chuàng)建,下面我們將會說到對象源碼行源碼行函數(shù)中,首先創(chuàng)建了一個,然后又創(chuàng)建了一個,它們兩者還是相互引用。 感謝 yck: 剖析 React 源碼解析,本篇文章是在讀完他的文章的基礎上,將他的文章進行拆解和加工,加入我自己的一下理解和例子,便于大家理解。覺得yck寫的真的很棒 。React 版本為 16.8.6,關于源碼的...

    muddyway 評論0 收藏0
  • React源碼解析ReactDOM.render()

    摘要:一更新的方式有三種渲染接下來,我們就來看下源碼二作用在提供的里渲染一個元素,并返回對該組件的引用常見的用法是這個官網網址源碼服務端使用方法渲染節(jié)點是讓服務端盡可能復用節(jié)點,提高性能元素容器應用渲染結束后,調用的函數(shù)錯誤抓取方法本質是返回 showImg(https://segmentfault.com/img/remote/1460000020064414?w=1240&h=641);...

    iKcamp 評論0 收藏0
  • React源碼解析React.createRef()/forwardRef()

    摘要:一作用獲取目標的實例使用源碼可修改的不可變的對象沒見過這種寫法初始化對象,屬性初始值為解析源碼比較簡單,就是返回了帶有屬性的二作用從父組件中獲取子組件是的實例使用是沒有實例的,因為它是,所以沒有,所以不能通過來拿到實例將的傳給子組件,并綁定 showImg(https://segmentfault.com/img/remote/1460000019877636); 一、React.cr...

    aisuhua 評論0 收藏0
  • Luy 1.0 :一個React-like輪子的誕生

    摘要:司徒正美的一款了不起的化方案,支持到。行代碼內實現(xiàn)一個胡子大哈實現(xiàn)的作品其實就是的了源碼學習個人文章源碼學習個人文章源碼學習個人文章源碼學習個人文章這幾片文章的作者都是司徒正美,全面的解析和官方的對比。 前言 在過去的一個多月中,為了能夠更深入的學習,使用React,了解React內部算法,數(shù)據(jù)結構,我自己,從零開始寫了一個玩具框架。 截止今日,終于可以發(fā)布第一個版本,因為就在昨天,我...

    codecook 評論0 收藏0

發(fā)表評論

0條評論

Big_fat_cat

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<