zent
Version:
一套前端设计语言和基于React的实现
86 lines (85 loc) • 3.23 kB
JavaScript
import { useMemo } from 'react';
import { FieldArrayModel, FormStrategy, isModelRef, isFieldArrayModel, } from './models';
import { useFormContext } from './context';
import { useDestroyOnUnmount } from './utils';
import { isSome, get } from './maybe';
import { createModelNotFoundError, createUnexpectedModelTypeError, } from './error';
import { useObservableEagerState } from 'observable-hooks';
function useArrayModel(field, parent, strategy, defaultValue) {
var model = useMemo(function () {
var model;
if (typeof field === 'string') {
var m = parent.get(field);
if (strategy === FormStrategy.View) {
if (!m || !isFieldArrayModel(m)) {
var potential = parent.getPatchedValue(field);
var v = defaultValue;
if (isSome(potential)) {
var inner = get(potential);
if (Array.isArray(inner)) {
v = inner;
}
}
model = new FieldArrayModel(null, v);
parent.registerChild(field, model);
}
else {
model = m;
}
}
else {
if (!m) {
throw createModelNotFoundError(field);
}
else if (!isFieldArrayModel(m)) {
throw createUnexpectedModelTypeError(field, 'FieldArrayModel', m);
}
else {
model = m;
}
}
}
else if (isModelRef(field)) {
var m = field.getModel();
if (!m || !isFieldArrayModel(m)) {
var v = defaultValue;
if (isSome(field.patchedValue)) {
var inner = get(field.patchedValue);
if (Array.isArray(inner)) {
v = inner;
}
}
else if (isSome(field.initialValue)) {
var inner = get(field.initialValue);
if (Array.isArray(inner)) {
v = inner;
}
}
model = new FieldArrayModel(null, v);
}
else {
model = m;
}
}
else {
model = field;
}
return model;
}, [field, parent, strategy]);
return model;
}
export function useFieldArray(field, validators, defaultValue) {
var _a;
if (validators === void 0) { validators = []; }
if (defaultValue === void 0) { defaultValue = []; }
var _b = (_a = useFormContext(typeof field !== 'string')) !== null && _a !== void 0 ? _a : {}, parent = _b.parent, strategy = _b.strategy;
var model = useArrayModel(field, parent, strategy, defaultValue);
if (strategy === FormStrategy.View &&
(typeof field === 'string' || isModelRef(field))) {
model.validators = validators;
}
useObservableEagerState(model.children$);
useObservableEagerState(model.error$);
useDestroyOnUnmount(field, model, parent);
return model;
}