反应路由器服务器端渲染Rails

时间:2016-10-25 03:52:28

标签: javascript ruby-on-rails reactjs react-router

我一直在努力寻找实现这一目标的好方法,但基本上我想要做的是通过服务器呈现页面,但后续路由是客户端react-router。我可以使用createMemoryHistory为我的路由器设置服务器端路由器。

class Router extends React.Component {
  render() {
    return(
      <Router history={createMemoryHistory}>
        <Route path="/" component={App}>
          <IndexRoute component={Index} />
          <Route path="/contact" component={Contact}/>
          <Route path="/about" component={About}/>
        </Route>
      </Router>
    )
  }
}

然后通过react-rails gem我可以在服务器上呈现内容。

<%= react_component('Router', {}, {prerender: true}) %>

这个问题是当我导航到不同的页面时,URL不会改变。理想情况下,我希望能够使用createMemoryHistory在服务器上加载路由器,然后一旦加载,我就想切换到browserHistory

1 个答案:

答案 0 :(得分:1)

您可以通过先前根据环境设置history道具来实现此目的。我不熟悉Rails上的react_component,但我猜测MountUp是你的根组件。

const history = process.env.NODE_ENV === 'server' ? createMemoryHistory : browserHistory;

// ...

class MountUp extends React.Component {
  render() {
    return (
      <Router history={history}/>
    );
  }
}

// ...

class Routes extends React.Component {
  render() {
    return(
      <Router history={this.props.history}>
        <Route path="/" component={App}>
          <IndexRoute component={Index} />
          <Route path="/contact" component={Contact}/>
          <Route path="/about" component={About}/>
        </Route>
      </Router>
    )
  }
}