You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js中无需每个页面引入Layout,如何传递webName与pageTitle props?

实现不同页面传递自定义webName和pageTitle到全局Layout的方案

你可以通过两种方式实现,无需在每个页面单独引入Layout组件,直接在全局的_app.js里统一处理:

方法一:利用页面组件的静态属性

这种方式适合不需要异步获取数据的静态页面,直接在页面组件上定义静态元数据即可。

步骤1:修改_app.js,读取页面静态属性

import Layout from '@/layout/Layout'
import '@/styles/globals.css'

export default function App({ Component, pageProps }) {
  // 读取页面定义的元数据,没有则用默认值兜底
  const { 
    webName = 'Feet Of Colors Foundation', 
    pageTitle = '默认页面' 
  } = Component.pageMeta || {}

  return (
    <Layout webName={webName} pageTitle={pageTitle}>
      <Component {...pageProps} />
    </Layout>
  )
}

步骤2:在各页面组件上添加静态元数据

比如首页pages/index.js:

export default function Home() {
  return <main>首页内容区域</main>
}

// 定义当前页面的元数据
Home.pageMeta = {
  webName: 'Feet Of Colors Foundation',
  pageTitle: '首页'
}

比如关于页pages/about.js:

export default function About() {
  return <main>关于我们页面内容</main>
}

About.pageMeta = {
  webName: 'Feet Of Colors Foundation',
  pageTitle: '关于我们'
}

方法二:通过数据获取函数传递元数据

如果页面需要从接口或数据库动态获取webName/pageTitle,可以用getStaticProps(静态生成)或getServerSideProps(服务端渲染)把元数据放进props里,再在_app.js中读取。

步骤1:修改_app.js,读取pageProps中的元数据

import Layout from '@/layout/Layout'
import '@/styles/globals.css'

export default function App({ Component, pageProps }) {
  // 从pageProps中取元数据,无则用默认值
  const { 
    webName = 'Feet Of Colors Foundation', 
    pageTitle = '默认页面' 
  } = pageProps.pageMeta || {}

  return (
    <Layout webName={webName} pageTitle={pageTitle}>
      <Component {...pageProps} />
    </Layout>
  )
}

步骤2:在页面的数据获取函数中返回元数据

比如动态页面pages/blog/[id].js:

export async function getStaticProps(context) {
  // 模拟从接口获取文章信息和页面元数据
  const res = await fetch(`https://api.example.com/blog/${context.params.id}`)
  const post = await res.json()

  return {
    props: {
      post,
      pageMeta: {
        webName: 'Feet Of Colors Foundation',
        pageTitle: post.title // 用文章标题作为页面标题
      }
    }
  }
}

export default function BlogPost({ post }) {
  return <main>{post.content}</main>
}

最后:更新Layout组件的动态标题

把Layout里硬编码的标题改成动态拼接的,确保页面标题随pageTitle变化:

import Head from 'next/head' // 记得导入Head组件

const Layout = ({ children, webName, pageTitle }) => {
  return (
    <div>
      <Head>
        <meta charSet='utf-8' />
        <meta
          name='viewport'
          content='width=device-width, initial-scale=1, shrink-to-fit=no'
        />
        <meta name='description' content='' />
        <meta name='author' content='Chris Achinga -> chrisdevcode.xyz' />
        {/* 动态生成页面标题 */}
        <title>{`${pageTitle} | ${webName}`}</title>
      </Head>
      <PageHeader webName={webName} pageTitle={pageTitle} />
      <NavBar webName={webName} />
      <main>{children}</main>
      <Footer />
    </div>
  )
}

export default Layout

内容的提问来源于stack exchange,提问作者Achinga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 03:07:55