React 延迟组件未加载到动态路由上

jhi*_*jhi 6 lazy-loading reactjs react-router react-suspense

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

我已经搜索了关于在路由上使用 lazy 的信息,但我还没有看到有人在动态(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>
 )
}
Run Code Online (Sandbox Code Playgroud)

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

ruo*_* li 7

我认为,使用反应悬念或懒惰没有问题。只是Switch以错误的方式使用。

正如反应路由器文档所说:

a 的所有子元素<Switch>都应该是<Route><Redirect>元素。只会呈现与当前位置匹配的第一个孩子。

因此,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>
 )
}

Run Code Online (Sandbox Code Playgroud)

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


jhi*_*jhi 2

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

我包含了我的包的publicPath 。

我将其添加到我的 webpack.config.js 中

output: {
        publicPath: '/',
      },
Run Code Online (Sandbox Code Playgroud)

上次它不起作用的问题是我只是刷新页面知道已经安装了 hotmodule 但它不会更新我的配置。

所以重新启动服务器后我看到了这一行

webpack 输出由(我声明的 publicPath)提供

尽管我在这个问题上花费了比我应该花的时间更多的时间。现在正在运行,感谢所有评论。