@orca-fe/antd-plus
Version:
Transformer Container
83 lines (80 loc) • 2.96 kB
JavaScript
import { useMemoizedFn } from 'ahooks';
import { cloneElement, isValidElement, useContext, useMemo } from 'react';
import FormItemMapping from "./FormItemMapping";
import { PassPropsContext } from "./PassPropsElement";
// 前缀,尽量避免属性冲突
import { Fragment as _Fragment } from "react/jsx-runtime";
import { jsx as _jsx } from "react/jsx-runtime";
var triggerPrefix = 'form_item_mapping_trigger_prefix';
// 将 props 上的属性转换为对象
var ObjectValueTransfer = props => {
var valueMapping = props.valueMapping,
children = props.children,
_props$trigger = props.trigger,
trigger = _props$trigger === void 0 ? 'onChange' : _props$trigger,
_props$valuePropName = props.valuePropName,
valuePropName = _props$valuePropName === void 0 ? 'value' : _props$valuePropName;
var propsFromParent = useContext(PassPropsContext);
// 从 propsFromParent 中获取属性
var value = useMemo(() => {
var value = {};
Object.keys(valueMapping).forEach(key => {
// eslint-disable-next-line react/destructuring-assignment
value[key] = propsFromParent[key];
});
return value;
}, [propsFromParent, valueMapping]);
var handleChange = useMemoizedFn(v => {
var getValue = key => {
if (!!v && typeof v === 'object') {
return v[key];
}
return undefined;
};
Object.keys(valueMapping).forEach(key => {
var oldValue = value[key];
var newValue = getValue(key);
var fn = propsFromParent[`${triggerPrefix}_${key}`];
if (oldValue !== newValue && typeof fn === 'function') {
fn(newValue);
}
});
if ( /*#__PURE__*/isValidElement(children)) {
var _children$props;
var originOnChange = (_children$props = children.props) === null || _children$props === void 0 ? void 0 : _children$props[trigger];
if (typeof originOnChange === 'function') originOnChange(v);
}
});
return /*#__PURE__*/isValidElement(children) ? /*#__PURE__*/cloneElement(children, {
[valuePropName]: value,
[trigger]: handleChange
}) : /*#__PURE__*/_jsx(_Fragment, {
children: null
});
};
export function FormItemMappingValue(props) {
var valueMapping = props.valueMapping,
children = props.children,
valuePropName = props.valuePropName,
trigger = props.trigger;
// 根据 valueMapping 自动生成事件
var triggerMapping = useMemo(() => {
var triggerMapping = {};
Object.keys(valueMapping).forEach(key => {
triggerMapping[`${triggerPrefix}_${key}`] = valueMapping[key];
});
return triggerMapping;
}, [valueMapping]);
return /*#__PURE__*/_jsx(FormItemMapping, {
valueMapping: valueMapping,
triggerMapping: triggerMapping,
inject: false,
children: /*#__PURE__*/_jsx(ObjectValueTransfer, {
valueMapping: valueMapping,
trigger: trigger,
valuePropName: valuePropName,
children: children
})
});
}
export default FormItemMappingValue;