7

我有一个使用 React、Redux 和 React-Router 1.0.0-rc1 的小型原型。原型使用 Webpack 进行代码拆分。它目前使用getComponentsgetChildRoutes异步加载其他路由,如下所示:

module.exports = {
  path: 'donations',

  getChildRoutes(location, cb) {
    require.ensure([], (require) => {
      cb(null, [
        require('./routes/Donation'),
      ]);
    });
  },

  getComponent(location, cb) {
    require.ensure([], (require) => {
      cb(null, require('./components/Donations'));
    });
  }
};

这工作正常,直到我点击嵌套路由donations/:id,它看起来像:

module.exports = {
  path: ':id',

  getComponents (location, cb) {
    console.log('got it', cb); // debugging
    require.ensure([], (require) => {
      console.log('called it', cb); // debugging
      cb(null, require('./components/Donation'));
    });
  }
};

当我导航到这条路线(例如/donations/123:)时,触发了路线,加载了 bundle.js 文件,并且两个console.logs 都出现在控制台中,因此我知道该路线已加载到内存中。但是,该组件未安装和渲染。

console.log 的结果:

got it function (error, value) {
      done(index, error, value);
    }
called it function (error, value) {
      done(index, error, value);
    }

一层深的异步路由很好,但是嵌套过去是行不通的。组件已加载,但似乎并未执行。

返回的组件用 Redux 包装,Connect如下所示:

 function Connect(props, context) {
          _classCallCheck(this, Connect);
          _Component.call(this, props, context);
          this.version = version;
          this.store = props.store || c… 

更新:问题已解决

这个问题很简单。由于这是一个嵌套路由,Router 将嵌套组件传递给它的父级 in this.props.children,我没有检查它。将其归结为对 1.0.0-rc1 的(稀疏)文档的误解。

4

1 回答 1

7

我对如何react-router工作有一个基本的误解,因为当您使用嵌套(子)路由时,父组件需要将它们容纳为this.props.children

render() {
    let { DonationsComponent } = this.props
    return (
      <div>
        <h2>Donations</h2>
        <DonationsList donations={DonationsComponent} entities={entities} />
      </div>
    );
  }

上面render没有考虑this.props.children,所以嵌套路由(Donation)被拉进来连接了,但是没有渲染。

render() {
    let { children, DonationsComponent, entities } = this.props
    let child = <DonationsList donations={DonationsComponent} entities={entities} />
    return (
      <div>
        <h2>Donations</h2>
        {children || child}
      </div>
    );
  }

现在,当react-router拉入嵌套路由并将其传递给 时this.props.children,该render函数会执行正确的操作并呈现children而不是child.

于 2015-10-03T12:31:58.953 回答