博主头像
<CodeEra />

心存敬畏 行有所止

React中的LazyLoad(懒加载)学习笔记

1. 什么是懒加载?

  • 定义:懒加载是一种延迟加载技术,只有在需要时才加载资源(如组件、图片等)。
  • 作用

    • 减少初始加载时间,提升页面性能。
    • 按需加载资源,减少带宽消耗。

2. React中的懒加载

  • React.lazy

    • React 16.6引入的特性,用于动态加载组件。
    • 语法:

      const MyComponent = React.lazy(() => import('./MyComponent'));
    • 说明:React.lazy接受一个函数,返回一个动态import()的Promise。
  • Suspense

    • React.lazy配合使用,用于处理加载中的状态。
    • 语法:

      <React.Suspense fallback={<div>Loading...</div>}>
        <MyComponent />
      </React.Suspense>
    • 说明:fallback属性用于指定加载中的占位内容。

3. 使用场景

  • 路由懒加载

    • 将路由组件按需加载,减少初始包体积。
    • 示例:

      const Home = React.lazy(() => import('./Home'));
      const About = React.lazy(() => import('./About'));
      
      function App() {
        return (
          <Router>
            <React.Suspense fallback={<div>Loading...</div>}>
              <Switch>
                <Route path="/home" component={Home} />
                <Route path="/about" component={About} />
              </Switch>
            </React.Suspense>
          </Router>
        );
      }
  • 图片懒加载

    • 使用第三方库(如react-lazyload)实现图片懒加载。
    • 示例:

      import LazyLoad from 'react-lazyload';
      
      function MyComponent() {
        return (
          <div>
            <LazyLoad height={200} offset={100}>
              <img src="image.jpg" alt="Lazy Loaded Image" />
            </LazyLoad>
          </div>
        );
      }

4. 实现原理

  • React.lazy

    • 基于动态import()语法,返回一个Promise。
    • React在组件渲染时才会触发加载。
  • Suspense

    • 在组件加载完成前,显示fallback内容。
    • 加载完成后,替换为实际组件。

5. 代码示例

  • 组件懒加载

    import React, { Suspense } from 'react';
    
    const LazyComponent = React.lazy(() => import('./LazyComponent'));
    
    function App() {
      return (
        <div>
          <Suspense fallback={<div>Loading...</div>}>
            <LazyComponent />
          </Suspense>
        </div>
      );
    }
  • 路由懒加载

    import React, { Suspense } from 'react';
    import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
    
    const Home = React.lazy(() => import('./Home'));
    const About = React.lazy(() => import('./About'));
    
    function App() {
      return (
        <Router>
          <Suspense fallback={<div>Loading...</div>}>
            <Switch>
              <Route path="/home" component={Home} />
              <Route path="/about" component={About} />
            </Switch>
          </Suspense>
        </Router>
      );
    }

6. 注意事项

  • 错误边界

    • 使用ErrorBoundary捕获懒加载组件中的错误。
    • 示例:

      class ErrorBoundary extends React.Component {
        state = { hasError: false };
      
        static getDerivedStateFromError(error) {
          return { hasError: true };
        }
      
        render() {
          if (this.state.hasError) {
            return <div>Error occurred!</div>;
          }
          return this.props.children;
        }
      }
      
      <ErrorBoundary>
        <Suspense fallback={<div>Loading...</div>}>
          <LazyComponent />
        </Suspense>
      </ErrorBoundary>
  • 性能优化

    • 避免过度使用懒加载,增加请求数量。
    • 结合代码分割(Code Splitting)优化打包体积。

7. 总结

  • React.lazySuspense是React中实现懒加载的核心工具。
  • 适用于路由、组件、图片等资源的按需加载。
  • 通过懒加载,可以显著提升页面性能,优化用户体验。
  • 注意结合错误边界和性能优化,确保应用的稳定性和效率。
发表新评论