Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Experimental] Add useInsertionEffect #21913

Merged
merged 1 commit into from Sep 14, 2021

Conversation

@rickhanlonii
Copy link
Member

@rickhanlonii rickhanlonii commented Jul 19, 2021

Overview

Adds back the experimental useMutationEffect hook as useInsertionEffect, initially intended for stylesheet libraries.

Semantics

This hook is called right before mutations are made to the host, to allow inserting dependencies of the soon-to-be mutated host nodes. The canonical example use case is for inserting styles into the DOM so that they're available before reading layout information from DOM nodes that they apply to (like reading height in useLayoutEffect). Since this hook is limited in scope, this hook does not have access to refs and cannot schedule updates.

The lifecycle of this hook is a little different than other hooks. useInsertionEffect will interleave create and destroy while traversing the tree in the beforeMutation phase. This means that as we traverse the tree before mutations (e.g. the same time we call getSnapshotBeforeUpdate), and for each component we will destroy all of the insertion effects and then create all of the insertion effects for that component.

The resulting in ordering is something like:

Destroy Insertion 1 for Component A
Destroy Insertion 2 for Component A
Create Insertion 1 for Component A
Create Insertion 2 for Component A
Destroy Insertion 1 for Component B
Destroy Insertion 2 for Component B
Create Insertion 1 for Component B
Create Insertion 2 for Component B

Contrast this with layout effects, which do a two passes. One to destroy all of the layout effects in every component, and a second to create them:

Destroy Layout 1 for Component A
Destroy Layout 2 for Component A
Destroy Layout 1 for Component B
Destroy Layout 2 for Component B
Create Layout 1 for Component A
Create Layout 2 for Component A
Create Layout 1 for Component B
Create Layout 2 for Component B
@sizebot
Copy link

@sizebot sizebot commented Jul 19, 2021

