diff --git a/src/components/page-react-timings/App.tsx b/src/components/page-react-timings/App.tsx
index 717710f..9ab9975 100644
--- a/src/components/page-react-timings/App.tsx
+++ b/src/components/page-react-timings/App.tsx
@@ -4,6 +4,7 @@ import { LifeCycleTimings } from "./LifeCycleTimings";
import { Render } from "./Render";
import { Event } from "./Event";
import { Rerender } from "./Rerender";
+import { Context } from "./Context";
export function App() {
return (
@@ -19,6 +20,9 @@ export function App() {
Test re-renders
+
+ Context re-rendering
+
>
);
}
diff --git a/src/components/page-react-timings/Context.tsx b/src/components/page-react-timings/Context.tsx
new file mode 100644
index 0000000..c9920ca
--- /dev/null
+++ b/src/components/page-react-timings/Context.tsx
@@ -0,0 +1,65 @@
+import * as React from "react";
+import { log } from "./tasks";
+import { DisplayHideButton } from "./DisplayHideButton";
+
+const C = React.createContext(0);
+
+export function Context() {
+ return (
+
+
+
+
+
+
+
+ );
+}
+
+function Provider({ children }: { children?: React.ReactNode }) {
+ const [state, setState] = React.useState(0);
+ const [, setOtherState] = React.useState({});
+ log("render Provider", { tasks: true });
+ return (
+
+ Provider
+
+
+
+
+
{children}
+
+ );
+}
+
+const PassThrough = React.memo(
+ ({ children }: { children?: React.ReactNode }) => {
+ log("render PassThrough");
+ return (
+
+
PassThrough
+ {children}
+
+ );
+ }
+);
+
+const Child = React.memo(() => {
+ log("render Child");
+ const value = React.useContext(C);
+ return (
+ Child {value}
+ );
+});
diff --git a/src/components/page-react-timings/DisplayHideButton.tsx b/src/components/page-react-timings/DisplayHideButton.tsx
new file mode 100644
index 0000000..238790b
--- /dev/null
+++ b/src/components/page-react-timings/DisplayHideButton.tsx
@@ -0,0 +1,25 @@
+import React from "react";
+
+export function DisplayHideButton({
+ label,
+ children,
+ style,
+}: {
+ label: string;
+ children?: React.ReactNode;
+ style?: React.CSSProperties;
+}) {
+ const [isDisplayed, setIsDisplayed] = React.useState(false);
+
+ return (
+ <>
+
+ {isDisplayed && children}
+ >
+ );
+}
diff --git a/src/components/page-react-timings/Rerender.tsx b/src/components/page-react-timings/Rerender.tsx
index 1490d12..b95aefe 100644
--- a/src/components/page-react-timings/Rerender.tsx
+++ b/src/components/page-react-timings/Rerender.tsx
@@ -1,6 +1,7 @@
import * as React from "react";
import { animationFrame, log, microTask, task } from "./tasks";
import { flushSync } from "react-dom";
+import { DisplayHideButton } from "./DisplayHideButton";
let includeFlushSync = false;
@@ -28,30 +29,6 @@ export function Rerender() {
);
}
-function DisplayHideButton({
- label,
- children,
- style,
-}: {
- label: string;
- children?: React.ReactNode;
- style?: React.CSSProperties;
-}) {
- const [isDisplayed, setIsDisplayed] = React.useState(false);
-
- return (
- <>
-
- {isDisplayed && children}
- >
- );
-}
-
function RerenderInUseEffect() {
const [, forceUpdate] = React.useState({});