国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

React源碼解析之React.createContext()

booster / 3096人閱讀

摘要:我們只希望最多有兩個(gè)并發(fā)渲染器主要和次要主要和次要。輔助渲染器將自己的的存儲(chǔ)在多帶帶的字段中。

前言:
由于childContextReact17中會(huì)被廢棄,所以不去分析它了,主要是新 API— —createContext()的講解

一、React.createContext()

作用:
方便祖先組件與后代組件(中間隔了好多層組件)傳值

使用:
context.js:

import React from "react";

const contextTestOne={
  name:"chen",
  length:22,
}

export const wrapContext=React.createContext(contextTestOne.name)

祖先組件:

import { wrapContext } from "@/utils/context";

const Father=props=>{
  return (
     
)
}

子孫組件:

import { wrapContext } from "@/utils/context";

const getProviderValue=()=>{
  return {value=>{value}}
}

const Child=props=>{
return (
    getProviderValue()
  );
}

結(jié)果:

注意:
undefined傳遞給value時(shí),createContext中的defaultValue不會(huì)生效,Consumervalue顯示空值

React 官方文檔:
https://zh-hans.reactjs.org/docs/context.html#contextprovider

源碼:

/**
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @flow
 */

import {REACT_PROVIDER_TYPE, REACT_CONTEXT_TYPE} from "shared/ReactSymbols";

import type {ReactContext} from "shared/ReactTypes";

import warningWithoutStack from "shared/warningWithoutStack";
import warning from "shared/warning";

export function createContext(
  defaultValue: T,
  //使用Object.is()計(jì)算新老context的差異
  calculateChangedBits: ?(a: T, b: T) => number,
): ReactContext {
  if (calculateChangedBits === undefined) {
    calculateChangedBits = null;
  } else {
    //不看
    if (__DEV__) {
      warningWithoutStack(
        calculateChangedBits === null ||
          typeof calculateChangedBits === "function",
        "createContext: Expected the optional second argument to be a " +
          "function. Instead received: %s",
        calculateChangedBits,
      );
    }
  }

  const context: ReactContext = {
    //還是那句話,ReactContext中的$$typeof是
    // 作為createElement中的屬性type中的對(duì)象進(jìn)行存儲(chǔ)的,并不是ReactElement的$$typeof
    $$typeof: REACT_CONTEXT_TYPE,
    _calculateChangedBits: calculateChangedBits,
    //作為支持多個(gè)并發(fā)渲染器的解決方法,我們將一些渲染器分類為主要渲染器,將其他渲染器分類為輔助渲染器。
    // As a workaround to support multiple concurrent renderers, we categorize
    // some renderers as primary and others as secondary.

    //我們只希望最多有兩個(gè)并發(fā)渲染器:React Native(主要)和Fabric(次要);
    // React DOM(主要)和React ART(次要)。
    // 輔助渲染器將自己的context的value存儲(chǔ)在多帶帶的字段中。
    // We only expect
    // there to be two concurrent renderers at most: React Native (primary) and
    // Fabric (secondary); React DOM (primary) and React ART (secondary).
    // Secondary renderers store their context values on separate fields.

    //中的value就是賦值給_currentValue的

    //也就是說(shuō)_currentValue和_currentValue2作用是一樣的,只是分別給主渲染器和輔助渲染器使用
    _currentValue: defaultValue,
    _currentValue2: defaultValue,
    // Used to track how many concurrent renderers this context currently
    // supports within in a single renderer. Such as parallel server rendering.

    //用來(lái)追蹤該context的并發(fā)渲染器的數(shù)量
    _threadCount: 0,
    // These are circular
    Provider: (null: any),
    Consumer: (null: any),
  };
  //const obj={}
  //obj.provider._obj = obj
  context.Provider = {
    $$typeof: REACT_PROVIDER_TYPE,
    _context: context,
  };

  let hasWarnedAboutUsingNestedContextConsumers = false;
  let hasWarnedAboutUsingConsumerProvider = false;
  //不看
  if (__DEV__) {
    // A separate object, but proxies back to the original context object for
    // backwards compatibility. It has a different $$typeof, so we can properly
    // warn for the incorrect usage of Context as a Consumer.
    const Consumer = {
      $$typeof: REACT_CONTEXT_TYPE,
      _context: context,
      _calculateChangedBits: context._calculateChangedBits,
    };
    // $FlowFixMe: Flow complains about not setting a value, which is intentional here
    Object.defineProperties(Consumer, {
      Provider: {
        get() {
          if (!hasWarnedAboutUsingConsumerProvider) {
            hasWarnedAboutUsingConsumerProvider = true;
            warning(
              false,
              "Rendering  is not supported and will be removed in " +
                "a future major release. Did you mean to render  instead?",
            );
          }
          return context.Provider;
        },
        set(_Provider) {
          context.Provider = _Provider;
        },
      },
      _currentValue: {
        get() {
          return context._currentValue;
        },
        set(_currentValue) {
          context._currentValue = _currentValue;
        },
      },
      _currentValue2: {
        get() {
          return context._currentValue2;
        },
        set(_currentValue2) {
          context._currentValue2 = _currentValue2;
        },
      },
      _threadCount: {
        get() {
          return context._threadCount;
        },
        set(_threadCount) {
          context._threadCount = _threadCount;
        },
      },
      Consumer: {
        get() {
          if (!hasWarnedAboutUsingNestedContextConsumers) {
            hasWarnedAboutUsingNestedContextConsumers = true;
            warning(
              false,
              "Rendering  is not supported and will be removed in " +
                "a future major release. Did you mean to render  instead?",
            );
          }
          return context.Consumer;
        },
      },
    });
    // $FlowFixMe: Flow complains about missing properties because it doesn"t understand defineProperty
    context.Consumer = Consumer;
  }

  else {
    //const obj={}
    //obj.consumer=obj
    //也就是Consumber對(duì)象指向React.Context對(duì)象

    //在進(jìn)行渲染時(shí),為了保證Consumer拿到最新的值,
    //直接讓Consumer=React.Context,
    // React.Context中的_currentValue已經(jīng)被的value給賦值了
    //所以Consumer能立即拿到最新的值
    context.Consumer = context;
  }
  //不看
  if (__DEV__) {
    context._currentRenderer = null;
    context._currentRenderer2 = null;
  }

  return context;
}

