Coder Social home page Coder Social logo

Comments (5)

rickhanlonii avatar rickhanlonii commented on October 16, 2024 3

Overview

Thanks for reporting and the detailed sandbox. This is a bug fixed in React 19.

To show what's happening, I updated your sandbox with some profiling markers and delays: https://codesandbox.io/p/sandbox/react-dev-forked-rt7rdr?file=%2FLibraryReports.js%3A8%2C1

React 18 Timeline

Here's the timeline for 18:

Screenshot 2024-09-10 at 1 02 22 PM

Here you can see that the first update is scheduled (as a default priority), then the microtask is scheduled (for the await). The microtask is fired by the browser, which schedules the second update (which is sync priority).

In React 18, we did not batch default and sync lane updates together even though they are both sync updates. Since the sync priority update is given higher priority than the default priority, it is flushed and committed first (that's why you see a flash of this state). Then we render the default priority update. Since it was interrupted by the lower priority update, we rebase it on top of the sync update, and render the result of both state updates together (that's why you see both state updaters run in the last render).

So the final committed state is correct (as long as you're using a reducer / state updater), but there's a flash of incorrect state in between.

React 19 Timeline

Here's the timeline for 19:

Screenshot 2024-09-10 at 1 18 17 PM

Here you can see both updates are scheduled the same as before, but now there is a single render with both updates included. This avoids the flash of intermediate state.

Shout out @tyao1 and @acdlite for working on this with for 19: #25700

from react.

josephsavona avatar josephsavona commented on October 16, 2024 2

The changes to fix this are significant and not something we can backport. So unfortunately this fix will be 19 only.

from react.

Suman-D-R avatar Suman-D-R commented on October 16, 2024 1

To fix this issue, you can leverage the functional form of setState, which allows React to ensure that state updates are applied in order. Here’s how you can modify your code

useEffect(() => {
  (async () => {
    setStateA((prev) => "foo"); // Using the functional form of setState
    await someAsyncFunctionThatReturnsImmediately();
    setStateA((prev) => "bar"); // Using the functional form of setState
  })();
}, []);

from react.

Dakota-Smith-FL avatar Dakota-Smith-FL commented on October 16, 2024

Thank you very much for the detailed explanation of what's going on under the hood, and the confirmation that this is indeed fixed in React 19.

Do you happen to know if there will be a React 18 release that includes this fix?

from react.

Dakota-Smith-FL avatar Dakota-Smith-FL commented on October 16, 2024

No problem. Thanks for the info.

from react.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.