import * as React from 'react';
import type { IHocBaseComponentsOptions } from './types';
import isFunction from 'lodash/isFunction';
export function HocBaseComponents(
BaseComponent,
options: IHocBaseComponentsOptions,
) {
const { props, plugins = [], ref, dataName } = options;
const baseComponentRef = React.useRef();
// 初始化 expandProps 对象,包含 props、context 和 BaseComponent
let expandProps = {
props: { ...props },
context: {},
BaseComponent,
};
// 如果 ref 存在,将 ref 设置到 props 中,此操作需要提前,避免插件中获取不到 ref
if (ref) {
expandProps.props.ref = ref;
}
// 遍历插件数组,对每个插件执行处理函数
for (const handleFun of plugins) {
// 执行插件处理函数,获取返回的 props、context 和 render
const {
props: pluginMergedProps,
context,
render,
} = handleFun(expandProps.props, expandProps.context);
// 如果 render 是一个函数且 baseComponentRef.current 不存在
if (isFunction(render) && !baseComponentRef.current) {
const { BaseComponent: UpperBaseComponent } = expandProps;
// 将 expandProps.BaseComponent 设置为一个新的函数组件
expandProps.BaseComponent = React.forwardRef(
(baseComponentProps: any, upperRef) => {
// 将 baseComponentProps 和 ref 传递给 render 函数,获取新的 props
// React.forwardRef 也具备此逻辑,需要验证下面的逻辑是否有必要
if (
typeof baseComponentProps === 'object' &&
baseComponentProps &&
typeof upperRef === 'object' &&
upperRef
) {
return render(
{
...baseComponentProps,
ref: upperRef,
},
UpperBaseComponent,
);
}
return render(baseComponentProps, UpperBaseComponent);
},
);
}
// 更新 expandProps 对象,合并新的 props 和 context
expandProps = {
...expandProps,
props: pluginMergedProps,
context,
};
}
baseComponentRef.current =
baseComponentRef.current ?? expandProps.BaseComponent;
const ExpandBaseComponent = baseComponentRef.current;
if (dataName) {
expandProps.props['data-name'] = dataName;
}
const eProps = { ...expandProps.props };
if (baseComponentRef.current) {
return ;
}
return ;
}