解析:
不看__DEV__的話,還是挺簡(jiǎn)單的,需要注意的是context.Consumer = context,讓等于React.context,這樣能立即拿到提供的最新值

二、為什么要棄用childContext
因?yàn)?b>childContext對(duì)下層的組件影響太大了,即使子孫組件沒有用到childContext,子孫組件仍然要進(jìn)行Update,嚴(yán)重影響了性能

(完)

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/106160.html

相關(guān)文章

  • React 新特性講解及實(shí)例(一)

    摘要:接收一個(gè)屬性,這個(gè)組件會(huì)讓后代組件統(tǒng)一提供這個(gè)變量值。因此對(duì)于同一個(gè)對(duì)象而言,一定是后代元素。解決方法就是把內(nèi)聯(lián)函數(shù)提取出來(lái),如下講了這么多,我們還沒有講到其實(shí)我們已經(jīng)講完了的工作原理了。 本節(jié)主要講解以下幾個(gè)新的特性: Context ContextType lazy Suspense 錯(cuò)誤邊界(Error boundaries) memo 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博...

    Betta 評(píng)論0 收藏0
  • [ 一起學(xué)React系列 -- 4 ] 透?jìng)鞯腃ontext

    摘要:官方對(duì)的介紹是意思就是提供了一種通過組件樹傳遞數(shù)據(jù)的方法,而無(wú)需在每個(gè)級(jí)別手動(dòng)傳遞。這也是基于重要物證哈哈實(shí)例使用學(xué)習(xí)技術(shù)最終是要有產(chǎn)出的。依然被視作一個(gè)組件,不過不同的是它的子組件必須是一個(gè)方法并且該方法接收當(dāng)前對(duì)象并最終返回一個(gè)節(jié)點(diǎn)。 拋轉(zhuǎn)引玉 通過上一篇的科普我們知道如果父節(jié)點(diǎn)需要向子節(jié)點(diǎn)傳遞數(shù)據(jù),那么就得通過Props來(lái)實(shí)現(xiàn);那么擺在我們眼前的就有一個(gè)問題了:現(xiàn)有N個(gè)節(jié)點(diǎn)并且它...

    firim 評(píng)論0 收藏0
  • [源碼閱讀]高性能和可擴(kuò)展的React-Redux

    摘要:到主菜了,先看它的一看,我們應(yīng)該有個(gè)猜測(cè),這貨是個(gè)高階函數(shù)。可能有點(diǎn)繞,但就是這么一個(gè)個(gè)高階函數(shù)組成的,后面會(huì)詳細(xì)說(shuō)。定義了一個(gè)處理函數(shù)和高階函數(shù)執(zhí)行次的方法,這個(gè)方法比上面的復(fù)雜在于它需要檢測(cè)參數(shù)是否訂閱了。 注意:文章很長(zhǎng),只想了解邏輯而不深入的,可以直接跳到總結(jié)部分。 初識(shí) 首先,從它暴露對(duì)外的API開始 ReactReduxContext /* 提供了 React.creat...

    shuibo 評(píng)論0 收藏0
  • 精讀《React16 新特性》

    摘要:引言于發(fā)布版本,時(shí)至今日已更新到,且引入了大量的令人振奮的新特性,本文章將帶領(lǐng)大家根據(jù)更新的時(shí)間脈絡(luò)了解的新特性。其作用是根據(jù)傳遞的來(lái)更新。新增等指針事件。 1 引言 于 2017.09.26 Facebook 發(fā)布 React v16.0 版本,時(shí)至今日已更新到 React v16.6,且引入了大量的令人振奮的新特性,本文章將帶領(lǐng)大家根據(jù) React 更新的時(shí)間脈絡(luò)了解 React1...

    Nosee 評(píng)論0 收藏0
  • React Hooks 解析(下):進(jìn)階

    摘要:第一次了解這項(xiàng)特性的時(shí)候,真的有一種豁然開朗,發(fā)現(xiàn)新大陸的感覺。在絕大多數(shù)情況下,是更好的選擇。唯一例外的就是需要根據(jù)新的來(lái)進(jìn)行操作的場(chǎng)景。會(huì)保證在頁(yè)面渲染前執(zhí)行,也就是說(shuō)頁(yè)面渲染出來(lái)的是最終的效果。上面條規(guī)則都是為了保證調(diào)用順序的穩(wěn)定性。 歡迎關(guān)注我的公眾號(hào)睿Talk,獲取我最新的文章:showImg(https://segmentfault.com/img/bVbmYjo); 一、...

    APICloud 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<