Comments (7)
it is working
import React from "https://esm.sh/[email protected]";
import ReactDOM from "https://esm.sh/[email protected]";
import cx from "https://esm.sh/[email protected]";
function App({ initialMessage }) {
const [message, setMessage] = React.useState(initialMessage); // Set initial state to the provided message
React.useEffect(() => {
requestAnimationFrame(() => {
setMessage("Ready");
});
}, []);
return (
<p className={cx("app", message === "Ready" ? "ready" : "loading")}>
{message}
);
}
function RemountOnClick({ children }) {
const [count, setCount] = React.useState(0);
const handleClick = () => {
setCount((n) => n + 1);
};
return (
Remount
);
}
const root = ReactDOM.createRoot(document.getElementById("modern-root"));
root.render(
);
ReactDOM.render(
,
document.getElementById("legacy-root")
);
from react.
I have added txt file. please share wheather it is only problem or i misunderstood the problem.
from react.
Thanks, but I think this misses the point. This bug report is about React failing to batch a render caused by an immediate state change - your fix only removes the state change.
from react.
A workaround that does work is to wrap the state change with flushSync
, like:
React.useLayoutEffect(() => {
requestAnimationFrame(() => {
ReactDOM.flushSync(() => {
setMessage("Ready");
});
});
});
But this still seems like a regression to me.
from react.
I checked the code of ReactDOM.render() and ReactDOM.createRoot().render().
Seems like the legacy version always runs flushSync() (seems like modern version does not):
function legacyCreateRootFromDOMContainer(
container: Container,
initialChildren: ReactNodeList,
parentComponent: ?React$Component<any, any>,
callback: ?Function,
isHydrationContainer: boolean,
): FiberRoot {
if (isHydrationContainer) {
// ...
flushSync();
return root;
} else {
// First clear any existing content.
clearContainer(container);
// ...
// Initial mount should not be batched.
flushSync(() => {
updateContainer(initialChildren, root, parentComponent, callback);
});
return root;
}
}
React will execute flushSync() callback synchronously, applying any updates to the component tree immediately. This ensures that all state and props changes are reflected in the DOM before the method returns.
I guess that's why your workaround solves your issue.
from react.
But I will check a little bit more - it looks like sometimes it also appears instantly as "Ready" on average after ~20 re-renders (for me), seems like worth to investigate this part as well.
from react.
Bundled your example with Vite to check how it is represented there with and without your workaround of flushSync() and really see not much of difference (except the additional 7k lines of .js code ๐). From what I understand:
-
ReactDOM.render() is synchronous and does not support concurrent rendering, e.g. React attempts to render the entire component tree in a single go, which causes the "Loading..." message to briefly appear before the UI with the "Ready" message is rendered.
-
ReactDOM.createRoot().render() enables concurrent rendering, e.g. rendering is split into smaller chunks and updates that are more important for interactivity are prioritized, 2 e.g. React implies that "Loading" is unnecessary to show, because "Ready" is already ready for rendering. (This also explains the occasional "Ready" with ReactDOM.createRoot().render()).
from react.
Related Issues (20)
- [DevTools Bug]: TypeError: ie.handlePostCommitFiberRoot is not a function HOT 3
- Hey really.org
- Bug: Invalid options to hydrateRoot can error with "This root received an early update" HOT 1
- Bug: `Children.map` raises error when passed async server component within client component HOT 4
- Bug: mouse events are bubbled up too far with some pointer-events rules HOT 1
- Bug: Unsupported HTML character references HOT 6
- Bug: React not defined in TypeScript when importing from npm HOT 8
- After using forwardRef in a JSX component, you encounter an error when using it in a TSX component. HOT 1
- [DevTools Bug] Could not find node with id "464" in commit tree HOT 1
- โ Phishing Website Warning!!! There are phishing website links in the document. HOT 6
- not showing components in inspect its stuck
- [DevTools Bug]: I can't see the "Profiler" and "Components" in my dev tools HOT 1
- [DevTools Bug]: I can't see the "Profiler" and "Components" in my dev tools HOT 2
- Bug: Event handling with portals is broken
- Feature Request: useOnLoadEffect() -> empty dependency array useEffect wrapper
- Larger files upload rejection message instead of net::ERR_CONNECTION_RESET
- Bug: yo HOT 1
- Bug: refObj returned from useRef is not sealed
- Bug: Input of type number is incrementing/decrementing on mouse scroll
- Bug: render time differ depending on load
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google โค๏ธ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from react.