在访问时,react-router动态段崩溃

Ale*_*oro 38 reactjs react-router

我有一个看起来像这样的路线配置(只显示我认为可能相关的部分):

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'));
});
Run Code Online (Sandbox Code Playgroud)

现在,在我的Settings react文件中,我有以下内容:

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

如果我访问host.local/settings和日志this.getParams()一切正常,文件呈现Object {tab: undefined}在控制台中显示我.但是一旦我尝试host.local/settings/user- 我希望控制台返回类似的东西Object {tab: 'user'}- 整个事情就会崩溃并开始投入Uncaught SyntaxError: Unexpected token <控制台.

React仍然很年轻,因此在许多情况下错误相当模糊.

我遵循路径匹配指南中提供的规范,它看起来非常标准,所以我只能假设它是react-router本身的问题或者我错过了什么?


更新

tl; dr:这不是react-router的问题.

长版:

显然,事实证明问题不在于ReactJS和React-Router本身.它主要涉及gulp-webserver上的一个bug (我用它来开发使用代理来连接并行运行的单独项目),并且当直接在浏览器上输入URL而不是通过链接访问时会触发错误.

我做了一个测试,它在导航时工作正常,但是在这个github问题上直接访问时会崩溃,这基本上使我的功能深层链接测试变得不可行,但是在生产时应该可以工作.


更新2

tl; dr:gulp-webserver也不是问题.

对我来说,这是涉及到relativeabsolute路径,并不能与一饮而尽,网络服务器的任何问题如前所述.更具体地说,我必须确保您的脚本和CSS引用是绝对的,以便它不会尝试在您在URL中键入的路径中找到它们.

例如:

你有两个网址:/settings/settings/account.在这种情况下,如果你在回退文件中包含你的脚本<script src="scripts/main.js"></script>,服务器将返回404,因为没有文件/settings/scripts/main.js.

愚蠢的我,但万一其他人为此而堕落,我希望这会有所帮助.


Yan*_*Tay 32

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

我加入<base href="/" /><head>我的index.html工作(:

编辑React Router 3:

自2016年初以来,React Router会在您设置时显示警告<base>:

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
Run Code Online (Sandbox Code Playgroud)

最好做这样的事情:

const history = useRouterHistory(createHistory)({
    basename: '/'
});
Run Code Online (Sandbox Code Playgroud)

  • 这也是我所需要的. (3认同)

Jim*_*Jim 1

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

提供信息,我已经根据您的规范构建了一个快速项目,这是我的设置

'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);
});
Run Code Online (Sandbox Code Playgroud)

我跳过了主页,但没有找到,因为这些不是问题,这是我在 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;
Run Code Online (Sandbox Code Playgroud)

希望这些会有所帮助