Best JavaScript code snippet using playwright-internal
ReactFiberClassComponent.new.js
Source:ReactFiberClassComponent.new.js  
...49} from './SchedulingProfiler';50// React.Component uses a shared frozen object by default.51// We'll use it to determine whether we need to initialize legacy refs.52export const emptyRefsObject = new React.Component().refs;53export function applyDerivedStateFromProps(54  workInProgress: Fiber,55  ctor: any,56  getDerivedStateFromProps: (props: any, state: any) => any,57  nextProps: any,58) {59  const prevState = workInProgress.memoizedState;60  const partialState = getDerivedStateFromProps(nextProps, prevState);61  // Merge the partial state and the previous state.62  const memoizedState =63    partialState === null || partialState === undefined64      ? prevState65      : Object.assign({}, prevState, partialState);66  workInProgress.memoizedState = memoizedState;67  // Once the update queue is empty, persist the derived state onto the68  // base state.69  if (workInProgress.lanes === NoLanes) {70    // Queue is always non-null for classes71    const updateQueue: UpdateQueue<any> = (workInProgress.updateQueue: any);72    updateQueue.baseState = memoizedState;73  }74}75const classComponentUpdater = {76  isMounted,77  enqueueSetState(inst, payload, callback) {78    // è·åå½åè§¦åæ´æ°çfiberèç¹ãinstæ¯ç»ä»¶å®ä¾79    const fiber = getInstance(inst);80    // eventTimeæ¯å½åè§¦åæ´æ°çæ¶é´æ³81    const eventTime = requestEventTime();82    // è·åæ¬æ¬¡updateçä¼å
级83    const lane = requestUpdateLane(fiber);84    // å建update对象85    const update = createUpdate(eventTime, lane);86    // payloadå°±æ¯setStateçåæ°ï¼åè°å½æ°æè
æ¯å¯¹è±¡çå½¢å¼ã87    // å¤çæ´æ°æ¶åä¸è®¡ç®æ°ç¶æçè¿ç¨88    update.payload = payload;89    if (callback !== undefined && callback !== null) {90      update.callback = callback;91    }92  // payloadå°±æ¯setStateçåæ°ï¼åè°å½æ°æè
æ¯å¯¹è±¡çå½¢å¼ã93    // å建çupdateå
¥éupdateQueue94    enqueueUpdate(fiber, update);95    // å¼å§è¿è¡è°åº¦96    scheduleUpdateOnFiber(fiber, lane, eventTime);97    if (enableSchedulingProfiler) {98      markStateUpdateScheduled(fiber, lane);99    }100  },101  enqueueReplaceState(inst, payload, callback) {102    const fiber = getInstance(inst);103    const eventTime = requestEventTime();104    const lane = requestUpdateLane(fiber);105    const update = createUpdate(eventTime, lane);106    // ä¸enqueueSetStateçå¯ä¸åºå«107    update.tag = ReplaceState;108    update.payload = payload;109    if (callback !== undefined && callback !== null) {110      update.callback = callback;111    }112    enqueueUpdate(fiber, update);113    scheduleUpdateOnFiber(fiber, lane, eventTime);114    if (enableSchedulingProfiler) {115      markStateUpdateScheduled(fiber, lane);116    }117  },118  enqueueForceUpdate(inst, callback) {119    const fiber = getInstance(inst);120    const eventTime = requestEventTime();121    const lane = requestUpdateLane(fiber);122    const update = createUpdate(eventTime, lane);123    // ä¸enqueueSetStateçå¯ä¸åºå«124    update.tag = ForceUpdate;125    if (callback !== undefined && callback !== null) {126      update.callback = callback;127    }128    enqueueUpdate(fiber, update);129    scheduleUpdateOnFiber(fiber, lane, eventTime);130    if (enableSchedulingProfiler) {131      markForceUpdateScheduled(fiber, lane);132    }133  },134};135// å
é¨ä¼è°ç¨shouldComponentUpdateæ¹æ³ã以åå½è¯¥ClassComponent为PureComponentæ¶ä¼æµ
æ¯è¾stateä¸props136function checkShouldComponentUpdate(137  workInProgress,138  ctor,139  oldProps,140  newProps,141  oldState,142  newState,143  nextContext,144) {145  const instance = workInProgress.stateNode;146  // ä¼å
å¤çshouldComponentUpdate147  if (typeof instance.shouldComponentUpdate === 'function') {148    const shouldUpdate = instance.shouldComponentUpdate(149      newProps,150      newState,151      nextContext,152    );153    return shouldUpdate;154  }155  // å¦ææ²¡æshouldComponentUpdateï¼åå¤çæ¯å¦æPureComponent156  if (ctor.prototype && ctor.prototype.isPureReactComponent) {157    // 该ClassComponent为PureComponentæ¶ä¼æµ
æ¯è¾stateä¸props158    return (159      !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState)160    );161  }162  // å¦åæ»æ¯è¿åæ´æ°163  return true;164}165function adoptClassInstance(workInProgress: Fiber, instance: any): void {166  instance.updater = classComponentUpdater;167  workInProgress.stateNode = instance;168  // The instance needs access to the fiber so that it can schedule updates169  setInstance(instance, workInProgress);170}171function constructClassInstance(172  workInProgress: Fiber,173  ctor: any,174  props: any,175): any {176  let isLegacyContextConsumer = false;177  let unmaskedContext = emptyContextObject;178  let context = emptyContextObject;179  const contextType = ctor.contextType;180  if (typeof contextType === 'object' && contextType !== null) {181    context = readContext((contextType: any));182  } else {183    unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);184    const contextTypes = ctor.contextTypes;185    isLegacyContextConsumer =186      contextTypes !== null && contextTypes !== undefined;187    context = isLegacyContextConsumer188      ? getMaskedContext(workInProgress, unmaskedContext)189      : emptyContextObject;190  }191  // Instantiate twice to help detect side-effects.192  const instance = new ctor(props, context);193  const state = (workInProgress.memoizedState =194    instance.state !== null && instance.state !== undefined195      ? instance.state196      : null);197  adoptClassInstance(workInProgress, instance);198  // Cache unmasked context so we can avoid recreating masked context unless necessary.199  // ReactFiberContext usually updates this cache but can't for newly-created instances.200  if (isLegacyContextConsumer) {201    cacheContext(workInProgress, unmaskedContext, context);202  }203  return instance;204}205function callComponentWillMount(workInProgress, instance) {206  const oldState = instance.state;207  if (typeof instance.componentWillMount === 'function') {208    instance.componentWillMount();209  }210  if (typeof instance.UNSAFE_componentWillMount === 'function') {211    instance.UNSAFE_componentWillMount();212  }213  if (oldState !== instance.state) {214    classComponentUpdater.enqueueReplaceState(instance, instance.state, null);215  }216}217function callComponentWillReceiveProps(218  workInProgress,219  instance,220  newProps,221  nextContext,222) {223  const oldState = instance.state;224  if (typeof instance.componentWillReceiveProps === 'function') {225    instance.componentWillReceiveProps(newProps, nextContext);226  }227  if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {228    instance.UNSAFE_componentWillReceiveProps(newProps, nextContext);229  }230  if (instance.state !== oldState) {231    classComponentUpdater.enqueueReplaceState(instance, instance.state, null);232  }233}234// Invokes the mount life-cycles on a previously never rendered instance.235function mountClassInstance(236  workInProgress: Fiber,237  ctor: any,238  newProps: any,239  renderLanes: Lanes,240): void {241  const instance = workInProgress.stateNode;242  instance.props = newProps;243  instance.state = workInProgress.memoizedState;244  instance.refs = emptyRefsObject;245  initializeUpdateQueue(workInProgress);246  const contextType = ctor.contextType;247  if (typeof contextType === 'object' && contextType !== null) {248    instance.context = readContext(contextType);249  } else {250    const unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);251    instance.context = getMaskedContext(workInProgress, unmaskedContext);252  }253  processUpdateQueue(workInProgress, newProps, instance, renderLanes);254  instance.state = workInProgress.memoizedState;255  const getDerivedStateFromProps = ctor.getDerivedStateFromProps;256  if (typeof getDerivedStateFromProps === 'function') {257    applyDerivedStateFromProps(258      workInProgress,259      ctor,260      getDerivedStateFromProps,261      newProps,262    );263    instance.state = workInProgress.memoizedState;264  }265  // In order to support react-lifecycles-compat polyfilled components,266  // Unsafe lifecycles should not be invoked for components using the new APIs.267  if (268    typeof ctor.getDerivedStateFromProps !== 'function' &&269    typeof instance.getSnapshotBeforeUpdate !== 'function' &&270    (typeof instance.UNSAFE_componentWillMount === 'function' ||271      typeof instance.componentWillMount === 'function')272  ) {273    callComponentWillMount(workInProgress, instance);274    // If we had additional state updates during this life-cycle, let's275    // process them now.276    processUpdateQueue(workInProgress, newProps, instance, renderLanes);277    instance.state = workInProgress.memoizedState;278  }279  if (typeof instance.componentDidMount === 'function') {280      workInProgress.flags |= Update;281  }282}283function resumeMountClassInstance(284  workInProgress: Fiber,285  ctor: any,286  newProps: any,287  renderLanes: Lanes,288): boolean {289  const instance = workInProgress.stateNode;290  const oldProps = workInProgress.memoizedProps;291  instance.props = oldProps;292  const oldContext = instance.context;293  const contextType = ctor.contextType;294  let nextContext = emptyContextObject;295  if (typeof contextType === 'object' && contextType !== null) {296    nextContext = readContext(contextType);297  } else  {298    const nextLegacyUnmaskedContext = getUnmaskedContext(299      workInProgress,300      ctor,301      true,302    );303    nextContext = getMaskedContext(workInProgress, nextLegacyUnmaskedContext);304  }305  const getDerivedStateFromProps = ctor.getDerivedStateFromProps;306  const hasNewLifecycles =307    typeof getDerivedStateFromProps === 'function' ||308    typeof instance.getSnapshotBeforeUpdate === 'function';309  // Note: During these life-cycles, instance.props/instance.state are what310  // ever the previously attempted to render - not the "current". However,311  // during componentDidUpdate we pass the "current" props.312  // In order to support react-lifecycles-compat polyfilled components,313  // Unsafe lifecycles should not be invoked for components using the new APIs.314  if (315    !hasNewLifecycles &&316    (typeof instance.UNSAFE_componentWillReceiveProps === 'function' ||317      typeof instance.componentWillReceiveProps === 'function')318  ) {319    if (oldProps !== newProps || oldContext !== nextContext) {320      callComponentWillReceiveProps(321        workInProgress,322        instance,323        newProps,324        nextContext,325      );326    }327  }328  resetHasForceUpdateBeforeProcessing();329  const oldState = workInProgress.memoizedState;330  let newState = (instance.state = oldState);331  processUpdateQueue(workInProgress, newProps, instance, renderLanes);332  newState = workInProgress.memoizedState;333  if (334    oldProps === newProps &&335    oldState === newState &&336    !hasContextChanged() &&337    !checkHasForceUpdateAfterProcessing()338  ) {339    // If an update was already in progress, we should schedule an Update340    // effect even though we're bailing out, so that cWU/cDU are called.341    if (typeof instance.componentDidMount === 'function') {342        workInProgress.flags |= Update;343    }344    return false;345  }346  if (typeof getDerivedStateFromProps === 'function') {347    applyDerivedStateFromProps(348      workInProgress,349      ctor,350      getDerivedStateFromProps,351      newProps,352    );353    newState = workInProgress.memoizedState;354  }355  const shouldUpdate =356    // checkHasForceUpdateAfterProcessingï¼æ¬æ¬¡æ´æ°çUpdateä¸åå¨tag为ForceUpdateï¼åè¿åtrue357    checkHasForceUpdateAfterProcessing() ||358    checkShouldComponentUpdate(359      workInProgress,360      ctor,361      oldProps,362      newProps,363      oldState,364      newState,365      nextContext,366    );367  if (shouldUpdate) {368    // In order to support react-lifecycles-compat polyfilled components,369    // Unsafe lifecycles should not be invoked for components using the new APIs.370    if (371      !hasNewLifecycles &&372      (typeof instance.UNSAFE_componentWillMount === 'function' ||373        typeof instance.componentWillMount === 'function')374    ) {375      if (typeof instance.componentWillMount === 'function') {376        instance.componentWillMount();377      }378      if (typeof instance.UNSAFE_componentWillMount === 'function') {379        instance.UNSAFE_componentWillMount();380      }381    }382    if (typeof instance.componentDidMount === 'function') {383        workInProgress.flags |= Update;384    }385  } else {386    // If an update was already in progress, we should schedule an Update387    // effect even though we're bailing out, so that cWU/cDU are called.388    if (typeof instance.componentDidMount === 'function') {389        workInProgress.flags |= Update;390    }391    // If shouldComponentUpdate returned false, we should still update the392    // memoized state to indicate that this work can be reused.393    workInProgress.memoizedProps = newProps;394    workInProgress.memoizedState = newState;395  }396  // Update the existing instance's state, props, and context pointers even397  // if shouldComponentUpdate returns false.398  instance.props = newProps;399  instance.state = newState;400  instance.context = nextContext;401  return shouldUpdate;402}403// Invokes the update life-cycles and returns false if it shouldn't rerender.404function updateClassInstance(405  current: Fiber,406  workInProgress: Fiber,407  ctor: any,408  newProps: any,409  renderLanes: Lanes,410): boolean {411  const instance = workInProgress.stateNode;412  cloneUpdateQueue(current, workInProgress);413  const unresolvedOldProps = workInProgress.memoizedProps;414  const oldProps =415    workInProgress.type === workInProgress.elementType416      ? unresolvedOldProps417      : resolveDefaultProps(workInProgress.type, unresolvedOldProps);418  instance.props = oldProps;419  const unresolvedNewProps = workInProgress.pendingProps;420  const oldContext = instance.context;421  const contextType = ctor.contextType;422  let nextContext = emptyContextObject;423  if (typeof contextType === 'object' && contextType !== null) {424    nextContext = readContext(contextType);425  } else  {426    const nextUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);427    nextContext = getMaskedContext(workInProgress, nextUnmaskedContext);428  }429  const getDerivedStateFromProps = ctor.getDerivedStateFromProps;430  const hasNewLifecycles =431    typeof getDerivedStateFromProps === 'function' ||432    typeof instance.getSnapshotBeforeUpdate === 'function';433  // Note: During these life-cycles, instance.props/instance.state are what434  // ever the previously attempted to render - not the "current". However,435  // during componentDidUpdate we pass the "current" props.436  // In order to support react-lifecycles-compat polyfilled components,437  // Unsafe lifecycles should not be invoked for components using the new APIs.438  if (439    !hasNewLifecycles &&440    (typeof instance.UNSAFE_componentWillReceiveProps === 'function' ||441      typeof instance.componentWillReceiveProps === 'function')442  ) {443    // unresolvedOldProps为ç»ä»¶ä¸æ¬¡æ´æ°æ¶çpropsï¼444    // èunresolvedNewProps忥èªClassComponentè°ç¨this.renderè¿åçJSXä¸çpropsåæ°ã445    // å¯è§ä»ä»¬çå¼ç¨æ¯ä¸åçãæä»¥ä»ä»¬å
¨çæ¯è¾ä¸ºfalse446    if (447      unresolvedOldProps !== unresolvedNewProps ||448      oldContext !== nextContext449    ) {450      // ä¼è°ç¨componentWillRecieveProps451      callComponentWillReceiveProps(452        workInProgress,453        instance,454        newProps,455        nextContext,456      );457    }458  }459  resetHasForceUpdateBeforeProcessing();460  const oldState = workInProgress.memoizedState;461  let newState = (instance.state = oldState);462  processUpdateQueue(workInProgress, newProps, instance, renderLanes);463  newState = workInProgress.memoizedState;464  if (465    unresolvedOldProps === unresolvedNewProps &&466    oldState === newState &&467    !hasContextChanged() &&468    !checkHasForceUpdateAfterProcessing()469  ) {470    // If an update was already in progress, we should schedule an Update471    // effect even though we're bailing out, so that cWU/cDU are called.472    if (typeof instance.componentDidUpdate === 'function') {473      if (474        unresolvedOldProps !== current.memoizedProps ||475        oldState !== current.memoizedState476      ) {477        workInProgress.flags |= Update;478      }479    }480    if (typeof instance.getSnapshotBeforeUpdate === 'function') {481      if (482        unresolvedOldProps !== current.memoizedProps ||483        oldState !== current.memoizedState484      ) {485        workInProgress.flags |= Snapshot;486      }487    }488    return false;489  }490  if (typeof getDerivedStateFromProps === 'function') {491    applyDerivedStateFromProps(492      workInProgress,493      ctor,494      getDerivedStateFromProps,495      newProps,496    );497    newState = workInProgress.memoizedState;498  }499  const shouldUpdate =500    checkHasForceUpdateAfterProcessing() ||501    checkShouldComponentUpdate(502      workInProgress,503      ctor,504      oldProps,505      newProps,...ReactFiberClassComponent.old.js
Source:ReactFiberClassComponent.old.js  
...51const isArray = Array.isArray;52// React.Component uses a shared frozen object by default.53// We'll use it to determine whether we need to initialize legacy refs.54export const emptyRefsObject = new React.Component().refs;55export function applyDerivedStateFromProps(56  workInProgress: Fiber,57  ctor: any,58  getDerivedStateFromProps: (props: any, state: any) => any,59  nextProps: any,60) {61  const prevState = workInProgress.memoizedState;62  const partialState = getDerivedStateFromProps(nextProps, prevState);63  // Merge the partial state and the previous state.64  const memoizedState =65    partialState === null || partialState === undefined66      ? prevState67      : Object.assign({}, prevState, partialState);68  workInProgress.memoizedState = memoizedState;69  // Once the update queue is empty, persist the derived state onto the70  // base state.71  if (workInProgress.lanes === NoLanes) {72    // Queue is always non-null for classes73    const updateQueue: UpdateQueue<any> = (workInProgress.updateQueue: any);74    updateQueue.baseState = memoizedState;75  }76}77const classComponentUpdater = {78  isMounted,79  enqueueSetState(inst, payload, callback) {80    const fiber = getInstance(inst);81    const eventTime = requestEventTime();82    const lane = requestUpdateLane(fiber);83    const update = createUpdate(eventTime, lane);84    update.payload = payload;85    if (callback !== undefined && callback !== null) {86      update.callback = callback;87    }88    enqueueUpdate(fiber, update);89    scheduleUpdateOnFiber(fiber, lane, eventTime);90    if (enableSchedulingProfiler) {91      markStateUpdateScheduled(fiber, lane);92    }93  },94  enqueueReplaceState(inst, payload, callback) {95    const fiber = getInstance(inst);96    const eventTime = requestEventTime();97    const lane = requestUpdateLane(fiber);98    const update = createUpdate(eventTime, lane);99    update.tag = ReplaceState;100    update.payload = payload;101    if (callback !== undefined && callback !== null) {102      update.callback = callback;103    }104    enqueueUpdate(fiber, update);105    scheduleUpdateOnFiber(fiber, lane, eventTime);106    if (enableSchedulingProfiler) {107      markStateUpdateScheduled(fiber, lane);108    }109  },110  enqueueForceUpdate(inst, callback) {111    const fiber = getInstance(inst);112    const eventTime = requestEventTime();113    const lane = requestUpdateLane(fiber);114    const update = createUpdate(eventTime, lane);115    update.tag = ForceUpdate;116    if (callback !== undefined && callback !== null) {117      update.callback = callback;118    }119    enqueueUpdate(fiber, update);120    scheduleUpdateOnFiber(fiber, lane, eventTime);121    if (enableSchedulingProfiler) {122      markForceUpdateScheduled(fiber, lane);123    }124  },125};126function checkShouldComponentUpdate(127  workInProgress,128  ctor,129  oldProps,130  newProps,131  oldState,132  newState,133  nextContext,134) {135  const instance = workInProgress.stateNode;136  if (typeof instance.shouldComponentUpdate === 'function') {137    const shouldUpdate = instance.shouldComponentUpdate(138      newProps,139      newState,140      nextContext,141    );142    return shouldUpdate;143  }144  if (ctor.prototype && ctor.prototype.isPureReactComponent) {145    return (146      !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState)147    );148  }149  return true;150}151function adoptClassInstance(workInProgress: Fiber, instance: any): void {152  instance.updater = classComponentUpdater;153  workInProgress.stateNode = instance;154  // The instance needs access to the fiber so that it can schedule updates155  setInstance(instance, workInProgress);156}157function constructClassInstance(158  workInProgress: Fiber,159  ctor: any,160  props: any,161): any {162  let isLegacyContextConsumer = false;163  let unmaskedContext = emptyContextObject;164  let context = emptyContextObject;165  const contextType = ctor.contextType;166  if (typeof contextType === 'object' && contextType !== null) {167    context = readContext((contextType: any));168  } else if (!disableLegacyContext) {169    unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);170    console.log('unmaskedContext', unmaskedContext);171    const contextTypes = ctor.contextTypes;172    isLegacyContextConsumer =173      contextTypes !== null && contextTypes !== undefined;174    context = isLegacyContextConsumer175      ? getMaskedContext(workInProgress, unmaskedContext)176      : emptyContextObject;177  }178  // Instantiate twice to help detect side-effects.179  const instance = new ctor(props, context);180  const state = (workInProgress.memoizedState =181    instance.state !== null && instance.state !== undefined182      ? instance.state183      : null);184  adoptClassInstance(workInProgress, instance);185  // Cache unmasked context so we can avoid recreating masked context unless necessary.186  // ReactFiberContext usually updates this cache but can't for newly-created instances.187  if (isLegacyContextConsumer) {188    cacheContext(workInProgress, unmaskedContext, context);189  }190  return instance;191}192function callComponentWillMount(workInProgress, instance) {193  const oldState = instance.state;194  if (typeof instance.componentWillMount === 'function') {195    instance.componentWillMount();196  }197  if (typeof instance.UNSAFE_componentWillMount === 'function') {198    instance.UNSAFE_componentWillMount();199  }200  if (oldState !== instance.state) {201    classComponentUpdater.enqueueReplaceState(instance, instance.state, null);202  }203}204function callComponentWillReceiveProps(205  workInProgress,206  instance,207  newProps,208  nextContext,209) {210  const oldState = instance.state;211  if (typeof instance.componentWillReceiveProps === 'function') {212    instance.componentWillReceiveProps(newProps, nextContext);213  }214  if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {215    instance.UNSAFE_componentWillReceiveProps(newProps, nextContext);216  }217  if (instance.state !== oldState) {218    classComponentUpdater.enqueueReplaceState(instance, instance.state, null);219  }220}221// Invokes the mount life-cycles on a previously never rendered instance.222function mountClassInstance(223  workInProgress: Fiber,224  ctor: any,225  newProps: any,226  renderLanes: Lanes,227): void {228  const instance = workInProgress.stateNode;229  instance.props = newProps;230  instance.state = workInProgress.memoizedState;231  instance.refs = emptyRefsObject;232  initializeUpdateQueue(workInProgress);233  const contextType = ctor.contextType;234  if (typeof contextType === 'object' && contextType !== null) {235    instance.context = readContext(contextType);236  } else if (disableLegacyContext) {237    instance.context = emptyContextObject;238  } else {239    const unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);240    instance.context = getMaskedContext(workInProgress, unmaskedContext);241  }242  processUpdateQueue(workInProgress, newProps, instance, renderLanes);243  instance.state = workInProgress.memoizedState;244  const getDerivedStateFromProps = ctor.getDerivedStateFromProps;245  if (typeof getDerivedStateFromProps === 'function') {246    applyDerivedStateFromProps(247      workInProgress,248      ctor,249      getDerivedStateFromProps,250      newProps,251    );252    instance.state = workInProgress.memoizedState;253  }254  // In order to support react-lifecycles-compat polyfilled components,255  // Unsafe lifecycles should not be invoked for components using the new APIs.256  if (257    typeof ctor.getDerivedStateFromProps !== 'function' &&258    typeof instance.getSnapshotBeforeUpdate !== 'function' &&259    (typeof instance.UNSAFE_componentWillMount === 'function' ||260      typeof instance.componentWillMount === 'function')261  ) {262    callComponentWillMount(workInProgress, instance);263    // If we had additional state updates during this life-cycle, let's264    // process them now.265    processUpdateQueue(workInProgress, newProps, instance, renderLanes);266    instance.state = workInProgress.memoizedState;267  }268  if (typeof instance.componentDidMount === 'function') {269    workInProgress.flags |= Update;270  }271}272function resumeMountClassInstance(273  workInProgress: Fiber,274  ctor: any,275  newProps: any,276  renderLanes: Lanes,277): boolean {278  const instance = workInProgress.stateNode;279  const oldProps = workInProgress.memoizedProps;280  instance.props = oldProps;281  const oldContext = instance.context;282  const contextType = ctor.contextType;283  let nextContext = emptyContextObject;284  if (typeof contextType === 'object' && contextType !== null) {285    nextContext = readContext(contextType);286  } else if (!disableLegacyContext) {287    const nextLegacyUnmaskedContext = getUnmaskedContext(288      workInProgress,289      ctor,290      true,291    );292    nextContext = getMaskedContext(workInProgress, nextLegacyUnmaskedContext);293  }294  const getDerivedStateFromProps = ctor.getDerivedStateFromProps;295  const hasNewLifecycles =296    typeof getDerivedStateFromProps === 'function' ||297    typeof instance.getSnapshotBeforeUpdate === 'function';298  // Note: During these life-cycles, instance.props/instance.state are what299  // ever the previously attempted to render - not the "current". However,300  // during componentDidUpdate we pass the "current" props.301  // In order to support react-lifecycles-compat polyfilled components,302  // Unsafe lifecycles should not be invoked for components using the new APIs.303  if (304    !hasNewLifecycles &&305    (typeof instance.UNSAFE_componentWillReceiveProps === 'function' ||306      typeof instance.componentWillReceiveProps === 'function')307  ) {308    if (oldProps !== newProps || oldContext !== nextContext) {309      callComponentWillReceiveProps(310        workInProgress,311        instance,312        newProps,313        nextContext,314      );315    }316  }317  resetHasForceUpdateBeforeProcessing();318  const oldState = workInProgress.memoizedState;319  let newState = (instance.state = oldState);320  processUpdateQueue(workInProgress, newProps, instance, renderLanes);321  newState = workInProgress.memoizedState;322  if (323    oldProps === newProps &&324    oldState === newState &&325    !hasContextChanged() &&326    !checkHasForceUpdateAfterProcessing()327  ) {328    // If an update was already in progress, we should schedule an Update329    // effect even though we're bailing out, so that cWU/cDU are called.330    if (typeof instance.componentDidMount === 'function') {331      workInProgress.flags |= Update;332    }333    return false;334  }335  if (typeof getDerivedStateFromProps === 'function') {336    applyDerivedStateFromProps(337      workInProgress,338      ctor,339      getDerivedStateFromProps,340      newProps,341    );342    newState = workInProgress.memoizedState;343  }344  const shouldUpdate =345    checkHasForceUpdateAfterProcessing() ||346    checkShouldComponentUpdate(347      workInProgress,348      ctor,349      oldProps,350      newProps,351      oldState,352      newState,353      nextContext,354    );355  if (shouldUpdate) {356    // In order to support react-lifecycles-compat polyfilled components,357    // Unsafe lifecycles should not be invoked for components using the new APIs.358    if (359      !hasNewLifecycles &&360      (typeof instance.UNSAFE_componentWillMount === 'function' ||361        typeof instance.componentWillMount === 'function')362    ) {363      if (typeof instance.componentWillMount === 'function') {364        instance.componentWillMount();365      }366      if (typeof instance.UNSAFE_componentWillMount === 'function') {367        instance.UNSAFE_componentWillMount();368      }369    }370    if (typeof instance.componentDidMount === 'function') {371      workInProgress.flags |= Update;372    }373  } else {374    // If an update was already in progress, we should schedule an Update375    // effect even though we're bailing out, so that cWU/cDU are called.376    if (typeof instance.componentDidMount === 'function') {377      workInProgress.flags |= Update;378    }379    // If shouldComponentUpdate returned false, we should still update the380    // memoized state to indicate that this work can be reused.381    workInProgress.memoizedProps = newProps;382    workInProgress.memoizedState = newState;383  }384  // Update the existing instance's state, props, and context pointers even385  // if shouldComponentUpdate returns false.386  instance.props = newProps;387  instance.state = newState;388  instance.context = nextContext;389  return shouldUpdate;390}391// Invokes the update life-cycles and returns false if it shouldn't rerender.392function updateClassInstance(393  current: Fiber,394  workInProgress: Fiber,395  ctor: any,396  newProps: any,397  renderLanes: Lanes,398): boolean {399  const instance = workInProgress.stateNode;400  cloneUpdateQueue(current, workInProgress);401  const unresolvedOldProps = workInProgress.memoizedProps;402  const oldProps =403    workInProgress.type === workInProgress.elementType404      ? unresolvedOldProps405      : resolveDefaultProps(workInProgress.type, unresolvedOldProps);406  instance.props = oldProps;407  const unresolvedNewProps = workInProgress.pendingProps;408  const oldContext = instance.context;409  const contextType = ctor.contextType;410  let nextContext = emptyContextObject;411  if (typeof contextType === 'object' && contextType !== null) {412    nextContext = readContext(contextType);413  } else if (!disableLegacyContext) {414    const nextUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);415    nextContext = getMaskedContext(workInProgress, nextUnmaskedContext);416  }417  const getDerivedStateFromProps = ctor.getDerivedStateFromProps;418  const hasNewLifecycles =419    typeof getDerivedStateFromProps === 'function' ||420    typeof instance.getSnapshotBeforeUpdate === 'function';421  // Note: During these life-cycles, instance.props/instance.state are what422  // ever the previously attempted to render - not the "current". However,423  // during componentDidUpdate we pass the "current" props.424  // In order to support react-lifecycles-compat polyfilled components,425  // Unsafe lifecycles should not be invoked for components using the new APIs.426  if (427    !hasNewLifecycles &&428    (typeof instance.UNSAFE_componentWillReceiveProps === 'function' ||429      typeof instance.componentWillReceiveProps === 'function')430  ) {431    if (432      unresolvedOldProps !== unresolvedNewProps ||433      oldContext !== nextContext434    ) {435      callComponentWillReceiveProps(436        workInProgress,437        instance,438        newProps,439        nextContext,440      );441    }442  }443  resetHasForceUpdateBeforeProcessing();444  const oldState = workInProgress.memoizedState;445  let newState = (instance.state = oldState);446  processUpdateQueue(workInProgress, newProps, instance, renderLanes);447  newState = workInProgress.memoizedState;448  if (449    unresolvedOldProps === unresolvedNewProps &&450    oldState === newState &&451    !hasContextChanged() &&452    !checkHasForceUpdateAfterProcessing()453  ) {454    // If an update was already in progress, we should schedule an Update455    // effect even though we're bailing out, so that cWU/cDU are called.456    if (typeof instance.componentDidUpdate === 'function') {457      if (458        unresolvedOldProps !== current.memoizedProps ||459        oldState !== current.memoizedState460      ) {461        workInProgress.flags |= Update;462      }463    }464    if (typeof instance.getSnapshotBeforeUpdate === 'function') {465      if (466        unresolvedOldProps !== current.memoizedProps ||467        oldState !== current.memoizedState468      ) {469        workInProgress.flags |= Snapshot;470      }471    }472    return false;473  }474  if (typeof getDerivedStateFromProps === 'function') {475    applyDerivedStateFromProps(476      workInProgress,477      ctor,478      getDerivedStateFromProps,479      newProps,480    );481    newState = workInProgress.memoizedState;482  }483  const shouldUpdate =484    checkHasForceUpdateAfterProcessing() ||485    checkShouldComponentUpdate(486      workInProgress,487      ctor,488      oldProps,489      newProps,...ReactFiberClassComponent.js
Source:ReactFiberClassComponent.js  
...152  processUpdateQueue(workInProgress, newProps, instance, renderLanes);153  instance.state = workInProgress.memoizedState;154  const getDerivedStateFromProps = ctor.getDerivedStateFromProps;155  if (typeof getDerivedStateFromProps === 'function') {156    applyDerivedStateFromProps(157      workInProgress,158      ctor,159      getDerivedStateFromProps,160      newProps161    );162    instance.state = workInProgress.memoizedState;163  }164  if (165    typeof ctor.getDerivedStateFromProps !== 'function' &&166    typeof instance.getSnapshotBeforeUpdate !== 'function' &&167    (typeof instance.UNSAFE_componentWillMount === 'function' ||168      typeof instance.componentWillMount === 'function')169  ) {170    callComponentWillMount(workInProgress, instance);171    processUpdateQueue(workInProgress, newProps, instance, renderLanes);172    instance.state = workInProgress.memoizedState;173  }174  if (typeof instance.componentDidMount === 'function') {175    workInProgress.flags |= Update;176  }177};178const callComponentWillReceiveProps = (179  workInProgress,180  instance,181  newProps,182  nextContext183) => {184  const oldState = instance.state;185  if (typeof instance.componentWillReceiveProps === 'function') {186    instance.componentWillReceiveProps(newProps, nextContext);187  }188  if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {189    instance.UNSAFE_componentWillReceiveProps(newProps, nextContext);190  }191  if (instance.state !== oldState) {192    classComponentUpdater.enqueueReplaceState(instance, instance.state, null);193  }194};195const checkShouldComponentUpdate = (196  workInProgress,197  ctor,198  oldProps,199  newProps,200  oldState,201  newState,202  nextContext203) => {204  const instance = workInProgress.stateNode;205  if (typeof instance.shouldComponentUpdate === 'function') {206    const shouldUpdate = instance.shouldComponentUpdate(207      newProps,208      newState,209      nextContext210    );211    return shouldUpdate;212  }213  if (ctor.prototype && ctor.prototype.isPureReactComponent) {214    return (215      !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState)216    );217  }218  return true;219};220const resumeMountClassInstance = (221  workInProgress,222  ctor,223  newProps,224  renderLanes225) => {226  const instance = workInProgress.stateNode;227  const oldProps = workInProgress.memoizedProps;228  instance.props = oldProps;229  const oldContext = instance.context;230  const contextType = ctor.contextType;231  let nextContext = emptyContextObject;232  if (typeof contextType === 'object' && contextType !== null) {233    nextContext = readContext(contextType);234  } else {235    const nextLegacyUnmaskedContext = getUnmaskedContext(236      workInProgress,237      ctor,238      true239    );240    nextContext = getMaskedContext(workInProgress, nextLegacyUnmaskedContext);241  }242  const getDerivedStateFromProps = ctor.getDerivedStateFromProps;243  const hasNewLifecycles =244    typeof getDerivedStateFromProps === 'function' ||245    typeof instance.getSnapshotBeforeUpdate === 'function';246  if (247    !hasNewLifecycles &&248    (typeof instance.UNSAFE_componentWillReceiveProps === 'function' ||249      typeof instance.componentWillReceiveProps === 'function')250  ) {251    if (oldProps !== newProps || oldContext !== nextContext) {252      callComponentWillReceiveProps(253        workInProgress,254        instance,255        newProps,256        nextContext257      );258    }259  }260  resetHasForceUpdateBeforeProcessing();261  const oldState = workInProgress.memoizedState;262  let newState = (instance.state = oldState);263  processUpdateQueue(workInProgress, newProps, instance, renderLanes);264  newState = workInProgress.memoizedState;265  if (266    oldProps === newProps &&267    oldState === newState &&268    !hasContextChanged() &&269    !checkHasForceUpdateAfterProcessing()270  ) {271    if (typeof instance.componentDidMount === 'function') {272      workInProgress.flags |= Update;273    }274    return false;275  }276  if (typeof getDerivedStateFromProps === 'function') {277    applyDerivedStateFromProps(278      workInProgress,279      ctor,280      getDerivedStateFromProps,281      newProps282    );283    newState = workInProgress.memoizedState;284  }285  const shouldUpdate =286    checkHasForceUpdateAfterProcessing() ||287    checkShouldComponentUpdate(288      workInProgress,289      ctor,290      oldProps,291      newProps,292      oldState,293      newState,294      nextContext295    );296  if (shouldUpdate) {297    if (298      !hasNewLifecycles &&299      (typeof instance.UNSAFE_componentWillMount === 'function' ||300        typeof instance.componentWillMount === 'function')301    ) {302      if (typeof instance.componentWillMount === 'function') {303        instance.componentWillMount();304      }305      if (typeof instance.UNSAFE_componentWillMount === 'function') {306        instance.UNSAFE_componentWillMount();307      }308    }309    if (typeof instance.componentDidMount === 'function') {310      workInProgress.flags |= Update;311    }312  } else {313    if (typeof instance.componentDidMount === 'function') {314      workInProgress.flags |= Update;315    }316    workInProgress.memoizedProps = newProps;317    workInProgress.memoizedState = newState;318  }319  instance.props = newProps;320  instance.state = newState;321  instance.context = nextContext;322  return shouldUpdate;323};324const updateClassInstance = (325  current,326  workInProgress,327  ctor,328  newProps,329  renderLanes330) => {331  const instance = workInProgress.stateNode;332  cloneUpdateQueue(current, workInProgress);333  const unresolvedOldProps = workInProgress.memoizedProps;334  const oldProps =335    workInProgress.type === workInProgress.elementType336      ? unresolvedOldProps337      : resolveDefaultProps(workInProgress.type, unresolvedOldProps);338  instance.props = oldProps;339  const unresolvedNewProps = workInProgress.pendingProps;340  const oldContext = instance.context;341  const contextType = ctor.contextType;342  let nextContext = emptyContextObject;343  if (typeof contextType === 'object' && contextType !== null) {344    nextContext = readContext(contextType);345  } else if (!disableLegacyContext) {346    const nextUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);347    nextContext = getMaskedContext(workInProgress, nextUnmaskedContext);348  }349  const getDerivedStateFromProps = ctor.getDerivedStateFromProps;350  const hasNewLifecycles =351    typeof getDerivedStateFromProps === 'function' ||352    typeof instance.getSnapshotBeforeUpdate === 'function';353  if (354    !hasNewLifecycles &&355    (typeof instance.UNSAFE_componentWillReceiveProps === 'function' ||356      typeof instance.componentWillReceiveProps === 'function')357  ) {358    if (359      unresolvedOldProps !== unresolvedNewProps ||360      oldContext !== nextContext361    ) {362      callComponentWillReceiveProps(363        workInProgress,364        instance,365        newProps,366        nextContext367      );368    }369  }370  resetHasForceUpdateBeforeProcessing();371  const oldState = workInProgress.memoizedState;372  let newState = (instance.state = oldState);373  processUpdateQueue(workInProgress, newProps, instance, renderLanes);374  newState = workInProgress.memoizedState;375  if (376    unresolvedOldProps === unresolvedNewProps &&377    oldState === newState &&378    !hasContextChanged() &&379    !checkHasForceUpdateAfterProcessing()380  ) {381    if (typeof instance.componentDidUpdate === 'function') {382      if (383        unresolvedOldProps !== current.memoizedProps ||384        oldState !== current.memoizedState385      ) {386        workInProgress.flags |= Update;387      }388    }389    if (typeof instance.getSnapshotBeforeUpdate === 'function') {390      if (391        unresolvedOldProps !== current.memoizedProps ||392        oldState !== current.memoizedState393      ) {394        workInProgress.flags |= Snapshot;395      }396    }397    return false;398  }399  if (typeof getDerivedStateFromProps === 'function') {400    applyDerivedStateFromProps(401      workInProgress,402      ctor,403      getDerivedStateFromProps,404      newProps405    );406    newState = workInProgress.memoizedState;407  }408  const shouldUpdate =409    checkHasForceUpdateAfterProcessing() ||410    checkShouldComponentUpdate(411      workInProgress,412      ctor,413      oldProps,414      newProps,...reconciler.js
Source:reconciler.js  
...110    instance.props = nextProps;111    instance.state = workInProgress.memoizedState;112    instance.refs = EMPTY_REFS;113    processUpdate(workInProgress, instance);114    applyDerivedStateFromProps(workInProgress, Component, nextProps);115    if (typeof instance.componentDidMount === 'function') {116      workInProgress.effectTag |= UPDATE;117    }118    shouldUpdate = true;119  } else {120    shouldUpdate = updateClassInstance(workInProgress, Component, nextProps);121  }122  return finishClassComponent(workInProgress, Component, shouldUpdate);123}124function updateClassInstance(workInProgress, Component, nextProps) {125  const instance = workInProgress.stateNode;126  const oldProps = workInProgress.memoizedProps;127  128  instance.props = oldProps;129  const oldState = workInProgress.memoizedState;130  let newState = instance.state = oldState;131  processUpdate(workInProgress, instance);132  133  newState = workInProgress.memoizedState;134  applyDerivedStateFromProps(workInProgress, Component, nextProps);135  136  let shouldUpdate = checkShouldComponentUpdate(workInProgress, Component, oldProps, nextProps, oldState, newState);137  if (shouldUpdate) {138    if (typeof instance.componentDidUpdate === 'function') {139      workInProgress.effectTag |= UPDATE;140    }141    if (typeof instance.getSnapshotBeforeUpdate === 'function') {142      workInProgress.effectTag |= SNAPSHOT;143    }144  } else {145    if (typeof instance.componentDidUpdate === 'function') {146      if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {147        workInProgress.effectTag |= UPDATE;148      }149    }150    if (typeof instance.getSnapshotBeforeUpdate === 'function') {151      if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {152        workInProgress.effectTag |= SNAPSHOT;153      }154    }155    workInProgress.memoizedProps = nextProps;156    workInProgress.memoizedState = newState;157  }158  instance.props = nextProps;159  instance.state = newState;160  instance._reactInternalFiber = workInProgress;161  return shouldUpdate;162}163function finishClassComponent(workInProgress, Component, shouldUpdate) {164  const ref = workInProgress.ref;165  if (ref !== null) {166    workInProgress.effectTag |= REF;167  }168  if (!shouldUpdate) {169    return bailoutOnAlreadyFinishedWork(current, workInProgress);170  }171  const instance = workInProgress.stateNode;172  const nextChildren = instance.render();173  174  workInProgress.effectTag |= PERFORMED_WORK;175  // if (current !== null) {176  //   workInProgress.child = reconcileChildFibers(workInProgress, current.child, nextChildren);177  // } else {178  //   reconcileChildren(current, workInProgress, nextChildren);179  // }180  reconcileChildren(workInProgress, nextChildren);181  workInProgress.memoizedState = instance.state;182  return workInProgress.child;183}184function applyDerivedStateFromProps(workInProgress, Component, nextProps) {185  const getDerivedStateFromProps = Component.getDerivedStateFromProps;186  if (typeof getDerivedStateFromProps === 'function') {187    const memoizedState = workInProgress.memoizedState;188    const nextState = getDerivedStateFromProps(nextProps, memoizedState);189    instance.state = workInProgress.memoizedState = nextState === null || nextState === undefined ? 190      memoizedState : 191      { ...memoizedState, partialState };192  }193}194function processUpdate (195	workInProgress,196	instance197) {198  let resultState = null;...VueRelayQueryRenderer.js
Source:VueRelayQueryRenderer.js  
1import Vue from 'vue'2import VueRelayQueryFetcher from './VueRelayQueryFetcher'3import { VUE_RELAY_PROPS } from './buildVueRelayContainer'4import areEqual from 'fbjs/lib/areEqual'5import {6  createOperationDescriptor,7  deepFreeze,8  getRequest9} from 'relay-runtime'10const requestCache = {}11const NETWORK_ONLY = 'NETWORK_ONLY'12const STORE_THEN_NETWORK = 'STORE_THEN_NETWORK'13const DataFromEnum = {14  NETWORK_ONLY,15  STORE_THEN_NETWORK16}17const VueRelayQueryRenderer = {18  name: 'relay-query-renderer',19  props: {20    cacheConfig: {21      type: Object22    },23    dataFrom: {24      type: String,25      validator (val) {26        return Object.values(DataFromEnum).indexOf(val) !== -127      }28    },29    environment: {30      type: Object,31      required: true32    },33    query: {},34    variables: {35      type: Object,36      default: () => ({})37    }38  },39  data () {40    // Callbacks are attached to the current instance and shared with static41    // lifecyles by bundling with state. This is okay to do because the42    // callbacks don't change in reaction to props. However we should not43    // "leak" them before mounting (since we would be unable to clean up). For44    // that reason, we define them as null initially and fill them in after45    // mounting to avoid leaking memory.46    const retryCallbacks = {47      handleDataChange: null,48      handleRetryAfterError: null49    }50    let queryFetcher51    let requestCacheKey52    if (this.query) {53      const { query } = this54      const request = getRequest(query)55      requestCacheKey = getRequestCacheKey(request.params, this.variables)56      queryFetcher = requestCache[requestCacheKey]57        ? requestCache[requestCacheKey].queryFetcher58        : new VueRelayQueryFetcher()59    } else {60      queryFetcher = new VueRelayQueryFetcher()61    }62    this.state = {63      prevPropsEnvironment: this.environment,64      prevPropsVariables: this.variables,65      prevQuery: this.query,66      queryFetcher,67      retryCallbacks,68      ...fetchQueryAndComputeStateFromProps(69        this.$props,70        queryFetcher,71        retryCallbacks,72        requestCacheKey73      )74    }75    return {}76  },77  methods: {78    applyDerivedStateFromProps () {79      this.setState(this.getDerivedStateFromProps(this.$props, this.state))80    },81    setState (partialState) {82      if (typeof partialState === 'function') {83        partialState = partialState({ ...this.state })84      }85      if (partialState != null) {86        const nextState = {87          ...this.state,88          ...partialState89        }90        const forceUpdate = this.shouldComponentUpdate(this.$props, nextState)91        this.state = nextState92        if (forceUpdate) {93          this.$forceUpdate()94        }95      }96    },97    getDerivedStateFromProps (nextProps, prevState) {98      if (99        prevState.prevQuery !== nextProps.query ||100        prevState.prevPropsEnvironment !== nextProps.environment ||101        !areEqual(prevState.prevPropsVariables, nextProps.variables)102      ) {103        const { query } = nextProps104        const prevSelectionReferences = prevState.queryFetcher.getSelectionReferences()105        prevState.queryFetcher.disposeRequest()106        let queryFetcher107        if (query) {108          const request = getRequest(query)109          const requestCacheKey = getRequestCacheKey(110            request.params,111            nextProps.variables112          )113          queryFetcher = requestCache[requestCacheKey]114            ? requestCache[requestCacheKey].queryFetcher115            : new VueRelayQueryFetcher(prevSelectionReferences)116        } else {117          queryFetcher = new VueRelayQueryFetcher(prevSelectionReferences)118        }119        return {120          prevQuery: nextProps.query,121          prevPropsEnvironment: nextProps.environment,122          prevPropsVariables: nextProps.variables,123          queryFetcher: queryFetcher,124          ...fetchQueryAndComputeStateFromProps(125            nextProps,126            queryFetcher,127            prevState.retryCallbacks128            // passing no requestCacheKey will cause it to be recalculated internally129            // and we want the updated requestCacheKey, since variables may have changed130          )131        }132      }133      return null134    },135    shouldComponentUpdate (_, nextState) {136      return (137        nextState.renderProps !== this.state.renderProps138      )139    }140  },141  watch: {142    environment: 'applyDerivedStateFromProps',143    query: 'applyDerivedStateFromProps',144    variables: {145      handler: 'applyDerivedStateFromProps',146      deep: true147    }148  },149  render (h) {150    const { renderProps, relayContext } = this.state151    // Note that the root fragment results in `renderProps.props` is already152    // frozen by the store; this call is to freeze the renderProps object and153    // error property if set.154    if (process.env.NODE_ENV !== 'production') {155      deepFreeze(renderProps)156    }157    this[VUE_RELAY_PROPS].__relayContext = Object.freeze({158      ...relayContext159    })160    return h('keep-alive', {161      props: {162        include: []163      }164    }, this.$scopedSlots.default(renderProps))165  },166  mounted () {167    const { retryCallbacks, queryFetcher, requestCacheKey } = this.state168    if (requestCacheKey) {169      delete requestCache[requestCacheKey]170    }171    retryCallbacks.handleDataChange = (params) => {172      const error = params.error == null ? null : params.error173      const snapshot = params.snapshot == null ? null : params.snapshot174      this.setState(prevState => {175        const { requestCacheKey: prevRequestCacheKey } = prevState176        if (prevRequestCacheKey) {177          delete requestCache[prevRequestCacheKey]178        }179        // Don't update state if nothing has changed.180        if (snapshot === prevState.snapshot && error === prevState.error) {181          return null182        }183        return {184          renderProps: getRenderProps(185            error,186            snapshot,187            prevState.queryFetcher,188            prevState.retryCallbacks189          ),190          snapshot,191          requestCacheKey: null192        }193      })194    }195    retryCallbacks.handleRetryAfterError = (_) =>196      this.setState(prevState => {197        const { requestCacheKey: prevRequestCacheKey } = prevState198        if (prevRequestCacheKey) {199          delete requestCache[prevRequestCacheKey]200        }201        return {202          renderProps: getLoadingRenderProps(),203          requestCacheKey: null204        }205      })206    // Re-initialize the VueRelayQueryFetcher with callbacks.207    // If data has changed since constructions, this will re-render.208    if (this.$props.query) {209      queryFetcher.setOnDataChange(retryCallbacks.handleDataChange)210    }211  },212  updated () {213    // We don't need to cache the request after the component commits214    const { requestCacheKey } = this.state215    if (requestCacheKey) {216      delete requestCache[requestCacheKey]217      // HACK218      delete this.state.requestCacheKey219    }220  },221  beforeDestroy () {222    this.state.queryFetcher.dispose()223  },224  provide () {225    return {226      [VUE_RELAY_PROPS]: (this[VUE_RELAY_PROPS] = Vue.observable({227        __relayContext: Object.freeze({228          ...this.state.relayContext229        })230      }))231    }232  }233}234function getContext (235  environment,236  variables237) {238  return {239    environment,240    variables241  }242}243function getLoadingRenderProps () {244  return {245    error: null,246    props: null, // `props: null` indicates that the data is being fetched (i.e. loading)247    retry: null248  }249}250function getEmptyRenderProps () {251  return {252    error: null,253    props: {}, // `props: {}` indicates no data available254    retry: null255  }256}257function getRenderProps (258  error,259  snapshot,260  queryFetcher,261  retryCallbacks262) {263  return {264    error: error || null,265    props: snapshot ? snapshot.data : null,266    retry: () => {267      const syncSnapshot = queryFetcher.retry()268      if (269        syncSnapshot &&270        typeof retryCallbacks.handleDataChange === 'function'271      ) {272        retryCallbacks.handleDataChange({ snapshot: syncSnapshot })273      } else if (274        error &&275        typeof retryCallbacks.handleRetryAfterError === 'function'276      ) {277        // If retrying after an error and no synchronous result available,278        // reset the render props279        retryCallbacks.handleRetryAfterError(error)280      }281    }282  }283}284function getRequestCacheKey (285  request,286  variables287) {288  const requestID = request.id || request.text289  return JSON.stringify({290    id: String(requestID),291    variables292  })293}294function fetchQueryAndComputeStateFromProps (295  props,296  queryFetcher,297  retryCallbacks,298  requestCacheKey299) {300  const { environment, query, variables } = props301  const genericEnvironment = (environment)302  if (query) {303    const request = getRequest(query)304    const operation = createOperationDescriptor(request, variables)305    const relayContext = getContext(genericEnvironment, operation.variables)306    if (typeof requestCacheKey === 'string' && requestCache[requestCacheKey]) {307      // This same request is already in flight.308      const { snapshot } = requestCache[requestCacheKey]309      if (snapshot) {310        // Use the cached response311        return {312          error: null,313          relayContext,314          renderProps: getRenderProps(315            null,316            snapshot,317            queryFetcher,318            retryCallbacks319          ),320          snapshot,321          requestCacheKey322        }323      } else {324        // Render loading state325        return {326          error: null,327          relayContext,328          renderProps: getLoadingRenderProps(),329          snapshot: null,330          requestCacheKey331        }332      }333    }334    try {335      const storeSnapshot =336        props.dataFrom === STORE_THEN_NETWORK337          ? queryFetcher.lookupInStore(genericEnvironment, operation)338          : null339      const querySnapshot = queryFetcher.fetch({340        cacheConfig: props.cacheConfig,341        dataFrom: props.dataFrom,342        environment: genericEnvironment,343        onDataChange: retryCallbacks.handleDataChange,344        operation345      })346      // Use network data first, since it may be fresher347      const snapshot = querySnapshot || storeSnapshot348      // cache the request to avoid duplicate requests349      requestCacheKey =350        requestCacheKey || getRequestCacheKey(request.params, props.variables)351      requestCache[requestCacheKey] = { queryFetcher, snapshot }352      if (!snapshot) {353        return {354          error: null,355          relayContext,356          renderProps: getLoadingRenderProps(),357          snapshot: null,358          requestCacheKey359        }360      }361      return {362        error: null,363        relayContext,364        renderProps: getRenderProps(365          null,366          snapshot,367          queryFetcher,368          retryCallbacks369        ),370        snapshot,371        requestCacheKey372      }373    } catch (error) {374      return {375        error,376        relayContext,377        renderProps: getRenderProps(error, null, queryFetcher, retryCallbacks),378        snapshot: null,379        requestCacheKey380      }381    }382  } else {383    queryFetcher.dispose()384    const relayContext = getContext(genericEnvironment, variables)385    return {386      error: null,387      relayContext,388      renderProps: getEmptyRenderProps(),389      requestCacheKey: null // if there is an error, don't cache request390    }391  }392}...lifecycle.js
Source:lifecycle.js  
...26  }27  const getDerivedStateFromProps = Constructor.getDerivedStateFromProps;28  // lifecycle getDervivedStateFromProps29  if (isFunction(getDerivedStateFromProps)) {30    applyDerivedStateFromProps(31      workInProgress, 32      Constructor, 33      getDerivedStateFromProps34    );35    instance.state = workInProgress.memoizedState;36  }37  if (38    !isFunction(Constructor.getDerivedStateFromProps)39  ) {40    callComponentWillMount(workInProgress, instance);41    queue = workInProgress.queue;42    if (queue !== null) {43      processUpdate(workInProgress, queue);44      instance.state = workInProgress.memoizedState;...useComponent.js
Source:useComponent.js  
...20  21        const oldState = workInProgress.memoizedState;22        let newState = instance.state = state;23  24        applyDerivedStateFromProps(workInProgress, Component, props);25        let shouldUpdate = checkShouldComponentUpdate(workInProgress, Component, oldProps, props, oldState, newState);26  27        if (shouldUpdate) {28          debugger;29          return instance.render();30        }31  32      } else {33        const instance = useMemo(() => new Component(props), []);34        const [state, setState] = useState(instance.state);35        workInProgress.stateNode = instance;36        workInProgress.memoizedState = {37          ...workInProgress.memoizedState,38          ...state,39        }40  41        instance.props = props;42        instance.state = state;43        instance.setState = setState;44    45        applyDerivedStateFromProps(workInProgress, Component, props);46        return instance.render();47      }48  49    }50    Wrapper.displayName = Component.name;51  52    return hoistNonReactStatics(Wrapper, Component);53  } else {54    throw new Error(`Must provide react class component`);55  }56}57function applyDerivedStateFromProps(workInProgress, Component, nextProps) {58  const getDerivedStateFromProps = Component.getDerivedStateFromProps;59  if (typeof getDerivedStateFromProps === 'function') {60    const instance = workInProgress.stateNode;61    const memoizedState = workInProgress.memoizedState;62    const nextState = getDerivedStateFromProps(nextProps, memoizedState);63    instance.state = workInProgress.memoizedState = nextState === null || nextState === undefined ? 64      memoizedState : 65      { ...memoizedState, partialState };66  }67}68function checkShouldComponentUpdate(workInProgress, Component, oldProps, newProps, oldState, newState) {69  const instance = workInProgress.stateNode;70  if (typeof instance.shouldComponentUpdate === 'function') {71    const shouldUpdate = instance.shouldComponentUpdate(newProps, newState);...buildVueRelayContainer.js
Source:buildVueRelayContainer.js  
1import Vue from 'vue'2import assertFragmentMap from './assertFragmentMap'3import {4  getComponentName5} from './VueRelayContainerUtils'6import mapObject from 'fbjs/lib/mapObject'7import { getFragment } from 'relay-runtime'8const VUE_RELAY_PROPS = 'vue-relay-props'9const buildVueRelayContainer = function (component, fragmentSpec, createContainerWithFragments) {10  // Sanity-check user-defined fragment input11  assertFragmentMap(getComponentName(component), fragmentSpec)12  const fragments = mapObject(fragmentSpec, getFragment)13  const props = Object.keys(fragments)14  return {15    extends: createContainerWithFragments(component, fragments),16    props,17    methods: {18      applyDerivedStateFromProps () {19        this.setState(this.getDerivedStateFromProps({20          ...this.$props,21          ...this.props22        }, this.state))23      },24      setState (partialState, callback) {25        if (typeof partialState === 'function') {26          partialState = partialState({ ...this.state })27        }28        if (partialState != null) {29          const prevState = this.state30          const nextState = {31            ...prevState,32            ...partialState33          }34          const prevProps = {35            ...this.$props,36            ...this.props37          }38          const forceUpdate = this.shouldComponentUpdate(prevProps, nextState)39          this.state = nextState40          if (typeof callback === 'function') {41            callback()42          }43          if (forceUpdate) {44            this.$nextTick(() => {45              this.componentDidUpdate(prevProps, prevState)46            })47            this.$forceUpdate()48          }49        }50      }51    },52    watch: {53      'props.__relayContext': 'applyDerivedStateFromProps',54      ...props.map(prop => ({ [prop]: 'applyDerivedStateFromProps' }))55    },56    render (h) {57      if (this.state.contextForChildren != null) {58        this[VUE_RELAY_PROPS].__relayContext = Object.freeze({59          ...this.state.contextForChildren60        })61      }62      if (component != null) {63        return h(component, {64          props: {65            ...this.$attrs,66            ...this.state.data,67            relay: this.state.relayProp68          }69        })70      }71      return h('keep-alive', {72        props: {73          include: []74        }75      }, this.$scopedSlots.default({76        ...this.state.data,77        relay: this.state.relayProp78      }))79    },80    inject: {81      'props': { from: VUE_RELAY_PROPS }82    },83    provide () {84      return this.state.contextForChildren != null85        ? {86          [VUE_RELAY_PROPS]: (this[VUE_RELAY_PROPS] = Vue.observable({87            __relayContext: Object.freeze({88              ...this.state.contextForChildren89            })90          }))91        }92        : {}93    }94  }95}96export default buildVueRelayContainer...Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const page = await browser.newPage();5  await page.waitForSelector('text=Get Started');6  const state = {7    button: {8      boundingBox: {9      },10    },11  };12  const action = {13  };14  await page.applyDerivedStateFromProps(state, action);15  await browser.close();16})();17module.exports = {18  use: {19  },20    {21      use: {22      },23    },24};Using AI Code Generation
1const { applyDerivedStateFromProps } = require('playwright-core/lib/server/dom.js');2const { applyDerivedStateFromProps } = require('playwright-core/lib/server/dom.js');3const { applyDerivedStateFromProps } = require('playwright-core/lib/server/dom.js');4const { applyDerivedStateFromProps } = require('playwright-core/lib/server/dom.js');5const { applyDerivedStateFromProps } = require('playwright-core/lib/server/dom.js');6const { applyDerivedStateFromProps } = require('playwright-core/lib/server/dom.js');7const { applyDerivedStateFromProps } = require('playwright-core/lib/server/dom.js');8const { applyDerivedStateFromProps } = require('playwright-core/lib/server/dom.js');9const { applyDerivedStateFromProps } = require('playwright-core/lib/server/dom.js');10const { applyDerivedStateFromProps } = require('playwright-core/lib/server/dom.js');11const { applyDerivedStateFromProps } = require('playwright-core/lib/server/dom.js');12const { applyDerivedStateFromProps } = require('playwright-core/lib/server/dom.js');13const { applyDerivedStateFromProps } = require('playwright-core/lib/server/dom.js');14const { applyDerivedStateFromProps } = require('playwright-core/lib/server/dom.js');15const { applyDerivedStateFromPropsUsing AI Code Generation
1const { PlaywrightInternal } = require('@playwright/test/lib/server/playwright');2const { Playwright } = require('@playwright/test/lib/server/playwright');3const { BrowserContext } = require('@playwright/test/lib/server/browserContext');4const { Browser } = require('@playwright/test/lib/server/browser');5const { BrowserType } = require('@playwright/test/lib/server/browserType');6const { Page } = require('@playwright/test/lib/server/page');7const { Worker } = require('@playwright/test/lib/server/worker');8const { assert } = require('chai');9const internal = new PlaywrightInternal();10const playwright = new Playwright(internal);11const browserType = new BrowserType(internal, 'chromium');12const browser = new Browser(internal, browserType, 'browserId');13const context = new BrowserContext(internal, browser, 'contextId');14const page = new Page(internal, context, 'pageId');15const worker = new Worker(internal, page, 'workerId');16const derivedState = {17};18PlaywrightInternal.applyDerivedStateFromProps(worker, derivedState);19assert.equal(worker._browserName, 'chromium');20assert.equal(worker._browserVersion, '1.2.3');21assert.equal(worker._isMobile, false);22assert.equal(worker._isAndroid, false);23assert.equal(worker._isChromium, true);24assert.equal(worker._isFirefox, false);25assert.equal(worker._isWebKit, false);26assert.equal(worker._platform, 'linux');27assert.equal(worker._platformName, 'linux');28assert.equal(worker._deviceScaleFactor, 1);29assert.equal(worker._isMobile, false);30assert.equal(worker._isLandscape, false);31assert.equal(worker._hasTouch, false);32console.log('Test Passed');Using AI Code Generation
1const { Playwright } = require('playwright');2const { Internal } = require('playwright/lib/server/playwright');3const { Page } = require('playwright/lib/server/page');4const { Frame } = require('playwright/lib/server/frames');5const playwright = new Playwright();6const internal = new Internal(playwright);7const page = new Page(internal);8const frame = new Frame(page, 'mainFrame', null);9frame.applyDerivedStateFromProps({Using AI Code Generation
1const { Playwright } = require('@playwright/test');2const { applyDerivedStateFromProps } = Playwright;3applyDerivedStateFromProps({});4const { Playwright } = require('@playwright/test');5const { applyDerivedStateFromProps } = Playwright;6applyDerivedStateFromProps({});7const { Playwright } = require('@playwright/test');8const { applyDerivedStateFromProps } = Playwright;9applyDerivedStateFromProps({});Using AI Code Generation
1const { PlaywrightInternal } = require('playwright');2const { applyDerivedStateFromProps } = PlaywrightInternal.prototype;3const { test } = require('playwright-test');4test('test', async ({ page }) => {5  const { PlaywrightInternal } = require('playwright');6  const { applyDerivedStateFromProps } = PlaywrightInternal.prototype;7  await page.waitForSelector('input[title="Search"]');8  await page.fill('input[title="Search"]', 'Hello World');9  await page.keyboard.press('Enter');10  const { PlaywrightInternal } = require('playwright');11  const { applyDerivedStateFromProps } = PlaywrightInternal.prototype;12  await page.waitForSelector('text=Hello World');13  await page.click('text=Hello World');14  await page.waitForSelector('text=Hello World - Google Search');15  await page.click('text=Hello World - Google Search');16  await page.waitForSelector('text=Hello World - Google Search');17  await page.click('text=Hello World - Google Search');18});19const { PlaywrightInternal } = require('playwright');20const { applyDerivedStateFromProps } = PlaywrightInternal.prototype;21const { test } = require('playwright-test');22test('test', async ({ page }) => {23  const { PlaywrightInternal } = require('playwright');24  const { applyDerivedStateFromProps } = PlaywrightInternal.prototype;25  await page.waitForSelector('input[title="Search"]');26  await page.fill('input[title="Search"]', 'Hello World');27  await page.keyboard.press('Enter');28  const { PlaywrightInternal } = require('playwright');29  const { applyDerivedStateFromProps } = PlaywrightInternal.prototype;30  await page.waitForSelector('text=Hello World');31  await page.click('text=Hello World');32  await page.waitForSelector('text=Hello WorldUsing AI Code Generation
1const { applyDerivedStateFromProps } = require('@playwright/test/lib/test');2const { test } = require('@playwright/test');3test.describe('Test', () => {4  test('test', async ({ page }) => {5    await applyDerivedStateFromProps(page, {6    });7  });8});Using AI Code Generation
1const { test, expect } = require('@playwright/test');2test('test', async ({ page }) => {3    const google = page.locator('div');4    const google1 = google.locator('div');5    const google2 = google1.locator('div');6    const google3 = google2.locator('div');7    const google4 = google3.locator('div');8    const google5 = google4.locator('div');9    const google6 = google5.locator('div');10    const google7 = google6.locator('div');11    const google8 = google7.locator('div');12    const google9 = google8.locator('div');13    const google10 = google9.locator('div');14    const google11 = google10.locator('div');15    const google12 = google11.locator('div');16    const google13 = google12.locator('div');17    const google14 = google13.locator('div');18    const google15 = google14.locator('div');19    const google16 = google15.locator('div');20    const google17 = google16.locator('div');21    const google18 = google17.locator('div');22    const google19 = google18.locator('div');23    const google20 = google19.locator('div');24    const google21 = google20.locator('div');25    const google22 = google21.locator('div');26    const google23 = google22.locator('div');27    const google24 = google23.locator('div');28    const google25 = google24.locator('div');29    const google26 = google25.locator('div');30    const google27 = google26.locator('div');31    const google28 = google27.locator('div');32    const google29 = google28.locator('div');33    const google30 = google29.locator('div');34    const google31 = google30.locator('div');35    const google32 = google31.locator('div');36    const google33 = google32.locator('div');37    const google34 = google33.locator('div');38    const google35 = google34.locator('div');39    const google36 = google35.locator('div');40    const google37 = google36.locator('div');41    const google38 = google37.locator('Using AI Code Generation
1const playwrightInternal = require('playwright/lib/server/playwright.js');2const { applyDerivedStateFromProps } = playwrightInternal.helper;3const { helper } = require('playwright/lib/server/helper.js');4const { Page } = require('playwright/lib/server/page.js');5const page = new Page();6const derivedState = {7  viewportSize: { width: 1000, height: 1000 },8};9applyDerivedStateFromProps(page, derivedState);LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!
