【问题标题】:Dynamic Lazy Loading using React.Lazy (16.6.0)使用 React.Lazy (16.6.0) 的动态延迟加载
【发布时间】:2018-10-25 10:08:51
【问题描述】:

我得到一个像

的数组
{Path:xxx, 
Component:"./xxx/ComPXX"}

从我的 API 中创建我的应用程序的路由。目前我正在使用 React-Loadable (5.5.0) 和 React-Router (4.4.0-betax 以避免在严格模式下出现警告)。请参阅工作示例 here

由于 React 16.6 引入了 React.lazy,我正在尝试迁移我的解决方案,但是我遇到了错误和困难,但是我尝试这样做。你可以看到迁移(失败)的代码here

知道为什么这不起作用吗?会不会是因为 React.Lazy 不接受变量?

【问题讨论】:

    标签: javascript reactjs react-router-v4 react-async


    【解决方案1】:

    您有 2 3 个主要问题:

    1. 在这一行:

      var c = <dynamicLoader component={prop.component} />;
      

      User-Defined Components Must Be Capitalized。所以把它改成这样:

      var c = <DynamicLoader component={prop.component} />;
      

      显然您还需要更改声明:

      function DynamicLoader(props) {
        return (
          <Suspense fallback={<div>Loading...</div>}>
            React.lazy(() => import(`${props.component}`))
          </Suspense>
        );
      }
      
    2. 在这一行

      return <Route exact path={prop.path} component={c} key={key} />;  
      

      正如道具名称component 所暗示的那样,您需要传递一个 组件而不是元素,您可以阅读有关差异的更多信息 在DOCS

      所以你需要把它改成这样:

      return <Route exact path={prop.path} component={() => c} key={key} />;
      
    3. 你是对的。我错过了孩子们的部分,你正在渲染一个字符串。您可以创建一个 变量并将其渲染为孩子:

      function DynamicLoader(props) {
        const LazyComponent = React.lazy(() => import(`${props.component}`));
        return (
          <Suspense fallback={<div>Loading...</div>}>
            <LazyComponent/>
          </Suspense>
        );
      }
      

    【讨论】:

    • 感谢您的回答。我按照您的建议进行了更改,没有更多错误。但是现在,当我单击路线而不是看到组件时,我看到的是“React.lazy(() => import($./HomeB))”而不是组件。
    • 对不起!看起来我忘了在 React.lazy 周围有 {} .. 它被当作字符串对待。添加 {},我现在遇到错误。你能看看吗?谢谢codesandbox.io/s/3rv3yn0p5p
    • 检查答案的更新,顺便说一下,用{} 包装它不会使它成为一个反应元素,你需要使用 JSX 这只是@987654324 的语法糖@
    • 我建议使用 Routerender 属性,而不是 component,因为组件调用 React.createElement 并且如果您在其中放置内联函数,它将导致重新渲染。您可以在此处查看更多信息:reacttraining.com/react-router/web/api/Route/component
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 2018-07-23
    • 2021-04-03
    • 1970-01-01
    • 2020-10-15
    相关资源
    最近更新 更多