6

我在动态路由上使用了反应惰性和悬念,但不知何故我无法渲染延迟加载的组件。

我已经搜索过惰性路由的使用,但我还没有看到有人在动态(本地主机:8080/动态/动态)路由上使用它。

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

这是我所做的一个例子,

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 空白我没有看到任何错误产生。

4

4 回答 4

7

我认为,使用 react Suspense 或懒惰没有问题。只是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>
 )
}

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

于 2019-06-13T09:36:50.613 回答
2

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

我为我的捆绑包包含了publicPath

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

output: {
        publicPath: '/',
      },

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

所以在重新启动服务器后,我看到了这条线

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

虽然我在这个问题上花费的时间比我应该花的时间多。它现在正在工作,感谢所有评论。

于 2019-06-14T06:24:40.110 回答
1

试试这个

 <Suspense fallback={Loader}>
   <Switch>
     <Route path="/viewType/:selectionId" />
         <LazyLoadedComponent />
     </Route>
   </Switch>
 </Suspense>
于 2019-06-13T09:05:55.300 回答
0

我通过在 webpack.config 中做一些额外的更改来解决它。首先使用弹出配置

npm run eject.

webpack.config.js

path: isEnvProduction
            ? path.resolve(__dirname, "..", "build")
            : undefined,
    
filename: isEnvProduction
            ? "[name].js"
            : isEnvDevelopment && "static/js/bundle.js",
    
chunkFilename: isEnvProduction
            ? "[name].chunk.js"
    
publicPath: "/",
于 2022-01-13T12:13:25.690 回答