Merge branch feat/support-function-component into release/1.0.0

Title: feat: 支持 FunctionComponent 选中 

支持 FunctionComponent 在编辑器中选中

Link: https://code.aone.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/codereview/3887241
This commit is contained in:
wuyue.xht 2020-10-19 17:06:02 +08:00
commit 0d7c02b2ba
2 changed files with 10 additions and 9 deletions

View File

@ -1,6 +1,6 @@
import { ComponentType, forwardRef, createElement } from 'react';
import { ComponentType, forwardRef, createElement, FunctionComponent } from 'react';
import { NpmInfo } from '@ali/lowcode-types';
import { isReactComponent } from './is-react';
import { isReactComponent, acceptsRef, wrapReactClass } from './is-react';
import { isESModule } from './is-es-module';
interface LibraryMap {
@ -80,13 +80,14 @@ export function buildComponents(libraryMap: LibraryMap, componentsMap: { [compon
};
Object.keys(componentsMap).forEach((componentName) => {
let component = componentsMap[componentName];
if (isReactComponent(component)) {
components[componentName] = component;
} else {
if (!isReactComponent(component)) {
component = findComponent(libraryMap, componentName, component);
if (component) {
components[componentName] = component;
}
if (component) {
if (!acceptsRef(component)) {
component = wrapReactClass(component as FunctionComponent);
}
components[componentName] = component;
}
});
return components;

View File

@ -1,4 +1,4 @@
import { ComponentClass, Component, FunctionComponent, ComponentType } from 'react';
import { ComponentClass, Component, FunctionComponent, ComponentType, createElement } from 'react';
const hasSymbol = typeof Symbol === 'function' && Symbol.for;
const REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;
@ -22,7 +22,7 @@ export function isReactComponent(obj: any): obj is ComponentType<any> {
export function wrapReactClass(view: FunctionComponent) {
const ViewComponentClass = class extends Component {
render() {
return view(this.props);
return createElement(view, this.props);
}
} as any;
ViewComponentClass.displayName = view.displayName;