Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Recommended way to set document.title? #49

Closed
sophiebits opened this issue Jun 25, 2014 · 13 comments
Closed

Recommended way to set document.title? #49

sophiebits opened this issue Jun 25, 2014 · 13 comments

Comments

@sophiebits
Copy link
Contributor

Is there a recommended way to set document.title upon routing? I suppose one could just set it in all of the componentDidMount handlers, but it might be nice if there was a general strategy for this. (For example, maybe one page doesn't really care about title, in which case we'd want to fall back to the default.)

(Someone was also asking in IRC about this last night right after you left, @rpflorence.)

@ryanflorence
Copy link
Member

componentDidMount seems good?

var Handler = React.createClass({
  componentDidMount: function() {
    document.title = "Amazing Page";
  }
});

Often it will probably depend on data you fetch though:

var Handler = React.createClass({
  componentDidMount: function() {
    someStore.fetchStuff(this.params.id, function(data) {
      this.setState({data: data});
      document.title = "Amazing Page | " + data.name;
    }.bind(this));
  }
});

Since I can't imagine all the scenarios that go into deciding what your page title is, and since you generally aren't serializing state to the <head> and <title> tags, I don't expect to have a conventional way to do this.

I think just doing document.title wherever you want is enough.

Eventually we will have a server-rendering story/example, so in that case you'd probably want a helper function that is a noop when on the server.

@sophiebits
Copy link
Contributor Author

Eventually we will have a server-rendering story/example, so in that case you'd probably want a helper function that is a noop when on the server.

Ideally the server-rendered markup can have the right title too. :)

@ryanflorence
Copy link
Member

I've messed with React.renderComponent(<App/>, document.documentElement)
and it almost works, I don't think you'll ever own anything higher than
body.

On Wed, Jun 25, 2014 at 4:00 PM, Ben Alpert notifications@github.com
wrote:

Eventually we will have a server-rendering story/example, so in that case
you'd probably want a helper function that is a noop when on the server.

Ideally the server-rendered markup can have the right title too. :)


Reply to this email directly or view it on GitHub
#49 (comment)
.

@gaearon
Copy link
Contributor

gaearon commented Oct 8, 2014

I prefer the declarative way:

// there was some outdated code here, see below now

@mjackson
Copy link
Member

mjackson commented Oct 8, 2014

@gaearon boom. that's the way to do it!

@gaearon
Copy link
Contributor

gaearon commented Oct 8, 2014

@mjackson @rpflorence

I put it on NPM as react-document-title.
It really plays well with react-router's nesting:

var App = React.createClass({
  render: function () {
    // Use "My Web App" if no child overrides this
    return (
      <DocumentTitle title='My Web App'>
        <this.props.activeRouteHandler />
      </DocumentTitle>
    );
  }
});

var HomePage = React.createClass({
  render: function () {
    // Use "Home" while this component is mounted
    return (
      <DocumentTitle title='Home'>
        <h1>Home, sweet home.</h1>
      </DocumentTitle>
    );
  }
});

var NewArticlePage = React.createClass({
  mixins: [LinkStateMixin],

  render: function () {
    // Update using value from state while this component is mounted
    return (
      <DocumentTitle title={this.state.title || 'Untitled'}>
        <div>
          <h1>New Article</h1>
          <input valueLink={this.linkState('title')} />
        </div>
      </DocumentTitle>
    );
  }
});

@gaearon
Copy link
Contributor

gaearon commented Oct 23, 2014

Thanks to @pluma, react-document-title now supports server-side usage via DocumentTitle.rewind() method. So, just like react-router, it can be used on both sides.

@rajeshkw
Copy link

rajeshkw commented Feb 26, 2017

class Layout extends React.Component {
  constructor(props){
    super(props);
    document.title = this.props.title;
  }
  render(){
    return(
      <div>
      </div>
    );
  }
}

then <Layout title="My Title"/> it works!

@Aeonrush
Copy link

Hi @rajeshkw
I found better solution, that works with fetching data and Redux

import React from 'react';

export default class Layout extends React.Component {
  constructor(props){
    super(props);
  }
  componentWillUpdate(nextProps) {
    document.title = nextProps.title;
  }
  render(){
    return null;
  }
}

@marcogreselin
Copy link

marcogreselin commented May 24, 2017

How do you do this in stateless functional components? I tried this but it doesn't work:
ComponentName.componentDidMount = () => document.title = "Who's Marco?"
Where the ComponentName is something like this:

export const Life = ({sayHello="Ciao"}) => (

)

@tmkasun
Copy link

tmkasun commented May 30, 2017

@marcogreselin , As I know we can't create lifecycle hooks in a stateless functional component, These functional components don't have backing instances, and do not have the component lifecycle methods too. So better to convert it to stateful class style component.

@mjoynes-wombat-web
Copy link

@marcogreselin not sure if it's the right way but I believe you can do something like this.

export const Life = ({sayHello="Ciao"}) => {
  document.title='Your title.';
  return (
    <Your JSX>
  );
}

@swapnil95
Copy link

Another alternative - https://github.com/kodyl/react-document-meta

@remix-run remix-run deleted a comment from divined Dec 1, 2017
@remix-run remix-run deleted a comment from soumenpandit Dec 8, 2017
@remix-run remix-run deleted a comment from DevJett Dec 29, 2017
@remix-run remix-run locked as resolved and limited conversation to collaborators Dec 29, 2017
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

10 participants