React源碼中的小方法

1.將對象解析成字符串
function friendlyStringify(obj) {
  if (typeof obj === 'object') {
    if (Array.isArray(obj)) {
      return '[' + obj.map(friendlyStringify).join(', ') + ']';
    } else {
      var pairs = [];
      for (var key in obj) {
        if (Object.prototype.hasOwnProperty.call(obj, key)) {
          var keyEscaped = /^[a-z$_][\w$_]*$/i.test(key) ? key : JSON.stringify(key);
          pairs.push(keyEscaped + ': ' + friendlyStringify(obj[key]));
        }
      }
      return '{' + pairs.join(', ') + '}';
    }
  } else if (typeof obj === 'string') {
    return JSON.stringify(obj);
  } else if (typeof obj === 'function') {
    return '[function object]';
  }
  // Differs from JSON.stringify in that undefined because undefined and that
  // inf and nan don't become null
  return String(obj);
}

? ?? ?首先對傳入?yún)?shù)的數(shù)據(jù)類型進行分析Object,String,Function。如果是Object判斷該Object是否為Array箩兽,如果是則遞歸遍歷其內(nèi)部的每一項。否則遍歷Object內(nèi)部的每一項將key和value做處理后存儲到數(shù)值pairs中坤按,并將pairs格式化為字符串返回死陆。

2.累積函數(shù)accumulateInto和accumulate

? ?? ?accumulate()函數(shù)將current與next進行拼接:

function accumulate(current, next) {
   if (current == null) {
    return next;
  }
  // Both are not empty. Warning: Never call x.concat(y) when you are not
  // certain that x is an Array (x could be a string with concat method).
//數(shù)組拼接成一個新的數(shù)組(或隊列)
  if (Array.isArray(current)) {
    return current.concat(next);
  }

  if (Array.isArray(next)) {
    return [current].concat(next);
  }
// 非數(shù)組,則
  return [current, next];
}

? ?? ?accumulateInto()函數(shù)將next寫入current數(shù)組中(或隊列里)

function accumulateInto(current, next) {
  if (current == null) {
    return next;
  }
  // Both are not empty. Warning: Never call x.concat(y) when you are not
  // certain that x is an Array (x could be a string with concat method).
  if (Array.isArray(current)) {
if (Array.isArray(next)) {
// 將next輸入寫入當(dāng)前數(shù)組中
      current.push.apply(current, next);
      return current;
    }
    current.push(next);
    return current;
  }
// current不是數(shù)組前联,next是數(shù)組
  if (Array.isArray(next)) {
    // A bit too dangerous to mutate `next`.
    return [current].concat(next);
  }
// 兩個都不是數(shù)組
  return [current, next];
}
5.合成事件的函數(shù)

5.1獲取事件target

function getEventTarget(nativeEvent) {
// 兼容性問題
  var target = nativeEvent.target || nativeEvent.srcElement || window;
  // Normalize SVG <use> element events #4963
  if (target.correspondingUseElement) {
    target = target.correspondingUseElement;
  }

  // Safari may fire events on text nodes (Node.TEXT_NODE is 3).
  // @see http://www.quirksmode.org/js/events_properties.html
  return target.nodeType === 3 ? target.parentNode : target;
}

5.2阻止合成事件的默認事(SyntheticEvent.js中)

preventDefault: function () {
    this.defaultPrevented = true;
    var event = this.nativeEvent;
    if (!event) {
      return;
    }
    if (event.preventDefault) {
      event.preventDefault();
      // eslint-disable-next-line valid-typeof
    } else if (typeof event.returnValue !== 'unknown') {
      event.returnValue = false;
    }
    this.isDefaultPrevented = emptyFunction.thatReturnsTrue;
  }

5.3 阻止合成事件冒泡

stopPropagation: function () {
    var event = this.nativeEvent;
    if (!event) {
      return;
    }
    if (event.stopPropagation) {
      event.stopPropagation();
          } else if (typeof event.cancelBubble !== 'unknown') {
      event.cancelBubble = true;
    }
    this.isPropagationStopped = emptyFunction.thatReturnsTrue;
  }

5.4遍歷合成事件的事件隊列

@param arr 事件隊列
@param cb 事件執(zhí)行完后的回調(diào)函數(shù)
@param scope 定義域
function forEachAccumulated(arr, cb, scope) {
  if (Array.isArray(arr)) {
    arr.forEach(cb, scope);
  } else if (arr) {
    cb.call(scope, arr);
  }
}

