反应路由器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服务器的问题。
在我的情况下,它与relative
和absolute
path有关,而不是像前面提到的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;
希望这些会有所帮助