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 ; }