UNPKG

@orca-fe/antd-plus

Version:
83 lines (80 loc) 2.96 kB
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;