Giter VIP home page Giter VIP logo

Comments (9)

ctrlplusb avatar ctrlplusb commented on September 10, 2024

Hey @rubencodes this is certainly not expected behaviour.

Can you please share a bit more about your setup? i.e. version, SSR/browser etc. Also how you are creating the AsyncComponent. Thanks!

from react-async-component.

rubencodes avatar rubencodes commented on September 10, 2024

Sure! I'm on Beta 3, no SSR, using the latest Google Chrome. Also using [email protected], and [email protected] for routing. My code looks like:

const MessengerPage = (props) => {
	const AsyncMessenger = asyncComponent({
		resolve: () => import('./Messenger'),
		LoadingComponent: () => {
			console.log('loading');

			return (<div><Spinner /></div>);
		}
	});

	return (
		<AsyncMessenger { ...props } />
	);
};

What I'm seeing is whenever my route changes (which, fwiw, causes the props to my above MessengerPage component to change), my Messenger component is unmounted, the loading component function is hit, and then the Messenger component is re-mounted. These unmount/re-mounts do not happen if I do not use asyncComponent.

from react-async-component.

ctrlplusb avatar ctrlplusb commented on September 10, 2024

Hey @rubencodes!

Yeah, it's an anti-pattern to create your async components within another component as you have done. Basically some "global" state is created for each instance. Also, your wrapping component does nothing but create an async component, so there is no need for it.

Try the following instead:

const MessengerPage = asyncComponent({
  resolve: () => import('./Messenger'),
  LoadingComponent: () => {
    console.log('loading');

    return (<div><Spinner /></div>);
  }
});

<MessengerPage foo="bar" baz="bob" />

from react-async-component.

rubencodes avatar rubencodes commented on September 10, 2024

RE: the "Also", yeah the actual component is slightly more involved, I just tried to simplify it here to the simplest example that still gave me the issue. I will try creating it outside the component! Thanks 😃

from react-async-component.

ctrlplusb avatar ctrlplusb commented on September 10, 2024

I thought that might be the case. Okay, sure thing. If you can describe the nature of the configuration you are trying to achieve I am happy to advise. 😊

from react-async-component.

rubencodes avatar rubencodes commented on September 10, 2024

I think I got it figured out! I just moved the asyncComponent calls outside of my main component, and it looks like it's working perfectly now! Thanks so much!

from react-async-component.

geyang avatar geyang commented on September 10, 2024

I'm running into the same problem. On the client side, I thought if I use

// note: This prevents the "flash"  from happening.
asyncBootstrapper(app)
    .then(function () {
        ReactDOM.render(app, document.getElementById('root'));
    });

Then the rendering of the app should only happen after the app has been "walked" by the react-tree-walker. By then all of the bundles should already been loaded.

But this doesn't seems to be the case. The child link still flashes between the server-rendered page and the client-side code replacing it with the identical html node.

@rubencodes I'm using the asyncComponent to wrap the sub-pages (child routes). What do you mean exactly by "move [...] calls outside of my main component"?

Thanks in advance.

from react-async-component.

geyang avatar geyang commented on September 10, 2024

@rubencodes @ctrlplusb Hey guys do you guys have any intuition on the source of the flash? I am using the asyncBootstrapper call back already, which I thought should defer the ReactDOM rendering until the entire tree has been walked (and resolved).

from react-async-component.

geyang avatar geyang commented on September 10, 2024

but the flash seem still there. So I'm a bit baffled.

from react-async-component.

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.