【问题标题】:React lazy components not loaded on dynamic routes反应未在动态路由上加载的惰性组件
【发布时间】:2019-10-27 18:48:40
【问题描述】:

我在动态路由上使用了 reactlazy 和 suspense,但不知何故我无法渲染延迟加载的组件。

我已经搜索过惰性路由的使用,但我没有看到有人在动态(localhost:8080/dynamic/dynamic)路由上使用它.

在动态路由上加载组件对我有用,如果我有静态路由,延迟加载也可以,但是当我尝试将两者结合时,组件不会加载。

这是我所做的一个例子,

import Loader from './path/toFile';
import Home from './path/toFile';
const LazyLoadedComponent = lazy(() => import('./path/toFile'));

const App = () => {
 return(
  <Router>
     <Switch>

        // Home has multiple views controlled by buttons
        // A view contains selections with corresponding id
       <Route exact path="/:viewType?" component={Home} /> 

       // this component doesn't load when I select something which links me to this dynamic route.
       <Suspense fallback={Loader}>
         <Route path="/viewType/:selectionId" component={LazyLoadedComponent} />
       </Suspense>

     </Switch>
   </Router>
 )
}

我只想在我去那条路线后加载我的组件。 但结果是它加载了 Home 但是当我从选择中选择一个时,它只显示 index.html 和空白 我没有看到任何错误产生。

【问题讨论】:

    标签: reactjs react-router lazy-loading react-suspense


    【解决方案1】:

    我认为,使用 react Suspense 或 lazy 没有问题。只是以错误的方式使用Switch

    正如react router doc 所说:

    &lt;Switch&gt; 的所有子元素都应该是 &lt;Route&gt;&lt;Redirect&gt; 元素。只有第一个匹配当前位置的子节点才会被渲染。

    所以,Switch 组件可能无法识别被 Suspense 组件包裹的 Route。

    例如:

    import Loader from './path/toFile';
    import Home from './path/toFile';
    const LazyLoadedComponent = lazy(() => import('./path/toFile'));
    
    const App = () => {
     return(
       <Router>
         <Suspense fallback={Loader}>
           <Switch>
             <Route exact path="/:viewType?" component={Home} /> 
             <Route path="/viewType/:selectionId" component={LazyLoadedComponent} />
           </Switch>
         </Suspense>
       </Router>
     )
    }
    
    

    以下是代码沙箱中的示例:https://codesandbox.io/s/async-react-router-v4-w-suspense-8p1t6

    【讨论】:

    • 从您的答案中更新blockquote。你错过了一些标签。
    • 感谢您的建议,这实际上是我的代码的当前结构,在此之后它会产生错误 404 无法加载夹头(0.js),因为它在错误的位置 (localhost:8080/viewType/0.js) 被调用,它应该只是 (localhost:8080/0.js) 或者我需要配置我的 webpack 以在自定义位置生成块文件。我正在尝试为此找到解决方案,但我知道我的文件存在,因为我可以使用后一个链接访问 0.js 。如果您有解决方案,我将很高兴。再次感谢。
    【解决方案2】:

    我已经找到了解决方案..或者在我的情况下。

    我为我的捆绑包添加了publicPath

    我在我的 webpack.config.js 中添加了这个

    output: {
            publicPath: '/',
          },
    

    上次它不起作用的问题是我只是在刷新页面时知道已安装 hotmodule,但它并没有更新我的配置。

    所以重启服务器后我看到了这条线

    webpack 输出来自(我声明的 publicPath)

    尽管我在这个问题上花费的时间超出了我应有的时间。它现在正在工作,感谢所有 cmets。

    【讨论】:

    • 这也为我解决了。很有意思。我将进一步调查以确保这没有缺点,但似乎远没有其他选项复杂。
    【解决方案3】:

    试试this

     <Suspense fallback={Loader}>
       <Switch>
         <Route path="/viewType/:selectionId" />
             <LazyLoadedComponent />
         </Route>
       </Switch>
     </Suspense>
    

    【讨论】:

    • 您好,感谢您的建议,我已经尝试过这个并产生了相同的结果,我认为问题是块文件,因为它被加载到错误的位置。您链接的文章也很有帮助,尤其是动态导入,但它都产生了与我之前的代码相同的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 2020-09-22
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多