Изменение названия документа в React?

Я пытаюсь обновить название документа в приложении React. У меня очень простые потребности в этом. Название по существу используется для отображения компонента Total, даже если вы находитесь на другой вкладке.

Это был мой первый инстинкт:

const React = require('react');

export default class Total extends React.Component {
  shouldComponentUpdate(nextProps) {
    //otherstuff
    document.title = this.props.total.toString();
    console.log("Document title: ", document.title);
    return true;
  }
  render() {
    document.title = this.props.total;
    return (
      <div className="text-center">
        <h1>{this.props.total}</h1>
      </div>
    );
  }
}

Я думал, что это просто обновит document.title каждый раз, когда этот компонент будет отображаться, но он ничего не делает.

Не уверен, что мне здесь не хватает. Возможно, что-то связано с тем, как React запускает эту функцию - может быть, где-то переменная document недоступна?

EDIT:

Я начинаю щедрость за этот вопрос, так как я до сих пор не нашел решения. Я обновил свой код до более поздней версии.

Странная разработка заключается в том, что console.log распечатывает заголовок, который я ищу. Но по какой-то причине фактический заголовок на вкладке не обновляется. Эта проблема одинакова для Chrome, Safari и Firefox.

Ответ 1

Я думаю, что webpack-dev-server по умолчанию работает в режиме iframe:

https://webpack.github.io/docs/webpack-dev-server.html#iframe-mode

Возможно, поэтому ваши попытки установить заголовок проваливаются. Попробуйте установить для параметра inline значение true на webpack-dev-server, если вы этого еще не сделали.

Ответ 2

Сейчас я использую реагирующий шлем для этой цели, поскольку он позволяет настраивать различные метатеги и ссылки, а также поддерживает SSR.

import { Helmet } from 'react-helmet'

const Total = () => (
  <div className="text-center">
    <Helmet>
      <meta charSet="utf-8" />
      <title>{this.props.total}</title>
    </Helmet>
    <h1>{this.props.total}</h1>
  </div>
)

Оригинальный ответ: для этого есть пакет от gaeron, но декларативно:

import React, { Component } from 'react'
import DocumentTitle from 'react-document-title'

export default class Total extends Component {

  render () {
    return (
      <DocumentTitle title={this.props.total}>
        <div className='text-center'>
          <h1>{this.props.total}</h1>
        </div>
      </DocumentTitle>
    )
  }

}

Ответ 3

Если пакет react-document-title не работает для вас, быстрый способ сделать это будет в методе жизненного цикла, возможно, как componentDidMount, так и componentWillReceiveProps (вы можете узнать больше об этих здесь):

Итак, вы бы сделали что-то вроде:

const React = require('react');

export default class Total extends React.Component {

  // gets called whenever new props are assigned to the component
  // but NOT during the initial mount/render
  componentWillReceiveProps(nextProps) {
    document.title = this.props.total;
  }

  // gets called during the initial mount/render
  componentDidMount() {
    document.title = this.props.total;
  }

  render() {    
    return (
      <div className="text-center">
        <h1>{this.props.total}</h1>
      </div>
    );
  }
}

Ответ 4

Внутри функции componentDidMount() в App.js (или где-либо еще) просто есть:

componentDidMount() {
    document.title = "Amazing Page";
}

Ответ 5

Существует лучший способ динамического изменения названия документа с помощью react-helmet.

На самом деле вы можете динамически изменять что-либо внутри тега <head>, используя react-helmet изнутри вашего компонента.

  const componentA = (props) => {
    return (
      <div>
       <Helmet>
        <title>Your dynamic document/page Title</title>
        <meta name="description" content="Helmet application" />
       </Helmet>
       .....other component content
    );
  }

Ответ 6

Динамическое изменение заголовка, мета-тегов и favicon во время выполнения react-helmet обеспечивает простое решение. Вы также можете сделать это в componentDidMount используя стандартный интерфейс документа. В приведенном ниже примере я использую один и тот же код для нескольких сайтов, поэтому шлем ищет значок и заголовок из переменной среды

import { Helmet } from "react-helmet";
import { getAppStyles } from '../relative-path';
import { env } from '../relative-path';

<Helmet>
  <meta charSet="utf-8" />
  <title>{pageTitle[env.app.NAME].title}</title>
  <link rel="shortcut icon" href={appStyles.favicon} />
</Helmet>