摘要:比如這里就是判斷中是否含有這個屬性。這種設(shè)計方式我覺得挺有參考意義的,可以用在類似權(quán)限系統(tǒng)上。源碼正在閱讀中,有望一兩個月把所有成果放出來,有興趣的可以關(guān)注我
關(guān)于React中一些代碼設(shè)計
最近在看React的源碼,注意到了一些有意思的細節(jié),比如經(jīng)常會出現(xiàn)的一下比較和賦值代碼
workInProgress.effectTag |= Ref (workInProgress.effectTag & DidCapture) !== NoEffect
對于平時基本上沒怎么用到過移位運算的我一開始表示這是啥?為啥要這么設(shè)計?
我們先來看一下,這個effectTag具體會有那些值
// Don"t change these two values. They"re used by React Dev Tools. export const NoEffect = /* */ 0b00000000000; export const PerformedWork = /* */ 0b00000000001; // You can change the rest (and add more). export const Placement = /* */ 0b00000000010; export const Update = /* */ 0b00000000100; export const PlacementAndUpdate = /* */ 0b00000000110; export const Deletion = /* */ 0b00000001000; export const ContentReset = /* */ 0b00000010000; export const Callback = /* */ 0b00000100000; export const DidCapture = /* */ 0b00001000000; export const Ref = /* */ 0b00010000000; export const Snapshot = /* */ 0b00100000000; // Union of all host effects export const HostEffectMask = /* */ 0b00111111111; export const Incomplete = /* */ 0b01000000000; export const ShouldCapture = /* */ 0b10000000000;
這么一看貌似好像有點意思,可以看到大部分的值都只有一位是1,其他位都是0,0bxxx是原生二進制字面量的表示方法
那么回過頭去我們再看上面兩句表達式
workInProgress.effectTag |= Ref // 也就是 workInProgress.effectTag = workInProgress.effectTag | RefRef
我們隨便拿兩個值來舉例,比如Placement和Update,也就是0b00000000010 | 0b00000000100那么得到的結(jié)果是什么呢?0b00000000110,也就等于PlacementAndUpdate。所以這時候大家知道為什么大部分的值1所在的位置不一樣了吧,因為其實每一位的1代表一種屬性,把他們結(jié)合在一起就代表有多種屬性,不會有重復(fù)。
同樣的對于第二個表達式
(workInProgress.effectTag & DidCapture) !== NoEffect
我們拿Update和DidCapture來進行&操作,那么得到的結(jié)果就很明顯了,所有位都是0,所以后期的&操作是用來判斷在某個變量中是否含有某個屬性的。比如這里就是判斷workInProgress.effectTag中是否含有DidCapture這個屬性。
這種設(shè)計方式我覺得挺有參考意義的,可以用在類似權(quán)限系統(tǒng)上。大概現(xiàn)在很多權(quán)限系統(tǒng)已經(jīng)這么做了吧,只是我不知道。。。
React源碼正在閱讀中,有望一兩個月把所有成果放出來,有興趣的可以關(guān)注我
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/97430.html
摘要:爭取把源碼剖析透學(xué)習(xí)透。除了用戶定義的復(fù)合組件外元素還可能表示特定于平臺的主機組件。裝載的具體結(jié)果有時在源代碼中稱為裝載映像取決于渲染器,可能為節(jié)點字符串服務(wù)器或表示本機視圖的數(shù)值。其所缺少的關(guān)鍵部分是對更新的支持。 關(guān)于源碼解讀的系列文章,可以關(guān)注我的github的這個倉庫, 現(xiàn)在才剛剛寫,后續(xù)有空就寫點。爭取把react源碼剖析透學(xué)習(xí)透。有不正確的地方希望大家?guī)兔χ刚4蠹一ハ鄬W(xué)習(xí)...
摘要:介紹是個的靜態(tài)類型檢查工具,由出品的開源碼項目,問世只有一年多,是個相當(dāng)年輕的項目。現(xiàn)在,提供了另一個新的選項,它是一種強靜態(tài)類型的輔助檢查工具。 showImg(https://segmentfault.com/img/bVH6mL?w=1200&h=675); 本章的目標(biāo)是提供一些Flow工具的介紹與使用建議。Flow本質(zhì)上也只是個檢查工具,它并不會自動修正代碼中的錯誤,也不會強制...
摘要:提醒設(shè)計組件時,一般都按照把控大局,再設(shè)計好每個小組件的規(guī)律。本節(jié)內(nèi)容完畢下節(jié)內(nèi)容基礎(chǔ)之組件篇三將講解設(shè)計復(fù)合組件。 設(shè)計復(fù)合組件 showImg(https://segmentfault.com/img/remote/1460000015798841); 前言 你問我為什么寫博客? 因為阿拉斯加愛寫bugger!!! 微信公眾號:愛寫bugger的阿拉斯加如有問題或建議,請往公眾號,...
摘要:概述協(xié)調(diào),調(diào)解本身不存在公共的。安裝的確切結(jié)果有時在源代碼中稱為取決于渲染器,可以是節(jié)點,字符串或表示原生視圖。關(guān)鍵的缺失部分是對更新的支持。為避免混淆,我們將和的實例叫做內(nèi)部實例。但是,內(nèi)部實例樹包含復(fù)合和主機內(nèi)部實例。 本節(jié)是 stack reconciler程序的實現(xiàn)說明的集合。 本文有一定的技術(shù)含量,要對React公共API以及它如何分為核心,渲染器和協(xié)調(diào)(和解,reconci...
摘要:這個函數(shù)內(nèi)處理了的生命周期以及和生命周期鉤子函數(shù),調(diào)用返回實際要渲染的內(nèi)容,如果內(nèi)容是復(fù)合組件,仍然會調(diào)用,復(fù)合組件最終一定會返回原生組件,并且最終調(diào)用的函數(shù)生成要渲染的。 原文鏈接地址:https://github.com/Nealyang%EF%BC%9A%E7%BB%84%E4%BB%B6%E7%9A%84%E5%88%9D%E5%A7%8B%E5%8C%96%E4%B8%8E%...
閱讀 2089·2021-09-29 09:35
閱讀 693·2021-09-08 09:36
閱讀 3402·2021-09-03 10:30
閱讀 2119·2019-08-30 14:21
閱讀 2915·2019-08-30 11:18
閱讀 3320·2019-08-29 17:31
閱讀 3148·2019-08-29 17:29
閱讀 1316·2019-08-29 17:13