经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » React » 查看文章
关于React动态加载路由处理的相关问题
来源:jb51  时间:2019/1/8 9:18:25  对本文有异议

前言

相信很多人都遇到过想在React项目中动态加载路由这种问题,接下来我们逐步实现。

引入必要的依赖

  1. import React from 'react'
  2. import { Router, Route, IndexRoute, hashHistory } from 'react-router'

接下来创建一个component函数

目的就是为了变为router的component实现异步加载。

  1. // 异步按需加载component
  2. function asyncComponent(getComponent) {
  3. return class AsyncComponent extends React.Component {
  4. static Component = null;
  5. state = { Component: AsyncComponent.Component };
  6. componentDidMount() {
  7. if (!this.state.Component) {
  8. getComponent().then(({default: Component}) => {
  9. AsyncComponent.Component = Component
  10. this.setState({ Component })
  11. })
  12. }
  13. }
  14. //组件将被卸载
  15. componentWillUnmount(){
  16. //重写组件的setState方法,直接返回空
  17. this.setState = (state,callback)=>{
  18. return;
  19. };
  20. }
  21. render() {
  22. const { Component } = this.state
  23. if (Component) {
  24. return <Component {...this.props} />
  25. }
  26. return null
  27. }
  28. }
  29. }

在此说明componentWillUnmount钩子是为了解决Can only update a mounted or mounting component的这个问题,原因是当离开页面以后,组件已经被卸载,执行setState时无法找到渲染组件。

接下来实现本地文件路径的传入

  1. function load(component) {
  2. return import(`./routes/${component}`)
  3. }

将已知地址路径传递到一个函数并把这个函数作为参数传递到 asyncComponent中这样asyncComponent就能接收到这个路由的地址了,然后我们要做的就是将这个asyncComponent函数带入到router中。

  1. <Router history={hashHistory}>
  2. <Route name="home" breadcrumbName="首页" path="/" component={MainLayout}>
  3. <IndexRoute name="undefined" breadcrumbName="未定义" component={() => <div>未定义</div>}/>
  4. <Route name="Development" breadcrumbName="施工中" path="Development" component={DevelopmentPage}/>
  5. <Route breadcrumbName="个人助理" path="CustomerWorkTodo" component={({children}) => <div className="box">{children}</div>}>
  6. <Route name="Agency" breadcrumbName="待办事项" path="Agency" component={asyncComponent(() => load('GlobalNotification/CustomerWorkAssistantTodo/CustomerAgencyMatter'))}/>
  7. <Route name="Already" breadcrumbName="已办事项" path="Already" component={asyncComponent(() => load('GlobalNotification/CustomerWorkAssistantTodo/CustomerAlreadyMatter'))}/>
  8. <Route name="SystemMessage" breadcrumbName="系统消息" path="SystemMessage/:data" component={asyncComponent(() => load('GlobalNotification/SystemMessage/SystemMessage'))}/>
  9. <Route name="SystemMessagePer" breadcrumbName="系统消息详情" path="SystemMessagePer/:data" component={asyncComponent(() => load('GlobalNotification/SystemMessage/SystemMessagePer'))}/>
  10. </Route>
  11. </Router>
  12. </Router>

从代码中可以看出已经实现了router 的component 的引入,这样自然就可以通过一个循环来实现动态的加载啦!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号