5.5 EventCharCode
獲取鍵盤字符,區(qū)分大小寫

function getEventCharCode(nativeEvent) {
  var charCode;
  var keyCode = nativeEvent.keyCode;
  if ('charCode' in nativeEvent) {
    charCode = nativeEvent.charCode;
    // FF does not set `charCode` for the Enter-key, check against `keyCode`.
    if (charCode === 0 && keyCode === 13) {
      charCode = 13;
    }
  } else {
    // IE8 does not implement `charCode`, but `keyCode` has the correct value.
    charCode = keyCode;
  }
  // Some non-printable keys are reported in `charCode`/`keyCode`, discard them.
  // Must not discard the (non-)printable Enter-key.
  if (charCode >= 32 || charCode === 13) {
    return charCode;
  }
  return 0;
}

5.6遍歷所有的祖先節(jié)點

var ancestor = targetInst;
  do {
    bookKeeping.ancestors.push(ancestor);
    ancestor = ancestor && findParent(ancestor);
  } while (ancestor);
向上尋找父節(jié)點的方法findParent
function findParent(inst) {
  // TODO: It may be a good idea to cache this to prevent unnecessary DOM
  // traversal, but caching is difficult to do correctly without using a
  // mutation observer to listen for all DOM changes.
  while (inst._hostParent) {
    inst = inst._hostParent;
  }
  var rootNode = ReactDOMComponentTree.getNodeFromInstance(inst);
  var container = rootNode.parentNode;
  return ReactDOMComponentTree.getClosestInstanceFromNode(container);
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末娶眷,一起剝皮案震驚了整個濱河市似嗤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌届宠,老刑警劉巖烁落,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乘粒,死亡現(xiàn)場離奇詭異,居然都是意外死亡伤塌,警方通過查閱死者的電腦和手機灯萍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來每聪,“玉大人旦棉,你說我怎么就攤上這事∫┦恚” “怎么了绑洛?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長果善。 經(jīng)常有香客問我诊笤,道長,這世上最難降的妖魔是什么巾陕? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任讨跟,我火速辦了婚禮,結(jié)果婚禮上鄙煤,老公的妹妹穿的比我還像新娘晾匠。我一直安慰自己,他們只是感情好梯刚,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布凉馆。 她就那樣靜靜地躺著,像睡著了一般亡资。 火紅的嫁衣襯著肌膚如雪澜共。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天锥腻,我揣著相機與錄音嗦董,去河邊找鬼。 笑死瘦黑,一個胖子當(dāng)著我的面吹牛京革,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播幸斥,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼匹摇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了甲葬?” 一聲冷哼從身側(cè)響起廊勃,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎演顾,沒想到半個月后供搀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隅居,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡钠至,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年葛虐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棉钧。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡屿脐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宪卿,到底是詐尸還是另有隱情的诵,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布佑钾,位于F島的核電站西疤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏休溶。R本人自食惡果不足惜代赁,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望兽掰。 院中可真熱鬧芭碍,春花似錦、人聲如沸孽尽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杉女。三九已至瞻讽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間熏挎,已是汗流浹背速勇。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留婆瓜,地道東北人快集。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像廉白,于是被迫代替她去往敵國和親个初。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容

  • //Clojure入門教程: Clojure – Functional Programming for the J...
    葡萄喃喃囈語閱讀 3,618評論 0 7
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法猴蹂,類相關(guān)的語法院溺,內(nèi)部類的語法,繼承相關(guān)的語法磅轻,異常的語法珍逸,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • 1.JQuery 基礎(chǔ) 改變web開發(fā)人員創(chuàng)造搞交互性界面的方式逐虚。設(shè)計者無需花費時間糾纏JS復(fù)雜的高級特性。 1....
    LaBaby_閱讀 1,162評論 0 1
  • 1.JQuery 基礎(chǔ) 改變web開發(fā)人員創(chuàng)造搞交互性界面的方式谆膳。設(shè)計者無需花費時間糾纏JS復(fù)雜的高級特性叭爱。 1....
    LaBaby_閱讀 1,325評論 0 2
  • 我找到我考研的理由了,我是為了換頭銜漱病,我是為了以后不是從一個不入流的大學(xué)畢業(yè)的买雾,我要努力攀登,不是說要做人上人嗎 ...
    盧小盈閱讀 204評論 0 0