我试图通过实现 AsyncCompoment 类来延迟加载 React 中的路由,如此处所述Code Splitting in Create React App。下面是教程中的 es6 asyncComponent 函数:
import React, { Component } from "react";
export default function asyncComponent(importComponent) {
class AsyncComponent extends Component {
constructor(props) {
super(props);
this.state = {
component: null
};
}
async componentDidMount() {
const { default: component } = await importComponent();
this.setState({
component: component
});
}
render() {
const C = this.state.component;
return C ? <C {...this.props} /> : null;
}
}
return AsyncComponent;
}
我已经在 typescript 中编写了这个函数,并且可以确认组件确实是延迟加载的。我面临的问题是它们没有被渲染。我能够确定组件对象在 componentDidMount 挂钩中始终未定义:
//AsyncComponent.tsx
async componentDidMount() {
const { default: component } = await importComponent();
this.setState({
component: component
});
}
从 importComponent 函数返回的对象具有以下属性:
{
MyComponent: class MyComponent: f,
__esModule: true
}
我修改了 componentDidMount 方法以获取该对象的第一个属性,即 MyComponent 类。在此更改之后,我的项目现在延迟加载组件并正确渲染它们。
async componentDidMount() {
const component = await importComponent();
this.setState({
component: component[Object.keys(component)[0]]
});
}
我最好的猜测是我没有在打字稿中正确写下这一行:
const { default: component } = await importComponent();
我这样调用 asyncComponent 方法:
const MyComponent = asyncComponent(()=>import(./components/MyComponent));
有人知道如何在打字稿中实现 AsyncComponent 吗?我不确定简单地获取 esModule 对象上的 0 索引是否是正确的方法。