2017-04-20 18 views
1

私はjsfiddleと同様の単純なプロジェクト構成を作成しようとしていますが、ローカルマシンにあります。反応ルータとエクスプレスの子ルートがトリガーされない

私は1つのフィドルごとに3つのファイルを持ち、サーバーは1ページのアプリケーションを開始したいだけです。私は主に反応エコシステムを使用しています。

私は反応ルータを使用したいときに問題が発生します。この設定では、ルート '/'ルートのみがトリガされ、すべての子ルートはindex.htmlにリダイレクトされます。

(私は、問題のソースを疑うので、私はスタイルファイルを省略します)

任意の提案ですか?

server.js

var express = require('express'); 
var path = require('path'); 
var morgan = require('morgan'); 
//var history = require('connect-history-api-fallback'); 

var PORT = 3007; 
var HOST = 'localhost' 

var app = express(); 

/* 
app.use(history({ 
    disableDotRule: true, 
    verbose: true 
})); 
*/ 

app.use(morgan('tiny')); 

// Serve static assets 
app.use(express.static(__dirname)); 

// Always return the main index.html 
app.get('*', function(req, res) { 
    res.sendFile(path.join(__dirname, 'index.html')); 
}); 

app.listen(PORT, HOST, function() { 
    console.log('Example app listening on port ' + HOST + ':' + PORT + '...'); 
}); 

index.htmlを

<html> 
    <head> 
    <title>multi-page-form-with-router</title> 
    <link rel="stylesheet" type="text/css" href="styles.css" media="screen" /> 
    </head> 
    <body> 
    <div id="root"></div> 

    <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.24.0/babel.js"></script> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/redux-thunk/2.2.0/redux-thunk.js"></script> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/redux/3.6.0/redux.min.js"></script> 
    <script src="https://unpkg.com/[email protected]/dist/react.js"></script> 
    <script src="https://unpkg.com/[email protected]/dist/react-dom.js"></script> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react-redux/5.0.3/react-redux.min.js"></script> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react-router/3.0.4/ReactRouter.js"></script> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/redux-form/6.6.3/redux-form.min.js"></script> 

    <script type="text/babel" src="main.js"></script> 

    </body> 
</html> 

main.js

const { Component } = React 
const { Router, Route, browserHistory, IndexRoute, Link } = ReactRouter 

const App =() => (
    <Router history={browserHistory}> 
    <Route path='/' component={Header}> 
     <IndexRoute component={Menu} /> 
     <Route path='first' component={FirstPage} /> 
     <Route path='second' component={SecondPage} /> 
    </Route> 
    </Router> 
); 

const Header =() => (
    <h1>Multi-page form</h1> 
) 

const Menu =() => (
    <ul> 
    <li><Link to='first'>Start form</Link></li> 
    </ul> 
) 

const FirstPage =() => { 
    return (
    <div> 
     <p>First Page</p> 
     <Link to='second'>Next</Link> 
    </div> 
) 
} 

const SecondPage =() => { 
    return (
    <div> 
     <p>Second Page</p> 
     <Link to='overview'>Next</Link> 
    </div> 
) 
} 

const Overview =() => { 
    return (<p>Overview</p>) 
} 

ReactDOM.render(
    <App />, 
    document.getElementById('root') 
) 

答えて

1

以下のような主要なslash(/)を持っているあなたのLinkタグをリダイレクトする必要があり、ルートのルートが自分自身をレンダリングするだけでなく、その子供をレンダリングするべきだと思います。あなたの例では、Headerは単にitseflをレンダリングしています。

<Router history={browserHistory}> 
    <Route path='/' component={Root}> 
    <Route path='/examples/react-redux-websocket' component={App} /> 
    <Route path='/examples/react-redux-websocket/chat/:chatid/participant/:participantid' component={Chat} /> 
    <Route path='/examples/react-redux-websocket/chat/:chatid' component={Chat} /> 
    <Route path='/*' component={NoMatch} /> 
    </Route> 
</Router> 

Root.js:

class Root extends Component { 
    render() { 
    return (
     //Render itself 
     <div> 
     //And its children too 
     {this.props.children} 
     <Footer /> 
     </div> 
    ) 
    } 
} 

あなたが見ることができるように、ルートのルート内でレンダリングされたすべてのルートが同じフッターを共有する

これは私が持っている実施例です。あなたの例では、Headerはその子をレンダリングする必要があります。

あなたが望むものがURLの階層を持つことであれば、各ルートを指定する必要があります。この例では、私は反応経路3.0.2を使用しています、あなたが使用しているバージョンによって多少の違いがあるかもしれません

<Route path='/xxx/route_1' component={Route_1} /> 
<Route path='/xxx/route_2' component={Route_2} /> 

、しかし:私は/xxx/route_1/xxx/route_2を持ちたいのであれば、私はそれらを指定する必要があります一般的には、その使用法は多かれ少なかれ同じです。

使用しているバージョンはわかりませんが、「/」を追加するルートを参照する必要があります。

お手数をお掛けします。あなたが理解できないことがあるか、またはあなたが間違っていると思われるものがある場合は私に教えてください。

あなたは全体の一例hereを見てとることができ、あなたはそれがhere

+0

Indded、私は子供がいなくなっていた。どうもありがとうございました。 – Ionthas

+0

あなたを助けてうれしい!! –

0

私はここで何かが欠けていない限り、あなたは

<Link to='/first'>Start form</Link> 
+0

私は両方の方法を試してみた見つけることができます作業、それを見たいと思って、どちらも動作します。実際、パスをURLに直接入れるだけでindex.htmlがトリガーされます。あなたが指定するルートは重要ではありません。 – Ionthas

関連する問題