Reactアプリケーションの(ブラウザーのタイトルバーにある)ドキュメントのタイトルを設定したいと思います。私が使って試してみまし反応し、ドキュメントのタイトルを(古くらしい)との設定document.title
にconstructor
してcomponentDidMount()
-これらのソリューションの作品のどれも。
Reactアプリケーションの(ブラウザーのタイトルバーにある)ドキュメントのタイトルを設定したいと思います。私が使って試してみまし反応し、ドキュメントのタイトルを(古くらしい)との設定document.title
にconstructor
してcomponentDidMount()
-これらのソリューションの作品のどれも。
回答:
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を使用している場合は、インラインをtrueに設定します
React 16.8では、useEffectを使用して機能コンポーネントでこれを行うことができます。
例えば:
useEffect(() => {
document.title = "new title"
}, []);
2番目の引数を配列として持つと、useEffectが1回だけ呼び出され、と同様になりcomponentDidMount
ます。
他の人が述べたように、React Helmetを使用document.title = 'My new title'
してページタイトルを更新できます。これらのソリューションはどちらも、スクリプトが読み込まれる前に、初期の「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!
参照:カスタム環境変数の追加
「componentWillMount」のライフサイクルでドキュメントのタイトルを設定する必要があります。
componentWillMount() {
document.title = 'your title name'
},
React ポータルでは、<title>
実際のReactノードであるかのように、ルートReactノード(など)の外部の要素にレンダリングできます。そのため、追加の依存関係なしでタイトルをきれいに設定できます:
次に例を示します。
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} />
fullTitle
index.htmlに既にあるコンテンツに追加するだけであることに気付くまで、私はこのソリューションを気に入っていました<title>Default Title</title>
。
constructor
!ではありません) `` `import React from 'react'; 'prop-types'からPropTypesをインポートします。ReactDOMからReactDOMをインポートします。const titleNode = document.getElementsByTagName( "title")[0]; titleNode.innerText = ''; エクスポートのデフォルトクラスTitle extends React.PureComponent {static propTypes = {children:PropTypes.node、}; コンストラクタ(プロップ){スーパー(プロップ); this.el = titleNode; } render(){return ReactDOM.createPortal(this.props.children、this.el、); }} `` `
React 16.13では、レンダリング関数内で直接設定できます。
import React from 'react';
import ReactDOM from 'react-dom';
class App extends React.Component {
render() {
document.title = 'wow'
return <p>Hello</p>
}
}
ReactDOM.render(
<App />,
document.getElementById('root')
)
関数コンポーネントの場合:
function App() {
document.title = 'wow'
return <p>Hello</p>
}
単純に、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
以下で使用できます 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>
構成要素、それは私には奇妙なようです。
動的なタイトルが必要な場合は、document.title
内部を更新することにより、更新render()
/最新の状態に保たれます。マウントを解除すると、タイトルも元に戻ります。ポータルはかわいいですが、不要のようです。ここでは、DOMノードを操作する必要はありません。
私はこの方法を使用していますが、この方法は自分にとっては簡単なのでわかりました。機能部品と組み合わせて使用します。 これを行うのは、ユーザーがページでJavaScriptを無効にしてもタイトルが表示されないようにしたい場合のみです。
あなたがしなければならないことが2つあります。
1. index.htmlに移動し、この行をここで削除します
<title>React App</title>
2. mainapp関数に移動し、これを通常のhtml構造に戻します。メインのコンテンツをコピーして、ウェブサイトのbodyタグの間に貼り付けます。
return (
<html>
<head>
<title>hi</title>
</head>
<body></body>
</html>
);
タイトルは自由に入れ替えることができます。