comic-plus
Version:
<p align="center"> <img width="200px" src="./logo.png"/> </p>
80 lines (79 loc) • 2.35 kB
JavaScript
import { defineComponent, ref, provide, onMounted, h } from "vue";
import "../style/form.css";
import { FORM_PROVIDE } from "./type.mjs";
import { formProps } from "./main.props.mjs";
const Form = defineComponent({
name: "CuForm",
props: formProps,
setup(props, { slots, expose }) {
const itemInfoList = ref([]);
const originData = 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);
}
}
provide(FORM_PROVIDE, {
props,
itemValidatePush,
itemValidateDelete
});
onMounted(() => {
originData.value = JSON.parse(JSON.stringify(props.model));
});
expose({
validate,
validateFields,
clearValidates,
resetFields
});
return () => {
return h(
"form",
{ class: ["cu-form", "label-" + props.labelPosition, props.size], onsubmit: () => false },
slots
);
};
}
});
export {
Form as default
};