Skip to content

Commit 2d118b2

Browse files
potetorickhanlonii
andcommitted
experimental_useEvent (#25229)
This commit adds a new hook `useEvent` per the RFC [here](reactjs/rfcs#220), gated as experimental. Co-authored-by: Rick Hanlon <[email protected]> Co-authored-by: Rick Hanlon <[email protected]> Co-authored-by: Lauren Tan <[email protected]>
1 parent cb274d1 commit 2d118b2

26 files changed

+1027
-38
lines changed

packages/react-reconciler/src/ReactFiberCommitWork.new.js

+34-16
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ import {
4848
enableUpdaterTracking,
4949
enableCache,
5050
enableTransitionTracing,
51+
enableUseEventHook,
5152
} from 'shared/ReactFeatureFlags';
5253
import {
5354
FunctionComponent,
@@ -162,6 +163,7 @@ import {
162163
Layout as HookLayout,
163164
Insertion as HookInsertion,
164165
Passive as HookPassive,
166+
Snapshot as HookSnapshot,
165167
} from './ReactHookEffectTags';
166168
import {didWarnAboutReassigningProps} from './ReactFiberBeginWork.new';
167169
import {doesFiberContain} from './ReactFiberTreeReflection';
@@ -407,14 +409,24 @@ function commitBeforeMutationEffectsOnFiber(finishedWork: Fiber) {
407409

408410
if ((flags & Snapshot) !== NoFlags) {
409411
setCurrentDebugFiberInDEV(finishedWork);
412+
}
410413

411-
switch (finishedWork.tag) {
412-
case FunctionComponent:
413-
case ForwardRef:
414-
case SimpleMemoComponent: {
415-
break;
414+
switch (finishedWork.tag) {
415+
case FunctionComponent: {
416+
if (enableUseEventHook) {
417+
if ((flags & Update) !== NoFlags) {
418+
// useEvent doesn't need to be cleaned up
419+
commitHookEffectListMount(HookSnapshot | HookHasEffect, finishedWork);
420+
}
416421
}
417-
case ClassComponent: {
422+
break;
423+
}
424+
case ForwardRef:
425+
case SimpleMemoComponent: {
426+
break;
427+
}
428+
case ClassComponent: {
429+
if ((flags & Snapshot) !== NoFlags) {
418430
if (current !== null) {
419431
const prevProps = current.memoizedProps;
420432
const prevState = current.memoizedState;
@@ -468,29 +480,35 @@ function commitBeforeMutationEffectsOnFiber(finishedWork: Fiber) {
468480
}
469481
instance.__reactInternalSnapshotBeforeUpdate = snapshot;
470482
}
471-
break;
472483
}
473-
case HostRoot: {
484+
break;
485+
}
486+
case HostRoot: {
487+
if ((flags & Snapshot) !== NoFlags) {
474488
if (supportsMutation) {
475489
const root = finishedWork.stateNode;
476490
clearContainer(root.containerInfo);
477491
}
478-
break;
479492
}
480-
case HostComponent:
481-
case HostText:
482-
case HostPortal:
483-
case IncompleteClassComponent:
484-
// Nothing to do for these component types
485-
break;
486-
default: {
493+
break;
494+
}
495+
case HostComponent:
496+
case HostText:
497+
case HostPortal:
498+
case IncompleteClassComponent:
499+
// Nothing to do for these component types
500+
break;
501+
default: {
502+
if ((flags & Snapshot) !== NoFlags) {
487503
throw new Error(
488504
'This unit of work tag should not have side-effects. This error is ' +
489505
'likely caused by a bug in React. Please file an issue.',
490506
);
491507
}
492508
}
509+
}
493510

511+
if ((flags & Snapshot) !== NoFlags) {
494512
resetCurrentDebugFiberInDEV();
495513
}
496514
}

packages/react-reconciler/src/ReactFiberCommitWork.old.js

+34-16
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ import {
4848
enableUpdaterTracking,
4949
enableCache,
5050
enableTransitionTracing,
51+
enableUseEventHook,
5152
} from 'shared/ReactFeatureFlags';
5253
import {
5354
FunctionComponent,
@@ -162,6 +163,7 @@ import {
162163
Layout as HookLayout,
163164
Insertion as HookInsertion,
164165
Passive as HookPassive,
166+
Snapshot as HookSnapshot,
165167
} from './ReactHookEffectTags';
166168
import {didWarnAboutReassigningProps} from './ReactFiberBeginWork.old';
167169
import {doesFiberContain} from './ReactFiberTreeReflection';
@@ -407,14 +409,24 @@ function commitBeforeMutationEffectsOnFiber(finishedWork: Fiber) {
407409

408410
if ((flags & Snapshot) !== NoFlags) {
409411
setCurrentDebugFiberInDEV(finishedWork);
412+
}
410413

411-
switch (finishedWork.tag) {
412-
case FunctionComponent:
413-
case ForwardRef:
414-
case SimpleMemoComponent: {
415-
break;
414+
switch (finishedWork.tag) {
415+
case FunctionComponent: {
416+
if (enableUseEventHook) {
417+
if ((flags & Update) !== NoFlags) {
418+
// useEvent doesn't need to be cleaned up
419+
commitHookEffectListMount(HookSnapshot | HookHasEffect, finishedWork);
420+
}
416421
}
417-
case ClassComponent: {
422+
break;
423+
}
424+
case ForwardRef:
425+
case SimpleMemoComponent: {
426+
break;
427+
}
428+
case ClassComponent: {
429+
if ((flags & Snapshot) !== NoFlags) {
418430
if (current !== null) {
419431
const prevProps = current.memoizedProps;
420432
const prevState = current.memoizedState;
@@ -468,29 +480,35 @@ function commitBeforeMutationEffectsOnFiber(finishedWork: Fiber) {
468480
}
469481
instance.__reactInternalSnapshotBeforeUpdate = snapshot;
470482
}
471-
break;
472483
}
473-
case HostRoot: {
484+
break;
485+
}
486+
case HostRoot: {
487+
if ((flags & Snapshot) !== NoFlags) {
474488
if (supportsMutation) {
475489
const root = finishedWork.stateNode;
476490
clearContainer(root.containerInfo);
477491
}
478-
break;
479492
}
480-
case HostComponent:
481-
case HostText:
482-
case HostPortal:
483-
case IncompleteClassComponent:
484-
// Nothing to do for these component types
485-
break;
486-
default: {
493+
break;
494+
}
495+
case HostComponent:
496+
case HostText:
497+
case HostPortal:
498+
case IncompleteClassComponent:
499+
// Nothing to do for these component types
500+
break;
501+
default: {
502+
if ((flags & Snapshot) !== NoFlags) {
487503
throw new Error(
488504
'This unit of work tag should not have side-effects. This error is ' +
489505
'likely caused by a bug in React. Please file an issue.',
490506
);
491507
}
492508
}
509+
}
493510

511+
if ((flags & Snapshot) !== NoFlags) {
494512
resetCurrentDebugFiberInDEV();
495513
}
496514
}

0 commit comments

Comments
 (0)