Nuxt 3 动态设置文章详情页标题(推荐 useHead 方法)

发表于 2025-09-19 03:44:20 分类于 默认分类 阅读量 113

Nuxt 3 动态设置文章详情页标题(推荐 useHead 方法)

在开发博客或内容管理系统时,我们经常需要根据文章内容动态修改网页标题(<title>),以便:

  • 提升 SEO 友好性
  • 增强用户体验
  • 支持刷新页面时依然显示正确标题

在 Nuxt 3 中,直接修改 route.meta.title 会报错,因为 currentRoute.value.meta 是只读的。官方推荐使用 useHead 来动态管理页面 <head>


1️⃣ 问题示例

function applyArticleData(resp: Response<QueryArticleDetailRspVO>) {
  const data = resp.data
  article.title = data.title

  // ❌ 这样会报错
  const route = router.currentRoute.value
  route.meta.title = article.title
  document.title = article.title
}

报错原因:meta 在 Nuxt 3 中是只读的,不能直接赋值。


2️⃣ 推荐解决方案:useHead

安装和导入

Nuxt 3 内置 @vueuse/head,我们直接使用:

import { useHead } from '#app'

修改文章详情数据时动态设置标题

function applyArticleData(resp: Response<QueryArticleDetailRspVO>) {
  const data = resp.data
  article.title = data.title
  article.content = data.content
  article.updateTime = data.updateTime
  article.categoryId = data.categoryId
  article.categoryName = data.categoryName
  article.readNum = data.readNum
  article.tags = data.tags
  article.preArticle = data.preArticle
  article.nextArticle = data.nextArticle

  // ✅ 使用 useHead 动态修改网页标题
  useHead({
    title: article.title
  })
}

3️⃣ 优点

  • 支持 SSR:Nuxt 3 会在服务端渲染正确的标题
  • 刷新页面不丢失标题(结合 query 或状态管理可持久化)
  • 替代直接修改 route.meta,避免只读报错

4️⃣ 可选扩展

如果想在刷新后也保留标题,可结合:

  • URL query,例如 ?title=文章标题
  • Pinia / Vuex 状态管理
  • localStorage / sessionStorage

然后在组件 onMounted 或路由守卫中读取并用 useHead 设置。


5️⃣ 总结

在 Nuxt 3 中动态设置文章详情页标题的最佳实践:

  1. 不要直接修改 route.meta,它是只读的
  2. 使用 useHead({ title: ... }) 修改网页标题
  3. 配合 query / 状态管理实现刷新持久化

这样不仅安全、规范,还支持 SEO 和 SSR。