Reactアプリケーションのドキュメントタイトル(ブラウザーのタイトルバー)を設定したい。 react-document-title (時代遅れのようです)を使用して、constructor
およびcomponentDidMount()
にdocument.title
を設定しようとしました-これらのソリューションはいずれも動作しません。
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>
...
</>
)
}
}
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に設定します
「componentWillMount」のライフサイクルでドキュメントのタイトルを設定する必要があります。
componentWillMount() {
document.title = 'your title name'
},
React 16.8の場合、 seEffect を使用して機能コンポーネントでこれを実行できます。
例えば:
useEffect(() => {
document.title = "new title"
}, []);
2番目の引数を配列として使用すると、useEffectが1回だけ呼び出され、componentDidMount
に似たものになります。
React Portals は、実際のReactノードであるかのように、ルートReactノードの外の要素(<title>
など)にレンダリングできます。これで、追加の依存関係なしに、タイトルをきれいに設定できます。
次に例を示します。
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
class Title extends Component {
constructor(props) {
super(props);
this.titleEl = document.getElementsByTagName("title")[0];
}
render() {
let fullTitle;
if(this.props.pageTitle) {
fullTitle = this.props.pageTitle + " - " + this.props.siteTitle;
} else {
fullTitle = this.props.siteTitle;
}
return ReactDOM.createPortal(
fullTitle || "",
this.titleEl
);
}
}
Title.defaultProps = {
pageTitle: null,
siteTitle: "Your Site Name Here",
};
export default Title;
コンポーネントをページに配置し、pageTitle
を設定するだけです。
<Title pageTitle="Dashboard" />
<Title pageTitle={item.name} />
他の人が述べたように、document.title = 'My new title'
と React Helmet を使用してページタイトルを更新できます。これらのソリューションはどちらも、スクリプトがロードされる前に最初の「React App」タイトルをレンダリングします。
create-react-app
を使用している場合、initialドキュメントタイトルは<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!
参照: カスタム環境変数の追加
document.title = 'Home Page'
で以下を使用できます
import React from 'react'
import { Component } from 'react-dom'
class App extends Component{
componentDidMount(){
document.title = "Home Page"
}
render(){
return(
<p> Title is now equal to Home Page </p>
)
}
}
ReactDOM.render(
<App />,
document.getElementById('root')
);
または、このnpmパッケージnpm i react-document-title
を使用できます
import React from 'react'
import { Component } from 'react-dom'
import DocumentTitle from 'react-document-title';
class App extends Component{
render(){
return(
<DocumentTitle title='Home'>
<h1>Home, sweet home.</h1>
</DocumentTitle>
)
}
}
ReactDOM.render(
<App />,
document.getElementById('root')
);
ハッピーコーディング!!!
私はこれを徹底的にテストしていませんが、これはうまくいくようです。 TypeScriptで書かれています。
interface Props {
children: string|number|Array<string|number>,
}
export default class DocumentTitle extends React.Component<Props> {
private oldTitle: string = document.title;
componentWillUnmount(): void {
document.title = this.oldTitle;
}
render() {
document.title = Array.isArray(this.props.children) ? this.props.children.join('') : this.props.children;
return null;
}
}
使用法:
export default class App extends React.Component<Props, State> {
render() {
return <>
<DocumentTitle>{this.state.files.length} Gallery</DocumentTitle>
<Container>
Lorem ipsum
</Container>
</>
}
}
他の人がアプリ全体を置くことに熱心である理由がわからない内部<Title>
コンポーネント、それは私には奇妙に思えます。
render()
内のdocument.title
を更新することにより、動的なタイトルが必要な場合は更新または最新の状態に維持されます。マウント解除されたときにもタイトルを元に戻す必要があります。ポータルはかわいいですが、不要なようです。ここでDOMノードを操作する必要はありません。
初心者の場合は、反応プロジェクトフォルダーのパブリックフォルダーに移動し、「index.html」のタイトルを編集して自分のものを置くことで、すべてのことから自分を救うことができます。保存することを忘れないでください。
Jsファイルに関数を作成し、コンポーネントで使用するためにそれをエクスポートするだけです。
以下のように:
export default function setTitle(title) {
if(typeof title !== "string")
throw new Error("Title should be an string");
document.title = title;
}
次のようなコンポーネントで使用します。
import React, { Component } from 'react';
import setTitle from './setTitle.js' // no need to js extension at the end
class App extends Component {
componentDidMount() {
setTitle("i am a new title");
}
render() {
return (
<div>
see the title
</div>
);
}
}
export default App