@sheinx/hooks 3.9.16-beta.7 → 3.9.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/components/use-form/use-form.d.ts.map +1 -1
- package/cjs/components/use-form/use-form.js +47 -1
- package/cjs/utils/object.d.ts +23 -0
- package/cjs/utils/object.d.ts.map +1 -1
- package/cjs/utils/object.js +50 -1
- package/esm/components/use-form/use-form.d.ts.map +1 -1
- package/esm/components/use-form/use-form.js +47 -1
- package/esm/utils/object.d.ts +23 -0
- package/esm/utils/object.d.ts.map +1 -1
- package/esm/utils/object.js +49 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-form.d.ts","sourceRoot":"","sources":["use-form.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"use-form.d.ts","sourceRoot":"","sources":["use-form.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AA+BtE,OAAO,EAEL,aAAa,EACb,YAAY,EACZ,gBAAgB,EAGhB,gBAAgB,EAEjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAe,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAI5D,QAAA,MAAM,OAAO;;;;;;;;;wBAmVC;gBAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;gBAAC,WAAW,CAAC,EAAE,OAAO,CAAA;aAAE;8BAjSnB,MAAM;oCAkXD,OAAO,aAAoB,MAAM,IAAI;;6BAf3C,MAAM,KAAK,KAAK,GAAG,SAAS;;oCAdrB,MAAM,EAAE;sCA7UxC,MAAM,GAAG,MAAM,EAAE,WAAU,gBAAgB;qCA6YvB,MAAM,WAAW,gBAAgB;gCA7CzB,MAAM,SAAS,MAAM,UAAU,KAAK;gCAKpC,MAAM,SAAS,MAAM;kCA3JpD,MAAM,0BAAyB,qBAAqB;;;;;;;;oBA+EjD;YAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;YAAC,WAAW,CAAC,EAAE,OAAO,CAAA;SAAE;0BAjSnB,MAAM;gCAkXD,OAAO,aAAoB,MAAM,IAAI;;yBAf3C,MAAM,KAAK,KAAK,GAAG,SAAS;;gCAdrB,MAAM,EAAE;kCA7UxC,MAAM,GAAG,MAAM,EAAE,WAAU,gBAAgB;iCA6YvB,MAAM,WAAW,gBAAgB;4BA7CzB,MAAM,SAAS,MAAM,UAAU,KAAK;4BAKpC,MAAM,SAAS,MAAM;8BA3JpD,MAAM,0BAAyB,qBAAqB;;;CAic9D,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
3
4
|
Object.defineProperty(exports, "__esModule", {
|
|
4
5
|
value: true
|
|
5
6
|
});
|
|
@@ -14,10 +15,10 @@ var _useDefaultValue = require("../../common/use-default-value");
|
|
|
14
15
|
var _formSchemaBuilder = require("./use-form-schema/form-schema-builder");
|
|
15
16
|
var _immer = require("../../utils/immer");
|
|
16
17
|
var _utils = require("../../utils");
|
|
18
|
+
var _validate = require("../../utils/validate");
|
|
17
19
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
18
20
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
19
21
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
20
|
-
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
21
22
|
function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
|
|
22
23
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
23
24
|
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
@@ -26,6 +27,9 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
26
27
|
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
27
28
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
28
29
|
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
30
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
31
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
32
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
29
33
|
var globalKey = '__global__&&@@';
|
|
30
34
|
var SUBMIT_TIMEOUT = 10;
|
|
31
35
|
var RESET_TIMEOUT = 500;
|
|
@@ -115,6 +119,48 @@ var useForm = function useForm(props) {
|
|
|
115
119
|
return validate(key, (0, _utils.deepGet)(context.value, key), context.value, config);
|
|
116
120
|
});
|
|
117
121
|
});
|
|
122
|
+
|
|
123
|
+
// ============ 新增:从 props.rules 推导未挂载字段并独立校验 ============
|
|
124
|
+
// 用于虚拟列表 / 大数据场景:业务方在 <Form rules={{...}}> 里声明的字段,
|
|
125
|
+
// 即便对应的 Form.Item 当前未挂载(虚拟滚动滚出视口),submit 也应校验。
|
|
126
|
+
// 仅在"全量校验"(fields 为空,或 ignoreBind 走 submit 路径)时启用。
|
|
127
|
+
var isFullValidate = !fields || config.ignoreBind;
|
|
128
|
+
if (isFullValidate && (0, _utils.isObject)(rules)) {
|
|
129
|
+
var declared = (0, _utils.collectFormRulePaths)(rules);
|
|
130
|
+
var _iterator = _createForOfIteratorHelper(declared),
|
|
131
|
+
_step;
|
|
132
|
+
try {
|
|
133
|
+
var _loop = function _loop() {
|
|
134
|
+
var item = _step.value;
|
|
135
|
+
// 注意:validateMap[name] 是 Set,unbind 后 Set 可能为空但 key 仍在
|
|
136
|
+
// 必须判断 Set 真有 validate 函数才算"已挂载并已校验",否则要补独立校验
|
|
137
|
+
var mountedSet = context.validateMap[item.name];
|
|
138
|
+
if (mountedSet && mountedSet.size > 0) return 0; // continue
|
|
139
|
+
if (context.ignoreValidateFields.includes(item.name)) return 0; // continue
|
|
140
|
+
var itemValue = (0, _utils.deepGet)(context.value, item.name);
|
|
141
|
+
// 关键:validate 工具函数 *校验失败时是 reject(FormError)*,不是 resolve(error)。
|
|
142
|
+
// 必须用 .catch 把 reject 转成 resolve(err),否则会变成 unhandled rejection
|
|
143
|
+
// 串到外层 Promise.all 把整条提交链炸断(".then() never fires" 问题)
|
|
144
|
+
var p = (0, _validate.validate)(itemValue, context.value, item.rules, {}).then(function () {
|
|
145
|
+
return true;
|
|
146
|
+
}).catch(function (err) {
|
|
147
|
+
var fe = (0, _utils.wrapFormError)(err);
|
|
148
|
+
context.errors[item.name] = fe;
|
|
149
|
+
return fe;
|
|
150
|
+
});
|
|
151
|
+
validates.push([p]);
|
|
152
|
+
},
|
|
153
|
+
_ret;
|
|
154
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
155
|
+
_ret = _loop();
|
|
156
|
+
if (_ret === 0) continue;
|
|
157
|
+
}
|
|
158
|
+
} catch (err) {
|
|
159
|
+
_iterator.e(err);
|
|
160
|
+
} finally {
|
|
161
|
+
_iterator.f();
|
|
162
|
+
}
|
|
163
|
+
}
|
|
118
164
|
if (config.type === 'withValue') {
|
|
119
165
|
var validatorValue = context.value;
|
|
120
166
|
if (fields) {
|
package/cjs/utils/object.d.ts
CHANGED
|
@@ -58,5 +58,28 @@ export declare const getParentKeys: (field: string) => string[];
|
|
|
58
58
|
* @returns 空对象
|
|
59
59
|
*/
|
|
60
60
|
export declare const clearValue: (obj: ObjectType) => any;
|
|
61
|
+
/**
|
|
62
|
+
* 遍历 `<Form rules={...}>` 的嵌套 / 路径式声明,收集所有叶子路径(即每个字段对应的 rule 数组)。
|
|
63
|
+
*
|
|
64
|
+
* 用于让 submit 时把"在 props.rules 中声明、但 Form.Item 当前未挂载"的字段也纳入校验,
|
|
65
|
+
* 解决虚拟列表 / 大数据场景未渲染行被漏校验的问题。
|
|
66
|
+
*
|
|
67
|
+
* 叶子判定:value 是数组(即 FormItemRule 数组)。
|
|
68
|
+
* 路径生成规则:
|
|
69
|
+
* - 字符串 key 直接拼接:`{ user: { name: [...] } }` → `user.name`
|
|
70
|
+
* - 数字 key 转成 bracket:`{ rows: { 0: { name: [...] } } }` → `rows[0].name`
|
|
71
|
+
* - 顶层用字符串路径声明:`{ 'rows[0].name': [...] }` → 原样保留为 `rows[0].name`
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* collectFormRulePaths({ rows: { 0: { name: [requiredRule] }, 1: { name: [requiredRule] } } })
|
|
75
|
+
* // → [
|
|
76
|
+
* // { name: 'rows[0].name', rules: [requiredRule] },
|
|
77
|
+
* // { name: 'rows[1].name', rules: [requiredRule] },
|
|
78
|
+
* // ]
|
|
79
|
+
*/
|
|
80
|
+
export declare const collectFormRulePaths: (rulesObj: ObjectType, parentKey?: string) => Array<{
|
|
81
|
+
name: string;
|
|
82
|
+
rules: any;
|
|
83
|
+
}>;
|
|
61
84
|
export {};
|
|
62
85
|
//# sourceMappingURL=object.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["object.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,UAGvC;AASD,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAGD,eAAO,MAAM,YAAY,QAAS,UAAU,UAG3C,CAAC;AAGF,eAAO,MAAM,SAAS,2CAEZ,UAAU,YACT,WAAW,eAwBrB,CAAC;AAEF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,+DA4BxC;AAED,UAAU,cAAc;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,OAAO,WACV,UAAU,QACZ,MAAM,SACL,GAAG,YACD,cAAc,eAiDxB,CAAC;AAEF,eAAO,MAAM,OAAO,WAAY,UAAU,QAAQ,MAAM,YAAW,WAAW,YAyB7E,CAAC;AAEF,eAAO,MAAM,UAAU,WAAY,UAAU,QAAQ,MAAM,eA0B1D,CAAC;AAEF,eAAO,MAAM,OAAO,WAAY,UAAU,QAAQ,MAAM,YAavD,CAAC;AAEF,eAAO,MAAM,OAAO,QAAS,UAAU,YAItC,CAAC;AAEF,eAAO,MAAM,WAAW,wFAQvB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,QAAS,UAAU,cAAa,MAAM,KAAQ,MAAM,EAoB9E,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,oBAAoB,WAAY,MAAM,GAAG,MAAM,EAAE,aAAa,MAAM,EAAE,KAAG,MAAM,EAmB3F,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,aAAa,UAAW,MAAM,KAAG,MAAM,EAYnD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,UAAU,QAAS,UAAU,KAAG,GAW5C,CAAC"}
|
|
1
|
+
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["object.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,UAGvC;AASD,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAGD,eAAO,MAAM,YAAY,QAAS,UAAU,UAG3C,CAAC;AAGF,eAAO,MAAM,SAAS,2CAEZ,UAAU,YACT,WAAW,eAwBrB,CAAC;AAEF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,+DA4BxC;AAED,UAAU,cAAc;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,OAAO,WACV,UAAU,QACZ,MAAM,SACL,GAAG,YACD,cAAc,eAiDxB,CAAC;AAEF,eAAO,MAAM,OAAO,WAAY,UAAU,QAAQ,MAAM,YAAW,WAAW,YAyB7E,CAAC;AAEF,eAAO,MAAM,UAAU,WAAY,UAAU,QAAQ,MAAM,eA0B1D,CAAC;AAEF,eAAO,MAAM,OAAO,WAAY,UAAU,QAAQ,MAAM,YAavD,CAAC;AAEF,eAAO,MAAM,OAAO,QAAS,UAAU,YAItC,CAAC;AAEF,eAAO,MAAM,WAAW,wFAQvB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,QAAS,UAAU,cAAa,MAAM,KAAQ,MAAM,EAoB9E,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,oBAAoB,WAAY,MAAM,GAAG,MAAM,EAAE,aAAa,MAAM,EAAE,KAAG,MAAM,EAmB3F,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,aAAa,UAAW,MAAM,KAAG,MAAM,EAYnD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,UAAU,QAAS,UAAU,KAAG,GAW5C,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,oBAAoB,aACrB,UAAU,yBAEnB,MAAM;IAAE,MAAM,MAAM,CAAC;IAAC,KAAK,EAAE,GAAG,CAAA;CAAE,CAuBpC,CAAC"}
|
package/cjs/utils/object.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.getParentKeys = exports.getCompleteFieldKeys = exports.getAllKeyPaths = exports.entries = exports.deepSet = exports.deepRemove = exports.deepMerge = exports.deepHas = exports.deepGet = exports.clearValue = void 0;
|
|
6
|
+
exports.getParentKeys = exports.getCompleteFieldKeys = exports.getAllKeyPaths = exports.entries = exports.deepSet = exports.deepRemove = exports.deepMerge = exports.deepHas = exports.deepGet = exports.collectFormRulePaths = exports.clearValue = void 0;
|
|
7
7
|
exports.insertPoint = insertPoint;
|
|
8
8
|
exports.objectValues = void 0;
|
|
9
9
|
exports.pathGenerator = pathGenerator;
|
|
@@ -375,4 +375,53 @@ var clearValue = exports.clearValue = function clearValue(obj) {
|
|
|
375
375
|
}, {});
|
|
376
376
|
}
|
|
377
377
|
return undefined;
|
|
378
|
+
};
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* 遍历 `<Form rules={...}>` 的嵌套 / 路径式声明,收集所有叶子路径(即每个字段对应的 rule 数组)。
|
|
382
|
+
*
|
|
383
|
+
* 用于让 submit 时把"在 props.rules 中声明、但 Form.Item 当前未挂载"的字段也纳入校验,
|
|
384
|
+
* 解决虚拟列表 / 大数据场景未渲染行被漏校验的问题。
|
|
385
|
+
*
|
|
386
|
+
* 叶子判定:value 是数组(即 FormItemRule 数组)。
|
|
387
|
+
* 路径生成规则:
|
|
388
|
+
* - 字符串 key 直接拼接:`{ user: { name: [...] } }` → `user.name`
|
|
389
|
+
* - 数字 key 转成 bracket:`{ rows: { 0: { name: [...] } } }` → `rows[0].name`
|
|
390
|
+
* - 顶层用字符串路径声明:`{ 'rows[0].name': [...] }` → 原样保留为 `rows[0].name`
|
|
391
|
+
*
|
|
392
|
+
* @example
|
|
393
|
+
* collectFormRulePaths({ rows: { 0: { name: [requiredRule] }, 1: { name: [requiredRule] } } })
|
|
394
|
+
* // → [
|
|
395
|
+
* // { name: 'rows[0].name', rules: [requiredRule] },
|
|
396
|
+
* // { name: 'rows[1].name', rules: [requiredRule] },
|
|
397
|
+
* // ]
|
|
398
|
+
*/
|
|
399
|
+
var collectFormRulePaths = exports.collectFormRulePaths = function collectFormRulePaths(rulesObj) {
|
|
400
|
+
var parentKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
|
401
|
+
if (!(0, _is.isObject)(rulesObj)) return [];
|
|
402
|
+
var out = [];
|
|
403
|
+
for (var _i = 0, _Object$keys = Object.keys(rulesObj); _i < _Object$keys.length; _i++) {
|
|
404
|
+
var key = _Object$keys[_i];
|
|
405
|
+
var val = rulesObj[key];
|
|
406
|
+
var currentKey = void 0;
|
|
407
|
+
if (!parentKey) {
|
|
408
|
+
currentKey = key;
|
|
409
|
+
} else if (/^\d+$/.test(key)) {
|
|
410
|
+
// 数字 key 视为数组索引
|
|
411
|
+
currentKey = "".concat(parentKey, "[").concat(key, "]");
|
|
412
|
+
} else {
|
|
413
|
+
currentKey = "".concat(parentKey, ".").concat(key);
|
|
414
|
+
}
|
|
415
|
+
if (Array.isArray(val)) {
|
|
416
|
+
// 叶子:FormItemRule 数组
|
|
417
|
+
out.push({
|
|
418
|
+
name: currentKey,
|
|
419
|
+
rules: val
|
|
420
|
+
});
|
|
421
|
+
} else if ((0, _is.isObject)(val)) {
|
|
422
|
+
// 继续往下钻
|
|
423
|
+
out.push.apply(out, _toConsumableArray(collectFormRulePaths(val, currentKey)));
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
return out;
|
|
378
427
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-form.d.ts","sourceRoot":"","sources":["use-form.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"use-form.d.ts","sourceRoot":"","sources":["use-form.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AA+BtE,OAAO,EAEL,aAAa,EACb,YAAY,EACZ,gBAAgB,EAGhB,gBAAgB,EAEjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAe,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAI5D,QAAA,MAAM,OAAO;;;;;;;;;wBAmVC;gBAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;gBAAC,WAAW,CAAC,EAAE,OAAO,CAAA;aAAE;8BAjSnB,MAAM;oCAkXD,OAAO,aAAoB,MAAM,IAAI;;6BAf3C,MAAM,KAAK,KAAK,GAAG,SAAS;;oCAdrB,MAAM,EAAE;sCA7UxC,MAAM,GAAG,MAAM,EAAE,WAAU,gBAAgB;qCA6YvB,MAAM,WAAW,gBAAgB;gCA7CzB,MAAM,SAAS,MAAM,UAAU,KAAK;gCAKpC,MAAM,SAAS,MAAM;kCA3JpD,MAAM,0BAAyB,qBAAqB;;;;;;;;oBA+EjD;YAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;YAAC,WAAW,CAAC,EAAE,OAAO,CAAA;SAAE;0BAjSnB,MAAM;gCAkXD,OAAO,aAAoB,MAAM,IAAI;;yBAf3C,MAAM,KAAK,KAAK,GAAG,SAAS;;gCAdrB,MAAM,EAAE;kCA7UxC,MAAM,GAAG,MAAM,EAAE,WAAU,gBAAgB;iCA6YvB,MAAM,WAAW,gBAAgB;4BA7CzB,MAAM,SAAS,MAAM,UAAU,KAAK;4BAKpC,MAAM,SAAS,MAAM;8BA3JpD,MAAM,0BAAyB,qBAAqB;;;CAic9D,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
|
@@ -7,6 +7,9 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
7
7
|
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
8
8
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
9
9
|
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
10
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
11
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
12
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
10
13
|
import * as React from 'react';
|
|
11
14
|
import { Provider } from "./Provider";
|
|
12
15
|
import useLatestObj from "../../common/use-latest-obj";
|
|
@@ -19,7 +22,8 @@ var globalKey = '__global__&&@@';
|
|
|
19
22
|
var SUBMIT_TIMEOUT = 10;
|
|
20
23
|
var RESET_TIMEOUT = 500;
|
|
21
24
|
import { current, produce } from "../../utils/immer";
|
|
22
|
-
import { deepGet, deepRemove, deepSet, docScroll, extractEventHandlers, isArray, isObject, shallowEqual, wrapFormError, deepClone, getAllKeyPaths, getParentKeys, getCompleteFieldKeys, devUseWarning, getFieldId, getClosestScrollContainer } from "../../utils";
|
|
25
|
+
import { deepGet, deepRemove, deepSet, docScroll, extractEventHandlers, isArray, isObject, shallowEqual, wrapFormError, deepClone, getAllKeyPaths, getParentKeys, getCompleteFieldKeys, collectFormRulePaths, devUseWarning, getFieldId, getClosestScrollContainer } from "../../utils";
|
|
26
|
+
import { validate as validateRuleFn } from "../../utils/validate";
|
|
23
27
|
var emptyObj = {};
|
|
24
28
|
var useForm = function useForm(props) {
|
|
25
29
|
var _props$defaultValue = props.defaultValue,
|
|
@@ -106,6 +110,48 @@ var useForm = function useForm(props) {
|
|
|
106
110
|
return validate(key, deepGet(context.value, key), context.value, config);
|
|
107
111
|
});
|
|
108
112
|
});
|
|
113
|
+
|
|
114
|
+
// ============ 新增:从 props.rules 推导未挂载字段并独立校验 ============
|
|
115
|
+
// 用于虚拟列表 / 大数据场景:业务方在 <Form rules={{...}}> 里声明的字段,
|
|
116
|
+
// 即便对应的 Form.Item 当前未挂载(虚拟滚动滚出视口),submit 也应校验。
|
|
117
|
+
// 仅在"全量校验"(fields 为空,或 ignoreBind 走 submit 路径)时启用。
|
|
118
|
+
var isFullValidate = !fields || config.ignoreBind;
|
|
119
|
+
if (isFullValidate && isObject(rules)) {
|
|
120
|
+
var declared = collectFormRulePaths(rules);
|
|
121
|
+
var _iterator = _createForOfIteratorHelper(declared),
|
|
122
|
+
_step;
|
|
123
|
+
try {
|
|
124
|
+
var _loop = function _loop() {
|
|
125
|
+
var item = _step.value;
|
|
126
|
+
// 注意:validateMap[name] 是 Set,unbind 后 Set 可能为空但 key 仍在
|
|
127
|
+
// 必须判断 Set 真有 validate 函数才算"已挂载并已校验",否则要补独立校验
|
|
128
|
+
var mountedSet = context.validateMap[item.name];
|
|
129
|
+
if (mountedSet && mountedSet.size > 0) return 0; // continue
|
|
130
|
+
if (context.ignoreValidateFields.includes(item.name)) return 0; // continue
|
|
131
|
+
var itemValue = deepGet(context.value, item.name);
|
|
132
|
+
// 关键:validate 工具函数 *校验失败时是 reject(FormError)*,不是 resolve(error)。
|
|
133
|
+
// 必须用 .catch 把 reject 转成 resolve(err),否则会变成 unhandled rejection
|
|
134
|
+
// 串到外层 Promise.all 把整条提交链炸断(".then() never fires" 问题)
|
|
135
|
+
var p = validateRuleFn(itemValue, context.value, item.rules, {}).then(function () {
|
|
136
|
+
return true;
|
|
137
|
+
}).catch(function (err) {
|
|
138
|
+
var fe = wrapFormError(err);
|
|
139
|
+
context.errors[item.name] = fe;
|
|
140
|
+
return fe;
|
|
141
|
+
});
|
|
142
|
+
validates.push([p]);
|
|
143
|
+
},
|
|
144
|
+
_ret;
|
|
145
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
146
|
+
_ret = _loop();
|
|
147
|
+
if (_ret === 0) continue;
|
|
148
|
+
}
|
|
149
|
+
} catch (err) {
|
|
150
|
+
_iterator.e(err);
|
|
151
|
+
} finally {
|
|
152
|
+
_iterator.f();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
109
155
|
if (config.type === 'withValue') {
|
|
110
156
|
var validatorValue = context.value;
|
|
111
157
|
if (fields) {
|
package/esm/utils/object.d.ts
CHANGED
|
@@ -58,5 +58,28 @@ export declare const getParentKeys: (field: string) => string[];
|
|
|
58
58
|
* @returns 空对象
|
|
59
59
|
*/
|
|
60
60
|
export declare const clearValue: (obj: ObjectType) => any;
|
|
61
|
+
/**
|
|
62
|
+
* 遍历 `<Form rules={...}>` 的嵌套 / 路径式声明,收集所有叶子路径(即每个字段对应的 rule 数组)。
|
|
63
|
+
*
|
|
64
|
+
* 用于让 submit 时把"在 props.rules 中声明、但 Form.Item 当前未挂载"的字段也纳入校验,
|
|
65
|
+
* 解决虚拟列表 / 大数据场景未渲染行被漏校验的问题。
|
|
66
|
+
*
|
|
67
|
+
* 叶子判定:value 是数组(即 FormItemRule 数组)。
|
|
68
|
+
* 路径生成规则:
|
|
69
|
+
* - 字符串 key 直接拼接:`{ user: { name: [...] } }` → `user.name`
|
|
70
|
+
* - 数字 key 转成 bracket:`{ rows: { 0: { name: [...] } } }` → `rows[0].name`
|
|
71
|
+
* - 顶层用字符串路径声明:`{ 'rows[0].name': [...] }` → 原样保留为 `rows[0].name`
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* collectFormRulePaths({ rows: { 0: { name: [requiredRule] }, 1: { name: [requiredRule] } } })
|
|
75
|
+
* // → [
|
|
76
|
+
* // { name: 'rows[0].name', rules: [requiredRule] },
|
|
77
|
+
* // { name: 'rows[1].name', rules: [requiredRule] },
|
|
78
|
+
* // ]
|
|
79
|
+
*/
|
|
80
|
+
export declare const collectFormRulePaths: (rulesObj: ObjectType, parentKey?: string) => Array<{
|
|
81
|
+
name: string;
|
|
82
|
+
rules: any;
|
|
83
|
+
}>;
|
|
61
84
|
export {};
|
|
62
85
|
//# sourceMappingURL=object.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["object.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,UAGvC;AASD,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAGD,eAAO,MAAM,YAAY,QAAS,UAAU,UAG3C,CAAC;AAGF,eAAO,MAAM,SAAS,2CAEZ,UAAU,YACT,WAAW,eAwBrB,CAAC;AAEF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,+DA4BxC;AAED,UAAU,cAAc;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,OAAO,WACV,UAAU,QACZ,MAAM,SACL,GAAG,YACD,cAAc,eAiDxB,CAAC;AAEF,eAAO,MAAM,OAAO,WAAY,UAAU,QAAQ,MAAM,YAAW,WAAW,YAyB7E,CAAC;AAEF,eAAO,MAAM,UAAU,WAAY,UAAU,QAAQ,MAAM,eA0B1D,CAAC;AAEF,eAAO,MAAM,OAAO,WAAY,UAAU,QAAQ,MAAM,YAavD,CAAC;AAEF,eAAO,MAAM,OAAO,QAAS,UAAU,YAItC,CAAC;AAEF,eAAO,MAAM,WAAW,wFAQvB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,QAAS,UAAU,cAAa,MAAM,KAAQ,MAAM,EAoB9E,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,oBAAoB,WAAY,MAAM,GAAG,MAAM,EAAE,aAAa,MAAM,EAAE,KAAG,MAAM,EAmB3F,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,aAAa,UAAW,MAAM,KAAG,MAAM,EAYnD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,UAAU,QAAS,UAAU,KAAG,GAW5C,CAAC"}
|
|
1
|
+
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["object.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,UAGvC;AASD,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAGD,eAAO,MAAM,YAAY,QAAS,UAAU,UAG3C,CAAC;AAGF,eAAO,MAAM,SAAS,2CAEZ,UAAU,YACT,WAAW,eAwBrB,CAAC;AAEF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,+DA4BxC;AAED,UAAU,cAAc;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,OAAO,WACV,UAAU,QACZ,MAAM,SACL,GAAG,YACD,cAAc,eAiDxB,CAAC;AAEF,eAAO,MAAM,OAAO,WAAY,UAAU,QAAQ,MAAM,YAAW,WAAW,YAyB7E,CAAC;AAEF,eAAO,MAAM,UAAU,WAAY,UAAU,QAAQ,MAAM,eA0B1D,CAAC;AAEF,eAAO,MAAM,OAAO,WAAY,UAAU,QAAQ,MAAM,YAavD,CAAC;AAEF,eAAO,MAAM,OAAO,QAAS,UAAU,YAItC,CAAC;AAEF,eAAO,MAAM,WAAW,wFAQvB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,QAAS,UAAU,cAAa,MAAM,KAAQ,MAAM,EAoB9E,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,oBAAoB,WAAY,MAAM,GAAG,MAAM,EAAE,aAAa,MAAM,EAAE,KAAG,MAAM,EAmB3F,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,aAAa,UAAW,MAAM,KAAG,MAAM,EAYnD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,UAAU,QAAS,UAAU,KAAG,GAW5C,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,oBAAoB,aACrB,UAAU,yBAEnB,MAAM;IAAE,MAAM,MAAM,CAAC;IAAC,KAAK,EAAE,GAAG,CAAA;CAAE,CAuBpC,CAAC"}
|
package/esm/utils/object.js
CHANGED
|
@@ -365,4 +365,53 @@ export var clearValue = function clearValue(obj) {
|
|
|
365
365
|
}, {});
|
|
366
366
|
}
|
|
367
367
|
return undefined;
|
|
368
|
+
};
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* 遍历 `<Form rules={...}>` 的嵌套 / 路径式声明,收集所有叶子路径(即每个字段对应的 rule 数组)。
|
|
372
|
+
*
|
|
373
|
+
* 用于让 submit 时把"在 props.rules 中声明、但 Form.Item 当前未挂载"的字段也纳入校验,
|
|
374
|
+
* 解决虚拟列表 / 大数据场景未渲染行被漏校验的问题。
|
|
375
|
+
*
|
|
376
|
+
* 叶子判定:value 是数组(即 FormItemRule 数组)。
|
|
377
|
+
* 路径生成规则:
|
|
378
|
+
* - 字符串 key 直接拼接:`{ user: { name: [...] } }` → `user.name`
|
|
379
|
+
* - 数字 key 转成 bracket:`{ rows: { 0: { name: [...] } } }` → `rows[0].name`
|
|
380
|
+
* - 顶层用字符串路径声明:`{ 'rows[0].name': [...] }` → 原样保留为 `rows[0].name`
|
|
381
|
+
*
|
|
382
|
+
* @example
|
|
383
|
+
* collectFormRulePaths({ rows: { 0: { name: [requiredRule] }, 1: { name: [requiredRule] } } })
|
|
384
|
+
* // → [
|
|
385
|
+
* // { name: 'rows[0].name', rules: [requiredRule] },
|
|
386
|
+
* // { name: 'rows[1].name', rules: [requiredRule] },
|
|
387
|
+
* // ]
|
|
388
|
+
*/
|
|
389
|
+
export var collectFormRulePaths = function collectFormRulePaths(rulesObj) {
|
|
390
|
+
var parentKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
|
391
|
+
if (!isObject(rulesObj)) return [];
|
|
392
|
+
var out = [];
|
|
393
|
+
for (var _i = 0, _Object$keys = Object.keys(rulesObj); _i < _Object$keys.length; _i++) {
|
|
394
|
+
var key = _Object$keys[_i];
|
|
395
|
+
var val = rulesObj[key];
|
|
396
|
+
var currentKey = void 0;
|
|
397
|
+
if (!parentKey) {
|
|
398
|
+
currentKey = key;
|
|
399
|
+
} else if (/^\d+$/.test(key)) {
|
|
400
|
+
// 数字 key 视为数组索引
|
|
401
|
+
currentKey = "".concat(parentKey, "[").concat(key, "]");
|
|
402
|
+
} else {
|
|
403
|
+
currentKey = "".concat(parentKey, ".").concat(key);
|
|
404
|
+
}
|
|
405
|
+
if (Array.isArray(val)) {
|
|
406
|
+
// 叶子:FormItemRule 数组
|
|
407
|
+
out.push({
|
|
408
|
+
name: currentKey,
|
|
409
|
+
rules: val
|
|
410
|
+
});
|
|
411
|
+
} else if (isObject(val)) {
|
|
412
|
+
// 继续往下钻
|
|
413
|
+
out.push.apply(out, _toConsumableArray(collectFormRulePaths(val, currentKey)));
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
return out;
|
|
368
417
|
};
|