Reactソースの読み取り:複合タイプのデザイン
2299 ワード
Reactのコード設計について
最近はReactのソースコードを見ていますが、いくつかの興味深い詳細に気づいています.
まず見てみます.この
振り返ってみます.上の二つの表現を見ます.
同様な第二の表現
このようなデザインはとても参考になります.似たような権限システムで使えます.多分今は多くの権限システムがこのようにしています.ただ私は分かりません..
Reactのソースコードは今読んでいます.一ヶ月か二ヶ月ですべての成果を出すことが期待されます.興味があるのは私に関心を持つことができます.
最近はReactのソースコードを見ていますが、いくつかの興味深い詳細に気づいています.
workInProgress.effectTag |= Ref
(workInProgress.effectTag & DidCapture) !== NoEffect
シフト演算は普段あまり使われていない私にとって最初に何を表しますか?なぜこのように設計しますか?まず見てみます.この
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
のように得られた結果は何ですか?0b00000000110
、つまりPlacementAndUpdate
です.ですから、この時点では、なぜ大部分の値1
が位置しているのかが分かります.各ビットの1
は属性を表しています.彼らを結合すると、複数の属性があり、重複がないということです.同様な第二の表現
(workInProgress.effectTag & DidCapture) !== NoEffect
Update
とDidCapture
を持って&
を操作したら、結果は明らかになります.すべてのビットは0
です.したがって、後期の&
は、ある変数に属性が含まれているかどうかを判断するために動作します.例えば、workInProgress.effectTag
にDidCapture
という属性が含まれているかどうかを判断する.このようなデザインはとても参考になります.似たような権限システムで使えます.多分今は多くの権限システムがこのようにしています.ただ私は分かりません..
Reactのソースコードは今読んでいます.一ヶ月か二ヶ月ですべての成果を出すことが期待されます.興味があるのは私に関心を持つことができます.