UNPKG

@schema-render/core-react

Version:

Through a set of simple JSON Schema, efficiently build a set of forms.

149 lines (148 loc) 5.85 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, /** * 表单 value 受控与非受控模式支持 * 需要考虑【多渲染器内部 onChange 初始化值】场景,参考 952 调试文档 * @param props 内核参数 */ "default", { enumerable: true, get: function() { return useCoreValue; } }); var _react = require("react"); var _base = require("../utils/base"); var _checking = require("../utils/checking"); var _misc = require("../utils/misc"); var _tinyLodash = require("../utils/tinyLodash"); var _useForceUpdate = /*#__PURE__*/ _interop_require_default(require("./useForceUpdate")); var _useMemoizedFn = /*#__PURE__*/ _interop_require_default(require("./useMemoizedFn")); var _useUnmountedRef = /*#__PURE__*/ _interop_require_default(require("./useUnmountedRef")); function _define_property(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _object_spread(target) { for(var i = 1; i < arguments.length; i++){ var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === "function") { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function(key) { _define_property(target, key, source[key]); }); } return target; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function(sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _object_spread_props(target, source) { source = source != null ? source : {}; if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function(key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function useCoreValue(props) { var _props_defaultValue; var valueRef = (0, _react.useRef)((_props_defaultValue = props.defaultValue) !== null && _props_defaultValue !== void 0 ? _props_defaultValue : {}); var isUnmountedRef = (0, _useUnmountedRef.default)(); var forceUpdate = (0, _useForceUpdate.default)().forceUpdate; // 是否受控模式,存在 value 字段即为受控模式 var isControlled = (0, _base.hasOwnProperty)(props, 'value'); if (isControlled) { var _props_value; valueRef.current = (_props_value = props.value) !== null && _props_value !== void 0 ? _props_value : {}; } // 处理回调事件 var handleChange = (0, _useMemoizedFn.default)(function(nextValue, event) { // 实例没有卸载时才可触发 “onChange” 事件 if (!isUnmountedRef.current) { var _props_watch, // 单个表单项 change 事件 _props_onItemChange, // 整个表单数据的 change 事件 _props_onChange; var sPath = (0, _misc.stringifyPath)(event.path); var eventInfo = _object_spread_props(_object_spread({}, event), { sPath: sPath }); var matchedWatch = (_props_watch = props.watch) === null || _props_watch === void 0 ? void 0 : _props_watch[sPath]; // watch 监听模式 if ((0, _checking.isFunction)(matchedWatch)) { matchedWatch(nextValue, eventInfo); } /** * React 18 多个子渲染器 useEffect 同时触发 onChange * 渲染流程不会通过应用层父组件重渲染来先更新 valueRef 的值 * 故这里需要内部更新赋值 */ valueRef.current = nextValue; // 非受控模式下内部更新,受控模式下由应用层父组件触发更新 if (!isControlled) { forceUpdate(); } (_props_onItemChange = props.onItemChange) === null || _props_onItemChange === void 0 ? void 0 : _props_onItemChange.call(props, eventInfo); (_props_onChange = props.onChange) === null || _props_onChange === void 0 ? void 0 : _props_onChange.call(props, nextValue, eventInfo); } }); // 使 onChange 不可变 var onChange = (0, _useMemoizedFn.default)(function(event) { var nextValue = (0, _tinyLodash.set)(_object_spread({}, valueRef.current), event.path, event.value); handleChange(nextValue, event); }); // 获取表单数据 var getValue = (0, _useMemoizedFn.default)(function() { return valueRef.current; }); // 设置表单数据 var setValue = (0, _useMemoizedFn.default)(function(nextValue) { handleChange(nextValue, { path: [], value: undefined }); }); // 重置表单数据 var resetValue = (0, _useMemoizedFn.default)(function() { setValue({}); }); return { value: valueRef.current, valueRef: valueRef, onChange: onChange, getValue: getValue, setValue: setValue, resetValue: resetValue }; }