NEXT JS - 如何防止重新安装布局?

IT技术 reactjs next.js
2021-04-14 05:27:56

接下来尝试布局模式:

https://github.com/zeit/next.js/tree/canary/examples/layout-component

问题是布局组件在每次页面更改时都会重新安装。我需要使用布局组件作为容器,以便在每次安装时从服务器获取数据。如何防止重新安装布局?或者我在那里遗漏了什么?

3个回答

这有助于我实现持久布局。作者将一个函数放在一起,该函数将您的页面组件包装在您的 Layout 组件中,然后将该 fetch 函数传递给您的 _app.js。这样 _app.js 实际上是呈现布局的组件,但您可以指定哪些页面使用哪种布局(如果您有多个布局)。

因此,您可以灵活地在整个站点中使用多个布局,但那些共享相同布局的页面实际上将共享相同的布局组件,并且不必在导航上重新安装。

这是Next.js 中的 Persistent Layout Patterns完整文章的链接

以下是重要的代码片段。一个页面,然后是 _app.js

// /pages/account-settings/basic-information.js
import SiteLayout from '../../components/SiteLayout'
import AccountSettingsLayout from '../../components/AccountSettingsLayout'

const AccountSettingsBasicInformation = () => (
  <div>{/* ... */}</div>
)

AccountSettingsBasicInformation.getLayout = page => (
  <SiteLayout>
    <AccountSettingsLayout>{page}</AccountSettingsLayout>
  </SiteLayout>
)

export default AccountSettingsBasicInformation
// /pages/_app.js
import React from 'react'
import App from 'next/app'

class MyApp extends App {
  render() {
    const { Component, pageProps, router } = this.props

    const getLayout = Component.getLayout || (page => page)

    return getLayout(<Component {...pageProps}></Component>)
  }
}

export default MyApp
很好的答案,非常聪明!
2021-05-29 05:27:56

如果您将Layout组件放在页面组件内,它将在页面导航(页面切换)上重新安装。

您可以将您的页面组件与您的Layout组件包裹在里面_app.js,它应该可以防止它重新安装。

像这样的东西:

// _app.js
import Layout from '../components/Layout';

class MyApp extends App {
 static async getInitialProps(appContext) {
    const appProps = await App.getInitialProps(appContext);
    return {
      ...appProps,
    };
  }

  render() {
    const { Component, pageProps } = this.props;

    return (
      <Layout>
        <Component {...pageProps} />
      <Layout />
    );
  }
}

export default MyApp;
您可以在其中存储“全局”数据,并(通过上下文)公开页面组件的 api
2021-05-23 05:27:56
如果我需要在布局组件的 ComponentDidMount 上从服务器获取数据怎么办?像容器一样使用它。我的项目中还需要多个容器。Next 可以吗?
2021-06-05 05:27:56
有一种方法,通过使用将保持状态的“某物”(上下文),_app您的布局将使用此上下文 api 来获取(或使用缓存数据)
2021-06-07 05:27:56
如果它在页面内,并且您正在导航 -> 必须安装新页面,因此您的布局将被重新安装。
2021-06-11 05:27:56
那么布局重新渲染是必要的吗?对此无能为力?
2021-06-21 05:27:56

即使这是Layout一次又一次地挂载的主题,这个问题的根本原因是你在某个子组件中加载了一些数据,这些数据被一次又一次地获取。

经过一些鬼混,我发现这些问题实际上都不是 Next.Js 或 SWR 解决的问题。回到第一个问题,问题是如何将数据的单个副本简化到某个子组件。

语境

使用context作为一个例子。

配置文件

import { createContext } from 'react'
export default createContext({})

_App.js

import Config from '../Config'

export default function App({ Component, pageProps }) {
  return (
    <Config.Provider value={{ user: { name: 'John' }}}>
      <Component {...pageProps} />
    </Config.Provider>
  )
}

头像.js

import { useContext } from 'react'
import Config from '../Config'

function Avatar() {
  const { user } = useContext(Config)
  return (
    <span>
      {user.name}
    </span>
  )
}

export default Avatar

无论您如何装载和卸载,只要不重新渲染,最终都不会重新渲染_app

可写

上面的例子只是处理可读的。如果它是可写的,您可以尝试将状态传递到上下文中。setUser将照顾消费者中的集合。

  <Provider value={useState({})} />
  const [user, setUser] = useContext(Config)

setUser被“缓存”并且不会被更新。所以我们可以使用这个函数在子消费者中随时重置用户。


还有其他方法,例如。react后坐力。但或多或少,您正在处理一个状态管理系统,以将副本(值或功能)发送到其他地方,而无需触及其他节点。我会留下这个作为答案,因为即使我们解决了布局问题,这个问题也不会消失。而如果我们解决了这个问题,我们根本不需要处理 Layout。