Comparing: 81db4eb...ab6ad9f

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name +/- Base Current +/- gzip Base gzip Current gzip
oss-stable/react-dom/cjs/react-dom.production.min.js +0.15% 128.27 kB 128.46 kB +0.09% 40.93 kB 40.96 kB
oss-experimental/react-dom/cjs/react-dom.production.min.js +0.15% 131.09 kB 131.29 kB +0.11% 41.85 kB 41.90 kB
facebook-www/ReactDOM-prod.classic.js +0.13% 407.09 kB 407.60 kB +0.07% 75.40 kB 75.46 kB
facebook-www/ReactDOM-prod.modern.js +0.13% 395.65 kB 396.17 kB +0.07% 73.69 kB 73.75 kB
facebook-www/ReactDOMForked-prod.classic.js +0.13% 407.09 kB 407.60 kB +0.07% 75.40 kB 75.46 kB
oss-experimental/react-debug-tools/cjs/react-debug-tools.production.min.js +2.01% 6.76 kB 6.90 kB +0.66% 2.59 kB 2.61 kB
oss-stable-semver/react-debug-tools/cjs/react-debug-tools.production.min.js +2.01% 6.76 kB 6.90 kB +0.66% 2.59 kB 2.61 kB
oss-stable/react-debug-tools/cjs/react-debug-tools.production.min.js +2.01% 6.76 kB 6.90 kB +0.66% 2.59 kB 2.61 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name +/- Base Current +/- gzip Base gzip Current gzip
oss-experimental/react-debug-tools/cjs/react-debug-tools.production.min.js +2.01% 6.76 kB 6.90 kB +0.66% 2.59 kB 2.61 kB
oss-stable-semver/react-debug-tools/cjs/react-debug-tools.production.min.js +2.01% 6.76 kB 6.90 kB +0.66% 2.59 kB 2.61 kB
oss-stable/react-debug-tools/cjs/react-debug-tools.production.min.js +2.01% 6.76 kB 6.90 kB +0.66% 2.59 kB 2.61 kB
oss-experimental/react-suspense-test-utils/cjs/react-suspense-test-utils.js +1.42% 2.61 kB 2.65 kB +0.82% 1.10 kB 1.10 kB
oss-stable-semver/react-suspense-test-utils/cjs/react-suspense-test-utils.js +1.42% 2.61 kB 2.65 kB +0.82% 1.10 kB 1.10 kB
oss-stable/react-suspense-test-utils/cjs/react-suspense-test-utils.js +1.42% 2.61 kB 2.65 kB +0.82% 1.10 kB 1.10 kB
oss-experimental/react/cjs/react.production.min.js +1.19% 7.73 kB 7.83 kB +0.54% 2.97 kB 2.98 kB
oss-experimental/react-debug-tools/cjs/react-debug-tools.development.js +1.13% 23.16 kB 23.43 kB +0.47% 6.17 kB 6.20 kB
oss-stable-semver/react-debug-tools/cjs/react-debug-tools.development.js +1.13% 23.16 kB 23.43 kB +0.47% 6.17 kB 6.20 kB
oss-stable/react-debug-tools/cjs/react-debug-tools.development.js +1.13% 23.16 kB 23.43 kB +0.47% 6.17 kB 6.20 kB
facebook-react-native/react/cjs/React-prod.js +0.82% 17.04 kB 17.18 kB +0.28% 4.36 kB 4.37 kB
facebook-react-native/react/cjs/React-profiling.js +0.82% 17.04 kB 17.18 kB +0.28% 4.36 kB 4.37 kB
facebook-www/React-prod.modern.js +0.82% 17.17 kB 17.31 kB +0.25% 4.40 kB 4.41 kB
facebook-www/React-profiling.modern.js +0.82% 17.17 kB 17.31 kB +0.25% 4.40 kB 4.41 kB
facebook-www/React-prod.classic.js +0.81% 17.31 kB 17.45 kB +0.27% 4.44 kB 4.46 kB
facebook-www/React-profiling.classic.js +0.81% 17.31 kB 17.45 kB +0.27% 4.44 kB 4.46 kB
oss-experimental/react/umd/react.profiling.min.js +0.73% 11.73 kB 11.82 kB +0.13% 4.62 kB 4.63 kB
oss-experimental/react/umd/react.production.min.js +0.73% 11.73 kB 11.82 kB +0.13% 4.62 kB 4.63 kB
facebook-www/ReactDOMServer-dev.classic.js +0.36% 152.43 kB 152.97 kB +0.09% 38.80 kB 38.84 kB
facebook-react-native/react-test-renderer/cjs/ReactTestRenderer-dev.js +0.34% 614.81 kB 616.90 kB +0.14% 132.95 kB 133.14 kB
oss-stable-semver/react-test-renderer/umd/react-test-renderer.development.js +0.34% 633.66 kB 635.78 kB +0.12% 133.33 kB 133.49 kB
oss-stable/react-test-renderer/umd/react-test-renderer.development.js +0.34% 633.66 kB 635.78 kB +0.12% 133.33 kB 133.49 kB
facebook-www/ReactTestRenderer-dev.classic.js +0.33% 626.23 kB 628.32 kB +0.14% 134.16 kB 134.35 kB
facebook-www/ReactTestRenderer-dev.modern.js +0.33% 626.24 kB 628.34 kB +0.14% 134.17 kB 134.36 kB
oss-stable-semver/react-test-renderer/cjs/react-test-renderer.development.js +0.33% 604.16 kB 606.18 kB +0.13% 131.95 kB 132.13 kB
oss-stable/react-test-renderer/cjs/react-test-renderer.development.js +0.33% 604.16 kB 606.18 kB +0.13% 131.95 kB 132.13 kB
oss-experimental/react-test-renderer/umd/react-test-renderer.development.js +0.33% 650.35 kB 652.48 kB +0.11% 136.73 kB 136.88 kB
oss-experimental/react-test-renderer/cjs/react-test-renderer.development.js +0.33% 620.01 kB 622.02 kB +0.12% 135.31 kB 135.47 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-writer.browser.production.min.server.js +0.32% 6.63 kB 6.65 kB +0.25% 2.81 kB 2.82 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-writer.browser.production.min.server.js +0.32% 6.63 kB 6.65 kB +0.25% 2.81 kB 2.82 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-writer.browser.production.min.server.js +0.32% 6.63 kB 6.65 kB +0.25% 2.81 kB 2.82 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-writer.node.production.min.server.js +0.32% 6.64 kB 6.66 kB +0.29% 2.79 kB 2.79 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-writer.node.production.min.server.js +0.32% 6.64 kB 6.66 kB +0.29% 2.79 kB 2.79 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-writer.node.production.min.server.js +0.32% 6.64 kB 6.66 kB +0.29% 2.79 kB 2.79 kB
oss-stable-semver/react-reconciler/cjs/react-reconciler.development.js +0.31% 705.16 kB 707.34 kB +0.14% 149.86 kB 150.07 kB
oss-stable/react-reconciler/cjs/react-reconciler.development.js +0.31% 705.16 kB 707.34 kB +0.14% 149.86 kB 150.07 kB
oss-stable-semver/react-art/cjs/react-art.development.js +0.31% 654.00 kB 656.02 kB +0.13% 141.71 kB 141.89 kB
oss-stable/react-art/cjs/react-art.development.js +0.31% 654.00 kB 656.02 kB +0.13% 141.71 kB 141.89 kB
oss-experimental/react-server/cjs/react-server-flight.production.min.js +0.31% 6.81 kB 6.83 kB +0.31% 2.86 kB 2.87 kB
oss-stable-semver/react-server/cjs/react-server-flight.production.min.js +0.31% 6.81 kB 6.83 kB +0.31% 2.86 kB 2.87 kB
oss-stable/react-server/cjs/react-server-flight.production.min.js +0.31% 6.81 kB 6.83 kB +0.31% 2.86 kB 2.87 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-writer.browser.production.min.server.js +0.31% 6.84 kB 6.86 kB +0.28% 2.90 kB 2.91 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack-writer.browser.production.min.server.js +0.31% 6.84 kB 6.86 kB +0.28% 2.90 kB 2.91 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack-writer.browser.production.min.server.js +0.31% 6.84 kB 6.86 kB +0.28% 2.90 kB 2.91 kB
oss-experimental/react-reconciler/cjs/react-reconciler.development.js +0.30% 721.23 kB 723.41 kB +0.12% 153.30 kB 153.49 kB
oss-experimental/react-art/cjs/react-art.development.js +0.30% 669.88 kB 671.90 kB +0.12% 145.09 kB 145.26 kB
react-native/implementations/ReactFabric-dev.js +0.30% 705.56 kB 707.66 kB +0.13% 152.81 kB 153.00 kB
facebook-www/ReactART-dev.modern.js +0.30% 707.86 kB 709.95 kB +0.11% 151.10 kB 151.27 kB
facebook-www/ReactART-dev.classic.js +0.29% 718.14 kB 720.23 kB +0.11% 153.20 kB 153.38 kB
react-native/implementations/ReactNativeRenderer-dev.js +0.29% 722.70 kB 724.80 kB +0.12% 156.74 kB 156.93 kB
react-native/implementations/ReactFabric-dev.fb.js +0.29% 727.55 kB 729.65 kB +0.13% 157.16 kB 157.37 kB
react-native/implementations/ReactNativeRenderer-dev.fb.js +0.28% 742.68 kB 744.78 kB +0.12% 160.55 kB 160.73 kB
oss-stable-semver/react-art/umd/react-art.development.js +0.28% 757.41 kB 759.53 kB +0.10% 160.04 kB 160.21 kB
oss-stable/react-art/umd/react-art.development.js +0.28% 757.41 kB 759.53 kB +0.10% 160.04 kB 160.21 kB
oss-experimental/react-art/umd/react-art.development.js +0.27% 774.13 kB 776.25 kB +0.10% 163.47 kB 163.63 kB
facebook-www/ReactFlightDOMRelayServer-prod.classic.js +0.26% 15.51 kB 15.55 kB +0.23% 3.96 kB 3.97 kB
facebook-www/ReactFlightDOMRelayServer-prod.modern.js +0.26% 15.51 kB 15.55 kB +0.23% 3.96 kB 3.97 kB
facebook-relay/flight/ReactFlightNativeRelayServer-prod.js +0.26% 15.92 kB 15.96 kB +0.22% 4.05 kB 4.06 kB
oss-stable-semver/react-test-renderer/cjs/react-test-renderer.production.min.js +0.25% 78.23 kB 78.43 kB +0.21% 24.24 kB 24.29 kB
oss-stable/react-test-renderer/cjs/react-test-renderer.production.min.js +0.25% 78.23 kB 78.43 kB +0.21% 24.24 kB 24.29 kB
oss-stable-semver/react-test-renderer/umd/react-test-renderer.production.min.js +0.24% 78.45 kB 78.64 kB +0.22% 24.62 kB 24.67 kB
oss-stable/react-test-renderer/umd/react-test-renderer.production.min.js +0.24% 78.45 kB 78.64 kB +0.22% 24.62 kB 24.67 kB
oss-stable-semver/react-reconciler/cjs/react-reconciler.production.min.js +0.24% 90.45 kB 90.67 kB +0.21% 27.78 kB 27.84 kB
oss-stable/react-reconciler/cjs/react-reconciler.production.min.js +0.24% 90.45 kB 90.67 kB +0.21% 27.78 kB 27.84 kB
oss-experimental/react-test-renderer/cjs/react-test-renderer.production.min.js +0.24% 80.61 kB 80.81 kB +0.18% 25.01 kB 25.05 kB
oss-experimental/react-test-renderer/umd/react-test-renderer.production.min.js +0.24% 80.82 kB 81.01 kB +0.21% 25.39 kB 25.44 kB
oss-stable-semver/react-art/cjs/react-art.production.min.js +0.24% 81.37 kB 81.56 kB +0.16% 25.26 kB 25.30 kB
oss-stable/react-art/cjs/react-art.production.min.js +0.24% 81.37 kB 81.56 kB +0.16% 25.26 kB 25.30 kB
oss-experimental/react-reconciler/cjs/react-reconciler.production.min.js +0.24% 92.90 kB 93.12 kB +0.20% 28.55 kB 28.60 kB
oss-experimental/react/cjs/react.development.js +0.23% 85.12 kB 85.32 kB +0.13% 22.72 kB 22.75 kB
oss-experimental/react-art/cjs/react-art.production.min.js +0.23% 83.76 kB 83.95 kB +0.11% 26.04 kB 26.07 kB
facebook-react-native/react-test-renderer/cjs/ReactTestRenderer-prod.js +0.22% 234.60 kB 235.13 kB +0.15% 43.06 kB 43.12 kB
facebook-www/ReactDOMTesting-dev.modern.js +0.22% 946.24 kB 948.33 kB +0.09% 212.89 kB 213.09 kB
oss-stable-semver/react-reconciler/cjs/react-reconciler.profiling.min.js +0.22% 98.22 kB 98.44 kB +0.14% 30.11 kB 30.15 kB
oss-stable/react-reconciler/cjs/react-reconciler.profiling.min.js +0.22% 98.22 kB 98.44 kB +0.14% 30.11 kB 30.15 kB
oss-experimental/react-reconciler/cjs/react-reconciler.profiling.min.js +0.22% 100.69 kB 100.90 kB +0.16% 30.87 kB 30.92 kB
facebook-www/ReactDOMTesting-dev.classic.js +0.22% 973.31 kB 975.40 kB +0.09% 218.53 kB 218.73 kB
oss-stable-semver/react-dom/umd/react-dom.development.js +0.21% 1,020.73 kB 1,022.86 kB +0.07% 221.23 kB 221.39 kB
oss-stable/react-dom/umd/react-dom.development.js +0.21% 1,020.73 kB 1,022.86 kB +0.07% 221.23 kB 221.39 kB
oss-stable-semver/react-dom/cjs/react-dom.development.js +0.21% 971.53 kB 973.55 kB +0.09% 218.60 kB 218.78 kB
oss-stable/react-dom/cjs/react-dom.development.js +0.21% 971.53 kB 973.55 kB +0.09% 218.60 kB 218.78 kB
react-native/implementations/ReactFabric-prod.js +0.21% 270.91 kB 271.47 kB +0.13% 48.74 kB 48.80 kB
oss-experimental/react-dom/umd/react-dom.development.js +0.20% 1,039.54 kB 1,041.66 kB +0.07% 224.94 kB 225.10 kB
oss-experimental/react-dom/cjs/react-dom.development.js +0.20% 989.37 kB 991.39 kB +0.07% 222.35 kB 222.52 kB
facebook-www/ReactART-prod.modern.js +0.20% 256.30 kB 256.82 kB +0.14% 45.87 kB 45.94 kB
react-native/implementations/ReactFabric-prod.fb.js +0.20% 278.21 kB 278.77 kB +0.12% 50.06 kB 50.12 kB
facebook-www/ReactDOMForked-dev.modern.js +0.20% 1,044.17 kB 1,046.26 kB +0.08% 231.88 kB 232.06 kB
facebook-www/ReactDOM-dev.modern.js +0.20% 1,044.17 kB 1,046.26 kB +0.08% 231.88 kB 232.06 kB

