React-router链接不起作用

Pat*_*ick 9 reactjs react-router

React-router是一个非常糟糕的开始......看起来基本不起作用.使用react-router 2.0.0我的链接组件将URL更新为/ about,但我的页面之后不会呈现About组件...

入口点js

var React = require('react');
var ReactDOM = require('react-dom');
var Router = require('react-router').Router;
var Route = require('react-router').Route;
var hashHistory = require('react-router').hashHistory;
var App = require('./components/App.react');
var About = require('./components/About');

ReactDOM.render(
    <Router history={hashHistory} >
        <Route path="/" component={App}>
            <Route path="about" component={About} />
        </Route>
    </Router>, 
    document.getElementById('app')
);
Run Code Online (Sandbox Code Playgroud)

App.js

'use strict';

var React = require('react');
var Link = require('react-router').Link;
var Header = require('./Header');
var UserPanel = require('./UserPanel');
var ModelPanel = require('./ModelPanel.react');
var EventPanel = require('./event/EventPanel');
var VisPanel = require('./vis/VisPanel');
var LoginForm = require('./LoginForm');
var AppStore = require('../stores/AppStore');
var AppStates = require('../constants/AppStates');

var App = React.createClass({

  [... code omitted ...]

  render: function() {
    var viewStateUi = getViewStateUi(this.state.appState);

    return (
      <div>
        <Header />
        <Link to="/about">About</Link>
        {viewStateUi}
      </div>
    );
  }

});
Run Code Online (Sandbox Code Playgroud)

Mar*_*son 11

由于"关于"路线是"App"路线的子路线,因此您需要添加this.props.children到App组件:

var App = React.createClass({

 render: function() {

   var viewStateUi = getViewStateUi(this.state.appState);

    return (
      <div>
        <Header />
        <Link href="/about">About</Link>
        {viewStateUi}
        {this.props.children}
      </div>
    );
  }
});
Run Code Online (Sandbox Code Playgroud)

或分开您的路线:

ReactDOM.render(
  <Router history={hashHistory} >
    <Route path="/" component={App} />
    <Route path="/about" component={About} />
  </Router>, 
  document.getElementById('app')
);
Run Code Online (Sandbox Code Playgroud)


Art*_*lho 11

出于某种原因,<Link>使用下面的配置,s不适合我.

// index.js

ReactDOM.render(
  <Provider store={store}>
    <BrowserRouter >
      <App />
    </BrowserRouter>
  </Provider>,
  document.getElementById('root')
);
Run Code Online (Sandbox Code Playgroud)

// App.js

  return (
      <div className="App">
        <Route exact={true} path="/:lang" component={Home} />
        <Route exact={true} path="/" render={() => <Redirect to={{ pathname: 'pt' }} />} />
        <Route path="/:lang/play" component={Play} />} />
        <Route path="/:lang/end" component={End} />
      </div >
    );
Run Code Online (Sandbox Code Playgroud)

Home组件有链接,但应用程序上的链接也会这样做.每次我点击它,它只会更改网址,但视图将保持不变.

当我将withRouter添加到App.js 时,我能够正常工作

export default withRouter(connect(mapStateToProps, { f, g })(App));
Run Code Online (Sandbox Code Playgroud)

我还是不明白发生了什么.也许它与redux有关,或者有一些我遗漏的细节.

  • 你是对的,它与Redux有关,因为我刚刚遇到了与MobX相同的问题.问题是MobX/Redux控制了`shouldComponentUpdate`,因此`App`组件不会重新渲染,因为它没有收到`location`作为道具.此处文档中有更多解释:https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/guides/blocked-updates.md (6认同)