web-dev-qa-db-ja.com

ReactJSヘッダーとフッター

HeaderおよびFooterをレンダリングするLayoutコンポーネントを作成しようとしています。後でLayoutを使用できるように

<Layout> ... </Layout>

明らかに、ヘッダーとフッターでルーティングを使用しました。これを行うには、使用する必要があります

<Router history...
 <Route path...

私のlayout.jsでこれを次々に(ヘッダーとフッター用:これは間違っていると感じていますが)行います。できます。ヘッダーとフッターがブラウザーに表示されます。 ただし、正しく機能しません。更新すると、フッターが消え、場合によってはヘッダーとフッターの両方が消えます。ルーターを次々にレンダリングすることがこの誤動作の原因であると強く信じていますが、正しいアプローチがわかりません。また、次のスニペットを使用したくない

header.js

import React from 'react';
import {Link} from 'react-router'
import {Navbar, NavItem} from 'react-materialize';

export default React.createClass({
  render(){
    return (
    <div>
      <Navbar brand='logo' right>
        <NavItem><Link to="/Home" activeClassName="active">Home</Link></NavItem>
        <NavItem><Link to="/Sign-In" activeClassName="active">Sign In</Link></NavItem>
        <NavItem><Link to="/Register" activeClassName="active">Register</Link></NavItem>
      </Navbar>
      {this.props.children}
    </div>
    )
  }
})

footer.js

import React, {Component} from 'react';
import {Link} from 'react-router'
import {Footer} from 'react-materialize';
import '../../resource/template.css'


class RT_Footer extends Component{
  render(){
    return (
    <div>
      {this.props.children}
      <Footer copyrights="&copy; 2015 Copyright Text"
          moreLinks={
            <Link className="grey-text text-lighten-4 right" href="#!">More Links</Link>
          }
          links={
            <ul>
              <li><Link to="/About Us" className="grey-text text-lighten-3">About Us</Link></li>
              <li><Link to="/Terms & Conditions" className="grey-text text-lighten-3">Terms & Conditions</Link></li>
              <li><Link to="/Help" className="grey-text text-lighten-3">Help</Link></li>
              <li><Link to="/Contact Us" className="grey-text text-lighten-3">Contact Us</Link></li>
            </ul>
          }
          className='example'
      >
        <h5 className="white-text">Footer Content</h5>
        <p className="grey-text text-lighten-4">You can use rows and columns here to organize your footer content.</p>
      </Footer>
    </div>
    );
  }
}
export default RT_Footer;

layout.js

import {Router, Route, browserHistory} from 'react-router'

class Layout extends Component {
  render(){
    return (
      <div>
      <span>
        <Router history={browserHistory}>
          <Route path="/" component={Header}>
           <Route path="/Home" component={Home}/>
           <Route path="/Sign-In" component={SignIn}/>
           <Route path="/Register" component={Register}/>
          </Route>
        </Router>
      </span>
      <span>
        <Router history={browserHistory}>
          <Route path="/" component={RT_Footer}>
           <Route path="/About Us" component={About}/>
           <Route path="/Terms & Conditions" component={TC}/>
           <Route path="/Register" component={Register}/>
          </Route>
        </Router>
      </span>
      </div>
    );
  }
}
export default Layout;

次に、index.jsでLayoutをレンダリングしました

7
Roy

do n'tルーターコンポーネントをレンダリングすることをお勧めしますtwice(チェックしていませんが、おそらくできません)。

それで、Routerコンポーネントの仕組み:

  • ルータに履歴を(履歴の小道具を介して)渡します。ここでは、同じライブラリのbrowserHistoryを使用します。
  • 次に、ルートコンポーネントとパスを使用してアプリケーションの既存のルートをすべて定義し、ブラウザのURLがこのパスプロパティに一致する場合にロードするコンポーネントを定義します。

さて、あなたの場合、そのようなことをすることをお勧めします:

app.js

import {Router, Route, browserHistory} from 'react-router'
import Layout from './components/Layout'
// Import here all the required components used by the router such as SignIn, Register, ...

render(
    <Layout>
        <Router history={browserHistory}>
            <Route path="/" component={RT_Footer}>
            <Route path="/About Us" component={About}/>
            <Route path="/Terms & Conditions" component={TC}/>
            <Route path="/Register" component={Register}/>
           // Add as many Route components as needed
        </Router>
    </Layout>,
    document.getElementById('react-anchor')

レイアウトファイルは次のようになります。

layout.js

import Header from './Header'
import Footer from './Footer'
import React, {Component} from 'react'

class Layout extends Component {
    render() {
        return (
            <div>
                <Header />
                {this.props.children}
                <Footer />
            </div>
        )
    }
}

そして、Header and Footerコンポーネントで、必要なものをレンダリングして、react-routerまたはライブラリが提供する他の方法から使用できる、要求されたコンポーネントをロードするためのリンクを提供します(ドキュメントを参照)

編集:

「利用規約」などのルートパスに注意することは、おそらく有効なパスではありません

17
Quentin