1. import React, { Component, lazy, Suspense } from 'react'
    2. const About = lazy(() => import('./About.jsx'));
    3. //lazy是一个方法,它封装了“动态加载的过程”
    4. //About是一个React组件,但它并不能被渲染,它只是一个“动态加载过程”的封装。它在要被渲染的时候就会去加载真正的About组件
    5. export default class IndexPage extends Component {
    6. state = {
    7. hasError: false
    8. }
    9. //Error boundaries,中文意为错误边界。我们希望部分UI的错误不会导致整个程序的崩溃,以及希望在错误发生时能够显示对应的UI
    10. //Error boundaries方法一
    11. componentDidCatch() {
    12. //如果 render() 函数抛出错误,就会触发componentDidCatch,也就是当组件加载失败,就会使用该函数
    13. this.setState({ hasError: true })
    14. }
    15. //Error boundaries方法二
    16. static getDerivedStateFromError() {
    17. //getDerivedStateFromError为静态函数
    18. //运行时间点:子组件被渲染发生错误之后且也页面更新之前
    19. return {
    20. hasError: true
    21. }
    22. // 返回的值会自动 调用setState,将值和state合并
    23. }
    24. render() {
    25. if (this.state.hasError) {
    26. return (
    27. <div>error</div>
    28. );
    29. }
    30. return (
    31. <div>
    32. <Suspense fallback={<div>loading...</div>}>
    33. <About></About>
    34. </Suspense>
    35. {/*
    36. lazy必须配合Suspense使用,Suspense是展示待加载状态中的组件,fallback属性需要传入一段jsx
    37. Suspense需要把异步导入的组件包起来
    38. */}
    39. </div>
    40. );
    41. }
    42. }