异步加载路由原理

异步加载路由原理基本原理 目录结构 src util asyncRouter js a js b js 组件 a const a gt return lt div gt a lt div gt export default a 组件 b

大家好,我是讯享网,很高兴认识大家。

基本原理

目录结构

 src util asyncRouter.js a.js b.js 

讯享网

组件a

讯享网const a = () => { 
    return ( <div > a </div> ); } export default a 

组件b

const b = () => { 
    return ( <div > b </div> ); } export default b 

asyncRouter.js


讯享网

讯享网 // 将module.default和module整合成统一的数组。 const m = module => module.default || module const esModule = (module) => module.map(m) const asyncRouter = async(comp) => { 
    // 异步请求 const compData = await Promise.all([ comp() ]) // 修复数据结构 const Cmp = esModule(compData) console.log(Cmp) return Cmp } // 异步加载路由模块 asyncRouter(() => import('../a')) asyncRouter(() => import('../b')) export default asyncRouter 

进一步完善成基本的路由助手函数

import { 
   Component} from 'react' // 将module.default和module整合成统一的数组。 const m = module => module.default || module const esModule = (module) => { 
    // 分是否是数组来处理 if(Object.prototype.toString(module) === '[Object array]') { 
    return module.map(m) } return m(module) } function asyncRouter(comp) { 
    // 返回组件类,到路由上注入 return class AsyncRoute extends Component { 
    constructor() { 
    super() this.state = { 
    Cmp: null } } loadData = async() => { 
    // 异步请求 const [compData] = await Promise.all([ comp() ]) // 修复数据结构 const Cmp = esModule(compData) this.setState({ 
    // 更新组件 Cmp }) } componentDidMount() { 
    this.loadData() // 加载数据 } render() { 
    const { 
   Cmp} = this.state return Cmp && <Cmp /> // 返回组件 } } } export default asyncRouter 

index.js加入路由

讯享网import React from "react"; import ReactDOM from "react-dom"; import "./index.css"; import App from "./App"; import reportWebVitals from "./reportWebVitals"; import { 
    BrowserRouter } from "react-router-dom"; ReactDOM.render( <React.StrictMode> <BrowserRouter> <App /> </BrowserRouter> </React.StrictMode>, document.getElementById("root") ); // If you want to start measuring performance in your app, pass a function // to log results (for example: reportWebVitals(console.log)) // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals reportWebVitals(); 

App.js加入导航链接和路由组件组

import logo from './logo.svg'; import './App.css'; import asyncRouter from './utls/asyncRouter' import { 
   Route, Switch, Link} from 'react-router-dom' // 这块还能再抽离出去单独管理。 const a = asyncRouter(() => import('./a')) const b = asyncRouter(() => import('./b')) function App() { 
    return ( <div className="App"> <ul> <li> <Link to='/a'>a</Link> </li> <li> <Link to='/b'>b</Link> </li> </ul> <Switch> <Route path='/a' component={ 
   a} /> <Route path='/b' component={ 
   b} /> </Switch> </div> ); } export default App; 

总结:异步加载路由主要使用了import实时载入以及promise的控制,最后利用高阶函数里面的闭包写法返回类来输出成组件喂给路由的component属性。

小讯
上一篇 2025-02-20 22:49
下一篇 2025-02-26 07:24

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/15087.html