反应路由器dynamic段访问时崩溃

我有一个像这样的路由configuration(只显示我认为可能相关的部分):

var React = require('react'); var Router = require('react-router'); var { Route, DefaultRoute, NotFoundRoute } = Router; var routes = ( <Route handler={AppHandler}> <DefaultRoute handler={HomeHandler}/> <Route name='home' path='/home' handler={HomeHandler}/> <Route name='settings' path='/settings/?:tab?' handler={SettingsHandler}/> <NotFoundRoute handler={NotFoundHandler}/> </Route> ); Router.run(routes, Router.HistoryLocation, function (Handler) { React.render(<Handler/>, document.getElementById('application')); }); 

现在,在我的设置反应文件,我有以下几点:

 var Settings = React.createClass({ mixins: [Router.State], render: function() { ... } }); 

如果我访问host.local/settings并logginghost.local/settings this.getParams()一切工作正常,文件呈现在控制台中显示Object {tab: undefined} 。 但只要我尝试host.local/settings/user – 我期望控制台返回类似于Object {tab: 'user'} – 的东西,整个事情崩溃的地方,只是开始抛出Uncaught SyntaxError: Unexpected token <在安慰。

反应还很年轻,因此在很多情况下这些错误是相当模糊的。

我遵循path匹配指南中提供的规范,它似乎很标准,所以我只能认为这是一个反应路由器本身的问题,或者我错过了什么?


更新

tl; dr:反应路由器不是问题。

长版本:

显然,事实certificate这个问题不在ReactJS上,也不在React-Router上。 它主要涉及gulp-web服务器上的一个错误(我使用这个错误使用代理来并行地连接单独的项目),并且当在浏览器上直接inputURL而不是通过链接访问时触发错误。

我做了一个testing,并且在导航时工作正常,但是直接按照这个github问题所描述的那样崩溃, 这个问题基本上使我的function性的深层链接testing变得不可行,但是应该在生产中工作。


更新2

tl; dr:这也不是gulp-web服务器的问题。

在我的情况下,它与relativeabsolutepath有关,而不是像前面提到的gulp-webserver的问题 。 更具体地说,我必须确保你的脚本和CSS引用是绝对的,这样它就不会在你inputURL的path中find它们。

例如:

您有两个url: /settings/settings/account 。 在这种情况下,如果您的后备文件中包含的<script src="scripts/main.js"></script>类似于<script src="scripts/main.js"></script> ,服务器将返回404,因为/settings/scripts/main.js没有文件/settings/scripts/main.js

我愚蠢的,但如果其他人为此,我希望这有助于。


感谢您的分析,它帮助我意识到这不是React Router的问题,而是我自己的path。

我将<base href="/" />到我的index.html<head>中,它工作(:

编辑:

从2016年初起,当您设置<base>时,React Router将显示警告:

 Warning: Automatically setting basename using <base href> is deprecated and will be removed in the next major release. The semantics of <base href> are subtly different from basename. Please pass the basename explicitly in the options to createHistory 

而不是像这样做:

 const history = useRouterHistory(createHistory)({ basename: '/' }); 

我没有遇到你所看到的错误。 看起来你的代码是好的,所以它可能是你没有粘贴的东西。

提供的信息,我已经根据你的规范build立一个快速的项目,这是我的设置

 'use strict'; var React = require('react'), Router = require('react-router'), AppHandler = require('./pages/app.js'), HomeHandler = require('./pages/home.js'), SettingsHandler = require('./pages/setting.js'), NotFoundHandler = require('./pages/not-found.js'), Route = Router.Route, NotFoundRoute = Router.NotFoundRoute, DefaultRoute = Router.DefaultRoute, Routes; Routes = ( /* jshint ignore:start */ <Route handler={AppHandler}> <DefaultRoute handler={HomeHandler}/> <Route name='home' path='/home' handler={HomeHandler}/> <Route name='settings' path='/settings/?:tab?' handler={SettingsHandler}/> <NotFoundRoute handler={NotFoundHandler}/> </Route> /* jshint ignore:end */ ); Router.run(Routes, Router.HistoryLocation, function (Handler, state) { React.render(<Handler/>, document.body); }); 

我跳过家,没有发现,因为这些都不是问题,这是我在settings.js中的设置

 'use strict'; var React = require('react') Router = require('react-router'); var Setting = React.createClass({ mixins: [Router.State], componentDidMount: function() { //console.log(this.getParams()); }, render: function() { /* jshint ignore:start */ console.log(this.getParams()); return ( <div>this is setting</div> ); /* jshint ignore:end */ } }); module.exports = Setting; 

希望这些会有所帮助