你如何在 React 中设置文档标题?

IT技术 javascript reactjs dom
2021-02-28 00:58:20

我想为我的 React 应用程序设置文档标题(在浏览器标题栏中)。我已经尝试使用react文档标题(似乎过时了),并设置document.titleconstructorcomponentDidMount()这些解决方案的工作- 。

6个回答
import React from 'react'
import ReactDOM from 'react-dom'


class Doc extends React.Component{
  componentDidMount(){
    document.title = "dfsdfsdfsd"
  }

  render(){
    return(
      <b> test </b>
    )
  }
}

ReactDOM.render(
  <Doc />,
  document.getElementById('container')
);

这对我有用。

编辑:如果您使用 webpack-dev-server 设置 inline 为 true

@AlexVestin 如果您的 React 应用程序中的不同视图需要不同的标题,这不是一个好主意
2021-04-25 00:58:20
最好像@quotesBro 的回答那样以声明方式进行
2021-05-02 00:58:20
这有效,但在页面加载时文档标题仍然是“React App” - 知道如何解决这个问题吗?
2021-05-06 00:58:20
更改 index.html 中标题标签的内容
2021-05-16 00:58:20
这种方式适合 SEO 吗?
2021-05-17 00:58:20

你可以使用React Helmet

import React from 'react'
import { Helmet } from 'react-helmet'

const TITLE = 'My Page Title'

class MyComponent extends React.PureComponent {
  render () {
    return (
      <>
        <Helmet>
          <title>{ TITLE }</title>
        </Helmet>
        ...
      </>
    )
  }
}
这将在第一秒“闪烁”index.html 的内容,对吗?
2021-04-18 00:58:20
React 16 中头盔的使用有一个问题github.com/nfl/react-helmet/issues/548
2021-04-19 00:58:20
这绝对应该是最佳答案。这是管理标题和其他元属性的绝佳声明方式
2021-04-20 00:58:20
设置一个 <title> 标签似乎有点矫枉过正。
2021-04-22 00:58:20
@nxmohamad 是的,可以通过从 index.html 文件中完全删除标题标签来解决“闪存”问题。唯一的缺点是您必须确保在每个页面上都给出一个标题,否则默认为域名。
2021-04-24 00:58:20

对于 React 16.8,您可以使用useEffect使用功能组件执行此操作

例如:

useEffect(() => {
   document.title = "new title"
}, []);

将第二个参数作为数组只调用一次 useEffect,使其类似于componentDidMount.

如何用笑话和酶来测试?
2021-05-07 00:58:20

正如其他人所说,你可以使用document.title = 'My new title'作出react头盔更新页面标题。这两种解决方案仍将在加载脚本之前呈现初始的“React App”标题。

如果您正在使用create-react-app初始文档标题在设置<title>标签/public/index.html文件。

您可以直接编辑它或使用将从环境变量填充的占位符:

/.env

REACT_APP_SITE_TITLE='My Title!'
SOME_OTHER_VARS=...

如果出于某种原因我想在我的开发环境中使用不同的标题 -

/.env.development

REACT_APP_SITE_TITLE='**DEVELOPMENT** My TITLE! **DEVELOPMENT**'
SOME_OTHER_VARS=...

/public/index.html

<!DOCTYPE html>
<html lang="en">
    <head>
         ...
         <title>%REACT_APP_SITE_TITLE%</title>
         ...
     </head>
     <body>
         ...
     </body>
</html>

这种方法还意味着我可以使用全局process.env对象从我的应用程序中读取站点标题环境变量,这很好:

console.log(process.env.REACT_APP_SITE_TITLE_URL);
// My Title!

请参阅:添加自定义环境变量

我试过了,但 %REACT_APP_SITE_TITLE% 显示为标题。我将 .env 保持在与 package.json 相同的级别并使用 react-scripts 3.4.1
2021-04-20 00:58:20
确保将 .env 文件放在 package.json 文件的同一级别。:)
2021-04-26 00:58:20
我相信这是最合理的解决方案,除非您想更改组件中的标题
2021-05-09 00:58:20
@YuvrajPatil 这仅在构建时应用。如果你需要在运行时注入它们,create-react-app.dev/docs/...
2021-05-16 00:58:20

从 React 16.8 开始。您可以构建一个自定义钩子来执行此操作(类似于@Shortchange 的解决方案):

export function useTitle(title) {
  useEffect(() => {
    const prevTitle = document.title
    document.title = title
    return () => {
      document.title = prevTitle
    }
  })
}

这可以用于任何react组件,例如:

const MyComponent = () => {
  useTitle("New Title")
  return (
    <div>
     ...
    </div>
  )
}

它会在组件安装后立即更新标题,并在卸载时将其恢复为之前的标题。

这个解决方案不应该将依赖项设置为 [] 以便它只在挂载和卸载时运行吗?
2021-04-27 00:58:20
这是迄今为止最好的解决方案。好东西。赶上
2021-04-28 00:58:20
如果我错了,请纠正我,但这仅适用于 Function 组件,而不适用于 Class 组件。
2021-04-30 00:58:20
现代 React 的最佳答案!重置标题的想法很棒。
2021-04-30 00:58:20
很棒的钩子,在功能组件中效果很好。正如亚历克斯已经告诉我们的那样,它在类组件中不起作用,我只是进行了测试以确保。
2021-05-10 00:58:20