Generated by 🚫 dangerJS against ab6ad9f

@rickhanlonii rickhanlonii force-pushed the rh-usemutationeffect branch from 2f933e4 to 60d379c Jul 19, 2021
@gaearon
Copy link
Member

@gaearon gaearon commented Jul 19, 2021

The old version used effect lists, so this version includes a naive, and probably buggy implementation using the new effect traversals.

I’d say effect lists were the usual cause of bugs so you have a higher chance of doing it right with the current approach!

@rickhanlonii rickhanlonii force-pushed the rh-usemutationeffect branch 9 times, most recently from a10210c to c6ceff6 Jul 20, 2021
Copy link
Member

@acdlite acdlite left a comment

Looks good overall! Let's discuss the timing of the destroy function before merging

@rickhanlonii rickhanlonii self-assigned this Aug 24, 2021
@windmaomao
Copy link

@windmaomao windmaomao commented Sep 3, 2021

@rickhanlonii just curious is the point of having this hook is to handle something even earlier than LayoutEffect? do you have a common use case to use it? Thank you.

@rickhanlonii rickhanlonii force-pushed the rh-usemutationeffect branch from c6ceff6 to 9d9a3a7 Sep 10, 2021
@rickhanlonii rickhanlonii changed the title [Experimental] Add back useMutationEffect [Experimental] Add useInsertionEffect Sep 10, 2021
@rickhanlonii
Copy link
Member Author

