React js 做通用头部

Posted

技术标签:

【中文标题】React js 做通用头部【英文标题】:React js do common header 【发布时间】:2016-11-25 09:26:14 【问题描述】:

我是 ReactJS 的新手。我需要有一个共同的标题并根据路线的变化来改变标题。我需要创建一个header.jsx 文件并导入它吗?不然怎么用路由渲染头部(普通文件)?

我的路由部分如下所示:

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App.jsx';
import Home from './Home.jsx';
import  Router, Route, Link, browserHistory, IndexRoute   from 'react-router';

ReactDOM.render((
    <Router history = browserHistory>
        <Route path = "/home" component = Home />
        <Route path = "/" component = App>
        </Route>
    </Router>
));

【问题讨论】:

您应该发布您尝试修复的代码。因此,发布公共头组件,它是如何包含在您的容器/***组件中的。以及你是如何进行路由的。 抱歉,无法修复。还没有做。 【参考方案1】:

这应该可行:

header.jsx:

class Header extends Component 
  render() 
    return (<div>Your header</div>);
  

first-page.jsx:

class FirstPage extends Component 
  render() 
    return (<div>First page body</div>);
  

second-page.jsx

class SecondPage extends Component 
  render() 
    return (<div>Second page body</div>);
  

app.jsx:

import Header from './header.jsx';

class App extends Component 
  render() 
    return (
      <div>
        <Header />
        this.props.children
      </div>
    );
  

web-app.jsx:

import App from './app.jsx';
import FirstPage from './first-page.jsx';
import SecondPage from './second-page.jsx';

ReactDOM.render(
  <Router history = browserHistory>
    <Route path = "/" component = App>
      <Route path = "/first" component = FirstPage>
      <Route path = "/second" component = SecondPage>
    </Route>
  </Router>
);

【讨论】:

我有多个 jsx 文件,例如 Home.jsx、About.jsx。在这种情况下,我需要做什么。 更新了答案以反映分离的文件。 太完美了@lalkmim 如果我想隐藏路径“/first”的组件App,我们如何实现以及是否可以根据路由更改更改标题标题。 在这种情况下,您必须取消嵌套路由并在每个路由上包含 &lt;Header /&gt; 组件。但这将是一个糟糕的方法。路由/first/second 之间共有的所有内容都应提取到App 组件中。【参考方案2】:

因此,如果您需要在您的路线之间显示一个公共标题,有几种方法可以做到这一点。一种是您可以在自己的组件中定义标题。举个简单的例子:

import React from 'react';
export default React.createClass(
  render() 
    return <div className='header'><h1>this.props.title</h1></div>;
  

然后在您的主组件、应用程序组件等中。只需在您的 render() 中,在每个文件的顶部导入它之后。

另一种选择是创建自己的容器组件,仍然使用我们上面定义的 Header 组件:

import React from 'react';
export default React.createClass(
  render() 
    return (
      <div className='container'>
        <Header title=this.props.title />
        this.props.children
      </div>
    );
  

然后你声明你的路线:

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App.jsx';
import Home from './Home.jsx';
import Container from './Container.jsx';
import  Router, Route, Link, browserHistory, IndexRoute   from 'react-router';

ReactDOM.render((
    <Router history = browserHistory>
        <Route path = "/home" component = <Container title='home'><Home /></Container> />
        <Route path = "/" component = <Container title='app'><App /></Container>>
        </Route>
    </Router>
));

诚然,我还没有尝试过第二种选择。如果您想做router.transitionTo('/path') 之类的操作,您可能必须将路由器作为参数从容器组件传递到子组件的使用。

如果您不想到处重复,这只是一个选择。

【讨论】:

【参考方案3】:

试试这个https://www.npmjs.com/package/react-helmet

import React from "react";
import Helmet from "react-helmet";

export default function Application () 
return (
    <div className="application">
        <Helmet title="My Title" />
        ...
    </div>
);;

【讨论】:

谁投了反对票,请解释!这个插件看起来很棒,看起来维护得很好并且有很多星星;) @abimelex - 我没有投反对票,但如果我正确理解了头盔,它用于更改“文档头”(即 html 元素)而不是提供共享组件头如 OP 的问题中所述。

以上是关于React js 做通用头部的主要内容,如果未能解决你的问题,请参考以下文章

React Native学习—— 写一个公用组件(头部)

想做一个页面头部div固定不动的效果

P02:编写博客公用头部并生成组件

HTTP头部信息

javascript标签到底是应该放在头部还是尾部?

HTTP常用头部