使用布局模式尝试下一步:
https://github.com/zeit/next.js/tree/canary/examples/layout-component
问题是布局组件在每次页面更改时都会被重新挂载。我需要使用布局组件作为容器,这样它就可以在每次挂载上从服务器上获取数据。如何防止布局得到重新安装?还是我漏掉了什么?
发布于 2019-12-29 09:34:00
如果您将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;
发布于 2020-04-24 05:31:00
这有助于我进行持久的布局。作者将一个函数组合在一起,将页面组件封装在布局组件中,然后将该获取函数传递给_app.js。这样,_app.js实际上就是呈现布局的组件,但是您可以指定哪些页面使用哪个布局(以防有多个布局)。
因此,您可以灵活地在整个站点中进行多个布局,但是那些共享相同布局的页面实际上将共享相同的布局组件,并且不需要在导航上重新挂载。
以下是Next.js中的持久布局模式全文的链接
以下是重要的代码片段。一个页面,然后是_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-20 06:37:22
尽管这是一次又一次地挂载Layout
的主题,但造成这个问题的根本原因是您在某个子组件中加载了一些数据,这些子组件一次又一次地被获取。
经过一番周旋之后,我发现这些问题都不是Next.Js或SWR解决的问题。问题,回到原点,是如何精简单个数据副本到某个子组件。
上下文
以context
为例。
Config.js
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>
)
}
Avatar.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
是“缓存”的,不会被更新。因此,我们可以使用这个功能来重置用户在任何时候的儿童消费者。
还有其他的方法,前。反应后坐力。但是,您或多或少是在处理状态管理系统,以便在不接触其他节点的情况下将副本(值或函数)发送到其他地方。我会把这个作为一个答案,因为即使我们解决了布局问题,这个问题也不会消失。如果我们解决了这个问题,我们根本不需要处理布局问题。
https://stackoverflow.com/questions/59519286
复制