lazy内置方法 Suspense内置组件
-
lazy是React提供的懒(动态)加载组件的方法,
React.lazy()
-
能减少打包体积、延迟加载首屏不需要渲染的组件
-
依赖内置组件Suspense:给lazy加上loading指示器组件的一个容器组件
-
Suspense目前只和lazy配合实现组件等待加载指示器的功能
-
React.lazy 接受一个函数,这个函数需要动态调用 import()。它必须返回一个 Promise,该 Promise 需要 resolve 一个 default export 的 React 组件。所以要用类返回render而不是函数
-
index.jsx
import Loading from './loading'
const MyMain = React.lazy(() => import('./main.jsx'))
function App() {return (<div>{/* 注意 fallback这里是组件 */}<React.Suspense fallback={<Loading />}><MyMain /></React.Suspense></div>)
}ReactDOM.render(<App />,document.getElementById('app')
)
- main.jsx
// export function Main() {
// return (
// <div>
// 显示内容
// </div>
// )
// }
// React.lazy 接受一个函数,这个函数需要动态调用 import()。
// 它必须返回一个 Promise,该 Promise 需要 resolve 一个 default export 的 React 组件。
export default class Main extends React.Component {render() {return (<div>显示内容</div>)}
}
- Loading.jsx
export default function Loading() {return (<div><h1>Loading...</h1><h1>Loading...</h1><h1>Loading...</h1></div>)
}
路由懒加载
yarn add react-router react-router-dom
- 本地调试时,path和文件名同名,会变成访问文件
- index.jsx
import Loading from './loading'
import React, { lazy, Suspense } from 'react'
import { BrowserRouter } from 'react-router-dom'
import { Switch, Route } from 'react-router'
const MyMain = lazy(() => import('./main.jsx'))
function App() {return (<div>{/* 注意 fallback这里是组件 */}<Suspense fallback={<Loading />}><div><MyMain /><Switch><Route path="/mypage1" component={lazy(() => import('./page1.jsx'))} /><Route path="/mypage2" component={lazy(() => import('./page2.jsx'))} /></Switch></div></Suspense></div>)
}// 路由懒加载
ReactDOM.render(<React.StrictMode><BrowserRouter><App /></BrowserRouter></React.StrictMode>,document.getElementById('app')
);