comic-plus
Version:
<p align="center"> <img width="200px" src="./logo.png"/> </p>
80 lines (79 loc) • 2.47 kB
JavaScript
;
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
const vue = require("vue");
require("../style/form.css");
const type = require("./type.js");
const main_props = require("./main.props.js");
const Form = vue.defineComponent({
name: "CuForm",
props: main_props.formProps,
setup(props, { slots, expose }) {
const itemInfoList = vue.ref([]);
const originData = vue.ref({});
function validate(callback) {
const promises = itemInfoList.value.map((item) => item.validate());
Promise.all(promises).then(() => {
callback(true);
}).catch(() => {
callback(false);
});
}
function validateFields(names, callback) {
if (!props.rules) return;
const promises = itemInfoList.value.filter((item) => names.includes(item.prop)).map((item) => item.validate());
Promise.all(promises).then(() => {
callback(true);
}).catch(() => {
callback(false);
});
}
function clearValidates(names) {
const promises = itemInfoList.value.filter(names ? (item) => names.includes(item.prop) : Boolean);
promises.forEach((field) => {
field.clearValidate();
});
}
function resetFields(names) {
const promises = itemInfoList.value.filter(names ? (item) => names.includes(item.prop) : Boolean);
promises.forEach((field) => {
field.clearValidate();
});
Object.assign(props.model, originData.value);
}
function itemValidatePush(item) {
let index = itemInfoList.value.findIndex((v) => v.prop === item.prop);
if (index >= 0) {
itemInfoList.value.splice(index, 1);
}
itemInfoList.value.push(item);
}
function itemValidateDelete(uid) {
let index = itemInfoList.value.findIndex((v) => v.uid === uid);
if (index >= 0) {
itemInfoList.value.splice(index, 1);
}
}
vue.provide(type.FORM_PROVIDE, {
props,
itemValidatePush,
itemValidateDelete
});
vue.onMounted(() => {
originData.value = JSON.parse(JSON.stringify(props.model));
});
expose({
validate,
validateFields,
clearValidates,
resetFields
});
return () => {
return vue.h(
"form",
{ class: ["cu-form", "label-" + props.labelPosition, props.size], onsubmit: () => false },
slots
);
};
}
});
exports.default = Form;