当前位置:首页 > React

react如何实现组件异步加载

2026-01-25 09:17:42React

实现 React 组件异步加载的方法

使用 React.lazy 和 Suspense

React.lazy 是 React 官方提供的异步加载组件的方法,需要与 Suspense 配合使用。React.lazy 接受一个返回动态 import() 的函数,返回一个 Promise。

import React, { Suspense } from 'react';

const AsyncComponent = React.lazy(() => import('./AsyncComponent'));

function App() {
  return (
    <div>
      <Suspense fallback={<div>Loading...</div>}>
        <AsyncComponent />
      </Suspense>
    </div>
  );
}

Suspense 的 fallback 属性用于在组件加载期间显示加载状态。

自定义高阶组件

可以创建一个高阶组件(HOC)来封装异步加载逻辑,适用于需要更复杂控制的情况。

import React, { useState, useEffect } from 'react';

function asyncComponent(importComponent) {
  return function(props) {
    const [Component, setComponent] = useState(null);

    useEffect(() => {
      importComponent().then(cmp => {
        setComponent(cmp.default || cmp);
      });
    }, []);

    return Component ? <Component {...props} /> : <div>Loading...</div>;
  };
}

const AsyncComponent = asyncComponent(() => import('./AsyncComponent'));

结合路由的异步加载

在 React Router 中实现路由级别的异步加载,可以优化页面切换性能。

import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import React, { Suspense } from 'react';

const Home = React.lazy(() => import('./routes/Home'));
const About = React.lazy(() => import('./routes/About'));

function App() {
  return (
    <Router>
      <Suspense fallback={<div>Loading...</div>}>
        <Switch>
          <Route exact path="/" component={Home} />
          <Route path="/about" component={About} />
        </Switch>
      </Suspense>
    </Router>
  );
}

错误边界处理

异步加载可能失败,可以使用错误边界(Error Boundary)来捕获并处理错误。

class ErrorBoundary extends React.Component {
  state = { hasError: false };

  static getDerivedStateFromError(error) {
    return { hasError: true };
  }

  componentDidCatch(error, info) {
    console.error(error, info);
  }

  render() {
    if (this.state.hasError) {
      return <h1>Something went wrong.</h1>;
    }
    return this.props.children;
  }
}

function App() {
  return (
    <ErrorBoundary>
      <Suspense fallback={<div>Loading...</div>}>
        <AsyncComponent />
      </Suspense>
    </ErrorBoundary>
  );
}

动态导入的命名导出

如果组件是命名导出而非默认导出,需要稍微调整导入方式。

const AsyncComponent = React.lazy(() =>
  import('./AsyncComponent').then(module => ({ default: module.AsyncComponent }))
);

预加载策略

可以在用户可能访问组件前预先加载,例如在鼠标悬停时触发加载。

react如何实现组件异步加载

const AsyncComponent = React.lazy(() => import('./AsyncComponent'));

function PreloadComponent() {
  const [loaded, setLoaded] = useState(false);

  const preload = () => {
    import('./AsyncComponent');
    setLoaded(true);
  };

  return (
    <div onMouseEnter={preload}>
      {loaded ? (
        <Suspense fallback={<div>Loading...</div>}>
          <AsyncComponent />
        </Suspense>
      ) : (
        <div>Hover to load</div>
      )}
    </div>
  );
}

分享给朋友:

相关文章

Vue组件实现方法

Vue组件实现方法

Vue组件的基本实现方法 Vue组件是Vue.js的核心概念之一,用于构建可复用的UI模块。以下是Vue组件的几种常见实现方式: 单文件组件(SFC) 使用.vue文件格式,将模板、脚本和样式封装在…

vue实现倒计时组件

vue实现倒计时组件

Vue 倒计时组件实现 核心思路 通过 setInterval 或 setTimeout 实现时间递减,结合 Vue 的响应式数据更新 UI。需注意组件销毁时清除定时器。 基础实现方案 模板部分…

h5如何实现定位

h5如何实现定位

使用HTML5 Geolocation API HTML5提供了Geolocation API,可以获取用户的地理位置信息。通过navigator.geolocation对象实现,支持获取经纬度、海拔…

vue如何实现mvvm

vue如何实现mvvm

Vue 的 MVVM 实现原理 Vue 通过数据绑定和响应式系统实现 MVVM(Model-View-ViewModel)模式。其核心在于将数据模型(Model)与视图(View)通过 ViewMod…

vue如何实现id

vue如何实现id

Vue 中实现 ID 的方法 在 Vue 中,可以通过多种方式为元素或组件分配唯一的 ID。以下是几种常见的方法: 使用 v-bind 绑定 ID 通过 v-bind 动态绑定 ID,可以在模板中直…

vue如何实现高亮

vue如何实现高亮

实现文本高亮的方法 在Vue中实现文本高亮通常可以通过以下几种方式完成: 使用v-html指令结合字符串替换 通过将需要高亮的文本部分替换为HTML标签(如<span class="highl…