React项目需要根据后端返回加载不同的组件。
异步组件加载
AsyncComponent.js
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;
}
组件列表加载
component.js
import React from 'react';
import asyncComponent from './AsyncComponent'
export default class componentList extends React.Component{
constructor(props) {
super(props);
this.state = {
components: null
};
}
async componentDidMount() {
var items=[]
var names=['firstComponent','secondComponent']//ajax后端提供加载组件名称
var context = require.context('../components', true, /\.jsx$/);
console.log(context.keys());
for(var i=0;i<names.length;i++)
{
let tempName='./'+names[i]+".jsx"
let TempCom=asyncComponent(()=>context(tempName))
items.push(<TempCom />)
}
this.setState({
components: items
});
}
render() {
return (
<div className="detailWried">
{this.state.components}
</div>
);
}
}
使用require.context 加载变量组件名
由于import
是静态执行,所以不能使用表达式和变量,这些只有在运行时才能得到结果的语法结构。
// 报错
import { 'f' + 'oo' } from 'my_module';
// 报错
let module = 'my_module';
import { foo } from module;
// 报错
if (x === 1) {
import { foo } from 'module1';
} else {
import { foo } from 'module2';
}
上面三种写法都会报错,因为它们用到了表达式、变量和if
结构。在静态分析阶段,这些语法都是没法得到值的。