@rickhanlonii rickhanlonii commented Sep 10, 2021

@windmaomao I updated the description with the use case 👍

@rickhanlonii rickhanlonii force-pushed the rh-usemutationeffect branch 4 times, most recently from bac179d to 36cbc67 Sep 10, 2021
@rickhanlonii rickhanlonii force-pushed the rh-usemutationeffect branch from 36cbc67 to 79e2207 Sep 13, 2021
@rickhanlonii rickhanlonii force-pushed the rh-usemutationeffect branch from 79e2207 to 5704bb7 Sep 13, 2021
Copy link
Member

@acdlite acdlite left a comment

Looks good!

@@ -191,6 +192,18 @@ function useLayoutEffect(
});
}

function useInsertionEffect(
Copy link
Member

@gaearon gaearon Sep 13, 2021

Didn't we decide to drop the ion and just do useInsertEffect? timberlake.gif

There is a legit noun.

Copy link
Member Author

@rickhanlonii rickhanlonii Sep 13, 2021

Yes, and then no. useInsertEffect sounds too much like the thing you're inserting is an effect, which I think we noticed when we started talking about it again and thought of it as a verb first (which is probably the natural reading of it).

@rickhanlonii rickhanlonii force-pushed the rh-usemutationeffect branch from 5704bb7 to ab6ad9f Sep 13, 2021
function useInsertionEffect(
create: () => mixed,
inputs: Array<mixed> | void | null,
) {
if (__DEV__) {
currentHookNameInDev = 'useInsertionEffect';
console.error(
'useInsertionEffect does nothing on the server, because its effect cannot ' +
"be encoded into the server renderer's output format. This will lead " +
'to a mismatch between the initial, non-hydrated UI and the intended ' +
'UI. To avoid this, useInsertionEffect should only be used in ' +
'components that render exclusively on the client.',
);
}
}
Copy link
Contributor

@Andarist Andarist Sep 14, 2021

How are CSS-in-JS libraries supposed to handle SSR then? If the main use for this hook is stylesheet libraries then I think we need to document a compelling strategy for how those should be implemented "end to end".

In Emotion we currently conditionally render <style/> tags "inline" in the SSRed output and expect our hydration function to move them to <head/> (most commonly) before React "sees" them - it's tricky, but it sort of works (at least right now). Is this an acceptable approach?

Especially that last part of this error message seems to be off - given the primary use case for this hook. Style-based components cannot be exclusively rendered on the client because that would almost completely obliviate the sense of SSRing applications using those kinds of libraries.

Copy link
Member Author

@rickhanlonii rickhanlonii Sep 14, 2021

@Andarist short term they'll insert them into the stream separately, chunk points. @sebmarkbage is writing up a tutorial for how to do that as a working group post. Long term, we have an RFC we're going to publish for how we intend to handle this in an integrated way that works isomorphically.

Copy link
Contributor

@Andarist Andarist Sep 14, 2021

Interesting, thanks for the comment and I can't wait to read how this will work 👍

However, that probably means that the last paragraph of my comment is still valid - the error message here seems to be somewhat inaccurate and could throw somebody off. Unless you expect library maintainers to ignore that and "know better". 🤔

Copy link
Member

@sebmarkbage sebmarkbage Sep 14, 2021

It's probably wrong in the same sense as the useLayoutEffect warning being wrong since it can also be done differently on the server to inject through different means and needs to be done conditionally to workaround these issues.

@windmaomao
Copy link

@windmaomao windmaomao commented Sep 14, 2021

@windmaomao I updated the description with the use case 👍

Thanks @rickhanlonii, now i understand the usage. Basically similar to a layoutEffect, but applied right before the mutation finishes. so the order is more like insertEffect -> mutationEffect -> layoutEffect -> ... -> passiveEffect.

@rickhanlonii rickhanlonii merged commit 263cfa6 into facebook:main Sep 14, 2021
34 checks passed
@rickhanlonii rickhanlonii deleted the rh-usemutationeffect branch Sep 14, 2021
facebook-github-bot added a commit to facebook/react-native that referenced this issue Sep 22, 2021
Summary:
This sync includes the following changes:
- **[f4ac680c7](facebook/react@f4ac680 )**: Fixed broken build script --unsafe-partial flag ([#22324](facebook/react#22324)) //<Brian Vaughn>//
- **[67222f044](facebook/react@67222f0 )**: [Experiment] Warn if callback ref returns a function ([#22313](facebook/react#22313)) //<Dan Abramov>//
- **[263cfa6ec](facebook/react@263cfa6 )**: [Experimental] Add useInsertionEffect ([#21913](facebook/react#21913)) //<Ricky>//
- **[806aaa2e2](facebook/react@806aaa2 )**: [useSES shim] Import prefixed native API ([#22310](facebook/react#22310)) //<Andrew Clark>//
- **[fd5e01c2e](facebook/react@fd5e01c )**: [useSES/extra] Reuse old selection if possible ([#22307](facebook/react#22307)) //<Andrew Clark>//
- **[33226fada](facebook/react@33226fa )**: Check for store mutations before commit ([#22290](facebook/react#22290)) //<Andrew Clark>//
- **[86c7ca70a](facebook/react@86c7ca7 )**: Fix link ([#22296](facebook/react#22296)) //<Konstantin Popov>//
- **[0fd195f29](facebook/react@0fd195f )**: update error message to include useLayoutEffect or useEffect on bad e… ([#22279](facebook/react#22279)) //<salazarm>//
- **[8f96c6b2a](facebook/react@8f96c6b )**: [Bugfix] Prevent infinite update loop caused by a synchronous update in a passive effect ([#22277](facebook/react#22277)) //<Andrew Clark>//
- **[4ce89a58d](facebook/react@4ce89a5 )**: Test bad useEffect return value with noop-renderer ([#22258](facebook/react#22258)) //<Sebastian Silbermann>//
- **[a3fde2358](facebook/react@a3fde23 )**: Detect subscriptions wrapped in startTransition ([#22271](facebook/react#22271)) //<salazarm>//

Changelog:
[General][Changed] - React Native sync for revisions 95d762e...e8feb11

jest_e2e[run_all_tests]

Reviewed By: rickhanlonii

Differential Revision: D30966369

fbshipit-source-id: 6c88e591005deb1fd93493628ef4695add49186c
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked issues

Successfully merging this pull request may close these issues.

None yet

10 participants