react 动态修改路由_升级到 React Router 4 并实现动态加载和模块热替换

这篇文章是升级到Webpack2坑——模块热替换失效页面不自动刷新?的后续。那篇文章主要说明了,升级到 Webpack 2 之后,通过升级webpack-dev-server和react-hot-loader插件,使模块热替换(HMR)再次生效。但后来发现,其实并没有完全生效。

问题

项目中的 Route 使用了System.import(/* webpackChunkName: "example" */ './example.js)来实现模块的动态加载,也就是根据组件打包成多个 bundle,只有在点击到对应的 Route 时,这个 bundle 才会被加载,而不是在打开首页时,加载所有的 bundle。

问题是,当我们修改某个标签页对应的组件时,会发现 HMR 并不是每次都生效。热替换过程会报错(类似[HMR] unexpected require(116) from disposed module 26),并且无法切换标签页了。

根据这篇讨论webpack2 + hot-reload: Not works with System.import,我决定升级 React Router 到v4并且将 System.import() 替换成 import()。

升级到 React Router v4

版本变化:webpack:2.7.0

react-hot-loader: 4.1.2

react:0.14.7  >>> 15.6.2

react-dom:0.14.7  >>> 15.6.2

react-router: 2.5.2 卸载,安装 react-router-dom 4.3.0-rc.3

react和react-dom是顺便升级的,并不强制。主要的升级是 react-router v2到v4。在v4版本中, Web开发只需要安装react-router-dom,参考what's the diff between 'react-router-dom' & 'react-router'?中的回答。

React Router v4变化挺大的。因此看官方文档(点这里)是很有必要的。

动态路由(Dynamic Routing)

React Router从v4开始,不再是静态路由(Static Routing),而变成了动态路由(Dynamic Routing)。前者是我们习惯的用法,一般需要在应用初始化过程中声明路由,这时候页面还没有任何渲染;后者则意味着,路由会随着应用的渲染而发生,而不是一个在运行的应用之外的配置。React Router v4中的任何东西都是一个组件。When we say dynamic routing, we mean routing that takes place as your app is rendering, not in a configuration or convention outside of a running app. That means almost everything is a component in React Router.

一开始看到这部分我还没太明白,直到我意识到,我不再需要在一个Root组件中定义所有的 Route,而是可以在任何组件内部添加一个 Route 时,我才弄懂这个“动态路由”的意思。就跟我们平时使用自定义的组件是一样的,想在哪里渲染,就加到哪里。参照示例Sidebar。You can render a in as many places as you want in your app. It will render along with any other s that also match the URL. So, a sidebar or breadcrumbs or anything else that requires you to render multiple things in multiple places at the same URL is nothing more than multiple s.

嵌套路由(Nested Routing)

v4版本以前,我们可能会用到嵌套路由,尤其是当页面中有导航栏时。比如:

当嵌套的内存路由匹配时,外层路由和内层路由对应的组件都会被渲染出来,而且子组件会通过props.children传递给父组件,也就是子组件会渲染到父组件 render 方法中{this.props.children}所在的位置。

v4版本时,就不需要在 Route 配置的地方嵌套好几个 Route,也不需要使用 this.props.children 指明子组件渲染的位置。只需要在父组件相应的位置添加 Route 即可。就跟嵌套一个 div 一样。const Parent = () => (  

//......    

)

重定向路由

v4去掉 了。要实现重定向可以使用组件。// v3  // v4 } />

//Switch限定只渲染第一个匹配的 Route

  //当以上的path均不匹配时,重定向到'/'

局部刷新/整体刷新

局部刷新

整个页面刷新:window.location.href = '/home'//or

动态加载

修改前:

getComponent={(location, callback) => {    import(/* webpackChunkName: "Settings" */ './Settings.js').then(component => {

callback(null, component.default || component)

})

}}

/>

component={Loadable({    loader: () => import(/* webpackChunkName: "Settings" */ './Settings.js'),    loading:Loading

})}

/>

综上就是升级过程的重点了。至此,动态加载和HMR都没问题了。

作者:Evelynzzz

链接:https://www.jianshu.com/p/25f8cb1d6276

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值