【问题标题】:nextjs: shared components between pagesnextjs:页面间共享组件
【发布时间】:2018-04-05 17:12:12
【问题描述】:

我创建了一个非常简单的Next.js-项目,有两个页面。

两个页面都包含一个基本的布局组件:

// Page Component  

render() {
  return (
    <PageLayout>
      This is page A
    </PageLayout>
  );
}

PageLayout 看起来像这样:

// PageLayout

render() {
  return (
    <div>
      <Header />
      {this.props.children}
    </div>
  );
}

所以两个页面都使用PageLayout 来呈现一个基本模板,该模板在两个页面上也包含相同的Header

我的问题Header 组件在两个页面之间导航时重新创建。我认为这不仅从性能的角度来看很糟糕,而且因为在这种情况下,所有 DOM 节点和所有 React 组件都失去了它们的本地状态。

所以我想知道我是否缺少某些东西,或者我们如何在正确重用的页面之间创建共享组件(当然,至少在它们的状态没有改变的情况下)。

【问题讨论】:

  • 我很确定你不能(根据我对 nextjs 的经验)。如果您不想丢失 Header 中的状态,那么您需要存储它,例如在 redux 中。

标签: javascript reactjs nextjs


【解决方案1】:

你必须创建一个名为 layout 的组件

// components/layout.js

import Navbar from './navbar'
import Footer from './footer'

export default function Layout({ children }) {
  return (
    <>
      <Navbar />
      <main>{children}</main>
      <Footer />
    </>
  )
}

然后像这样敲击你的 _app.js 组件

// pages/_app.js

import Layout from '../components/layout'

export default function MyApp({ Component, pageProps }) {
  return (
    <Layout>
      <Component {...pageProps} />
    </Layout>
  )
}

更多信息请阅读https://nextjs.org/docs/basic-features/layouts

【讨论】:

    【解决方案2】:

    您有两个具有共同组件的页面:

    页面A

    <A>
      <Common />
    </A>
    

    页面B:

    <B>
      <Common />
    </B>
    

    From the React documentation:

    只要根元素有不同的类型,React 就会拆掉 老树并从头开始构建新树。从&lt;a&gt;&lt;img&gt;,或从 &lt;Article&gt;&lt;Comment&gt;,或从 &lt;Button&gt;&lt;div&gt; - 任意 其中将导致全面重建。

    这就是为什么您会丢失 Common (Header) 组件中的状态。就像我在评论中建议的那样,您必须使用像 redux 这样的外部状态。

    【讨论】:

    • 感谢您的回答。但是,我的问题不仅与本地状态有关,还与 DOM 本身有关。例如,我的导航(在标题内)有一个 CSS 悬停过渡,在页面之间导航时总是重置。现在我只是想知道在我创建自己的设置时是否可以解决这个问题。
    • 因为nextjs是服务端渲染的,每次都会得到一个完整的页面加载,所以不能这样做。使用带有客户端路由的普通应用程序(即 create-react-app),您可以让路由器在布局内工作,以便始终存在相同的标题。
    猜你喜欢
    • 2021-09-26
    • 2020-08-14
    • 2020-07-06
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 2016-07-10
    相关资源
    最近更新 更多