首页 > 其他 > 详细

[React] Preload React Components with the useEffect Hook

时间:2020-04-30 09:21:11      阅读:57      评论:0      收藏:0      [点我收藏+]

Let‘s say we are using ‘React.lazy()‘ to lazy load some Router:

const Home = React.lazy(() => import(‘./screens/home‘))
const User = React.lazy(() => import(‘./screens/user‘))

function ErrorFallback({error}) {
  return (
    <IsolatedContainer>
      <p>There was an error</p>
      <pre style={{maxWidth: 700}}>{JSON.stringify(error, null, 2)}</pre>
    </IsolatedContainer>
  )
}

function App() {
  return (
    <ThemeProvider>
      <GitHubContext.Provider>
        <ErrorBoundary FallbackComponent={ErrorFallback}>
          <Suspense
            fallback={
              <LoadingMessagePage>Loading Application</LoadingMessagePage>
            }
          >
            <Router>
              <Home path="/" />
              <User path="/:username" />
            </Router>
          </Suspense>
        </ErrorBoundary>
      </GitHubContext.Provider>
    </ThemeProvider>
  )
}

const ui = <App />
const container = document.getElementById(root)

ReactDOM.render(ui, container)

 

One problem for lazy loading router is that for slow connect user, it takes take to switch page. What we can do to solve the problem is by preload the lazy loaded router.

 

Let‘s say once user arrived on ‘Home‘ Page, we assume he will continue to ‘User‘ page. So we will preload ‘User‘ page inside Home page.

function Home() {
  useEffect(() => {
    // preload the next page
    import(‘../user‘)
  }, [])
  return (
    <IsolatedContainer>
      <form
        onSubmit={handleSubmit}
        css={{
          display: flex,
          justifyContent: center,
          maxWidth: 240,
          margin: auto,
        }}
      >
        <Input
          type="text"
          name="username"
          placeholder="Enter a GitHub username"
          autoFocus
          css={{
            borderRight: none,
            borderTopRightRadius: 0,
            borderBottomRightRadius: 0,
            minWidth: 190,
          }}
        />
        <PrimaryButton
          css={{
            borderTopLeftRadius: 0,
            borderBottomLeftRadius: 0,
          }}
          type="submit"
        >
          Go
        </PrimaryButton>
      </form>
    </IsolatedContainer>
  )
}

 

[React] Preload React Components with the useEffect Hook

原文:https://www.cnblogs.com/Answer1215/p/12806118.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!