当前位置: 首页 > 知识库问答 >
问题:

有没有办法用React-Router v4修改页面标题?

葛学民
2023-03-14

我正在寻找一种方法,当React-Router v4更改位置时修改页面标题。我曾经在 Redux 中侦听位置更改操作,并根据 metaData 对象检查该路由。

当使用React Router v4时,列表中没有固定的路由。事实上,站点周围的各个组件可以使用<code>路由

当某些主要路线发生变化时,是否有一种方法可以通过调用操作来更新页面标题,或者是否有更好的方法来更新站点的元数据?

共有3个答案

谯翔
2023-03-14

从phen0menon的优秀答案中吸取教训,为什么不扩展Route而不是React.Component呢

import React, { useEffect } from 'react';
import { Route } from 'react-router-dom';
import PropTypes from 'prop-types';

export const Page = ({ title, ...rest }) => {
  useEffect(() => {
    document.title = title;
  }, [title]);
  return <Route {...rest} />;
};

这将删除开销代码,如下所示:

// old:
  <Route
    exact
    path="/"
    render={props => (
      <Page {...props} component={Index} title="Index Page" />
    )}
  />

// improvement:
  <Page
    exact
    path="/"
    component={Index}
    title="Index Page"
  />

更新:另一种方法是使用自定义挂钩:

import { useEffect } from 'react';

/** Hook for changing title */
export const useTitle = title => {
  useEffect(() => {
    const oldTitle = document.title;
    title && (document.title = title);
    // following line is optional, but will reset title when component unmounts
    return () => document.title = oldTitle;
  }, [title]);
};
孟华晖
2023-03-14

在您的组件中,对每个页面执行此操作

componentDidMount() {
  document.title = 'Your page title here';
}

这将改变你的页面标题,对每条路线做上述操作。

此外,如果它不仅仅是标题部分,请检查react头盔,这是一个非常整洁的库,并处理一些很好的边缘情况。

温星华
2023-03-14

<代码>

<Route
  exact
  path="/"
  render={props => (
    <Page {...props} component={Index} title="Index Page" />
  )}
/>

<Route
  path="/about"
  render={props => (
    <Page {...props} component={About} title="About Page" />
  )}
/>

在< code >页面组件中,您可以设置路线标题:

import React from "react"

/* 
 * Component which serves the purpose of a "root route component". 
 */
class Page extends React.Component {
  /**
   * Here, we define a react lifecycle method that gets executed each time 
   * our component is mounted to the DOM, which is exactly what we want in this case
   */
  componentDidMount() {
    document.title = this.props.title
  }
  
  /**
   * Here, we use a component prop to render 
   * a component, as specified in route configuration
   */
  render() {
    const PageComponent = this.props.component

    return (
      <PageComponent />
    )
  }
}

export default Page

更新1八月2019.这只适用于反应路由器

使用 React Hooks 更新了答案:

您可以使用下面的组件指定任何路由的标题,该组件是使用useEffects构建的。

import { useEffect } from "react";

const Page = (props) => {
  useEffect(() => {
    document.title = props.title || "";
  }, [props.title]);
  return props.children;
};

export default Page;

然后在路由呈现道具中使用 Page

<Route
  path="/about"
  render={(props) => (
    <Page title="Index">
      <Index {...props} />
    </Page>
  )}
/>

<Route
  path="/profile"
  render={(props) => (
    <Page title="Profile">
      <Profile {...props} />
    </Page>
  )}
/>
 类似资料:
  • 前端有没有办法实现页面截图?不是html-to-canvas那种实现,而是类似于windows上各种截图工具那样,直接截取屏幕上图像 目前搜到的全是html-to-canvas的方案

  • 问题内容: 根据我的研究,看来我想做的事是不可能的,但是如果情况有所变化,我想检查一下是否有人想出办法。 我有一个Web应用程序,可以根据浏览器窗口中的用户选择生成打印报告。我有一个自定义的页眉和页脚,当从浏览器打印报告时,应在每个打印的页面上重复该页眉和页脚。它不是我需要的浏览器页眉和页脚,而是我生成的自定义页眉和页脚。另外,我不认为这是CSS和媒体类型的问题,但我不是CSS专家。我没有让页眉和

  • 问题内容: 我正在构建带有一些文本元素(例如选项卡名称)的HTML UI,这些文本元素在被选中时看起来很糟糕。不幸的是,对于用户来说,双击选项卡名称非常容易,该名称在许多浏览器中都是默认选择的。 我也许可以用JavaScript技巧解决这个问题(我也想看看那些答案),但是我真的希望CSS / HTML中的某些功能可以直接在所有浏览器中使用。 问题答案: 在大多数浏览器中,可以使用CSS来实现: 对

  • 我有一个简单的模块化javafx应用程序。 我用 这将创建mods目录 然后,我使用命令创建运行时映像 这将在hellofx目录中创建运行时映像 现在我使用jpackage命令来创建Windows安装程序。在目录中,我有一个应用程序的图标。 此图标用于已安装的应用程序,但有没有办法为安装程序文件本身创建图标?名为HelloFX-1.0的安装程序文件没有图标。有没有办法将jpack配置为也更改此文件

  • 大概是这样的: 谢谢[已解决] 也感谢Umer Farooq的回答:从lambda内部修改局部变量

  • 问题内容: 假设我有一个使用lambda表达式(闭包)定义的对象列表。有没有一种方法可以检查它们以便进行比较? 我最感兴趣的代码是 完整的代码是 似乎唯一的解决方案是将每个lambda定义为一个字段,并且仅使用这些字段。如果要打印出称为的方法,最好使用。lambda表达式有更好的方法吗? 此外,是否可以打印lambda并获得人类可读的内容?如果你打印而不是 得到类似的东西 甚至使用和方法。 问题答