vue 根据动态生成的form表单的整体的数据回显,赋值及校验和提交
主要负责处理表单数据的展示、编辑和提交,以及与后端接口的交互。(处理选择地址、处理单选框选中、设置表单验证、提交表单、校验文件是否上传完成、处理上传文件等)
- 公共调用方法mixins文件
import HCommonPop from "@/components/commonPop/index";
import HCommonFormItem from "@/components/commonFormItem/index";
import { getSelectList } from "@/api/initProject";
export default {
data() {
return {
oldFormList: [],
detailInfo: "",
axiosInfo: {}
};
},
components: {
HCommonPop,
HCommonFormItem
},
methods: {
handleSelectAddress(val, label, row, level) {
this.formList = this.handleFindDataSetVal(this.formList, row.field, val);
},
handleCheckedRadio(val, row) {
this.formList = this.handleFindDataSetVal(this.formList, row.field, val);
},
handleSetFormValidate(treeList, fieldVal, val, keyList = []) {
if (!treeList || !treeList.length) {
return;
}
treeList.forEach((item) => {
const formValidate = item.formValidate;
for (let key in formValidate) {
if (keyList.length > 0 ? keyList.includes(key) : key === fieldVal) {
formValidate[key][0].required = val;
}
}
this.handleSetFormValidate(item.children, fieldVal, val, keyList);
});
return treeList;
},
handleSetSubmitData(treeList, dataList) {
if (!treeList || !treeList.length) {
return [];
}
treeList.forEach((item) => {
if (item.purchasingInformation && JSON.stringify(item.purchasingInformation) !== "{}" && (item.display === undefined || item.display === true)) {
const updateObj = {};
item.purchasingInformation.formLabel.forEach((label) => {
const field = label.field;
const formValue = item.purchasingInformation.form[field];
if (label.type === "check") {
updateObj[field] = Array.isArray(formValue) ? formValue.join(",") : formValue;
} else if (label.type === "examine") {
delete item.purchasingInformation.form[field];
} else if (label.type === "upload") {
updateObj[field] = typeof formValue === "object" ? JSON.stringify(formValue) : formValue;
} else if (label.type === "textarea" && label.dataType === "multiple") {
const textareaData = JSON.parse(JSON.stringify(formValue));
const textareaFilterData = textareaData.filter((el) => el.value !== "");
if (textareaFilterData.length > 0) {
textareaFilterData.forEach((el) => {
if (!el.disabled) {
el.disabled = true;
el.userName = this.userInfo.nickName;
el.date = new Date().format("yyyy-MM-dd hh:mm:ss");
el.value = `${el.date} ${el.userName}: ${el.value}`;
}
});
}
updateObj[field] = textareaFilterData.length > 0 ? JSON.stringify(textareaFilterData) : "";
} else if (label.display) {
updateObj[field] = formValue;
}
});
dataList.push(updateObj);
}
if (item.children) {
this.handleSetSubmitData(item.children, dataList);
}
});
return dataList;
},
// 寻找某个属性值
handleFindDataInForm(treeList, field, myInfo, paramVal = "value") {
if (!treeList || !treeList.length) {
return myInfo;
}
for (const node of treeList) {
const { purchasingInformation, children } = node;
if (
purchasingInformation &&
purchasingInformation.form.hasOwnProperty(field)
) {
const { formLabel } = purchasingInformation;
const matchingField = formLabel.find(label => label.field === field);
if (matchingField) {
myInfo[paramVal] =
paramVal === "options"
? matchingField.options
: purchasingInformation.form[field];
return myInfo;
}
}
this.handleFindDataInForm(children, field, myInfo, paramVal);
}
return myInfo;
},
handleChangeFormKeyVal() {},
// 为某个属性赋值
handleFindDataSetVal(treeList, field, val) {
if (!treeList || !treeList.length) {
return;
}
treeList.forEach((item) => {
const purchasingInformation = item.purchasingInformation;
if (
purchasingInformation &&
(item.display === undefined || item.display === true) &&
purchasingInformation.form[field] !== undefined
) {
const formLabel = purchasingInformation.formLabel;
const targetLabel = formLabel.find((label) => label.field === field);
if (targetLabel) {
purchasingInformation.form[field] = val;
}
return;
}
this.handleFindDataSetVal(item.children, field, val);
});
return treeList;
},
submit() {
this.$commonMessage.confrimMessage(
{ message: "是否保存?", type: "success" },
() => {
let myForm = {
imgData: [],
list: []
};
let imgStatus = this.handleCheckImgAndTable(
this.formList,
myForm,
"img"
);
if (imgStatus.imgData.length > 0) {
this.$commonMessage.message({
type: "warning",
message: "文件上传中,请稍后!"
});
return;
}
this.handleSetAxiosData();
}
);
},
//校验文件是否上传完成
handleCheckImgAndTable(treeList, myForm, operatorType) {
if (!treeList || !treeList.length) {
return;
}
treeList.forEach((item) => {
const purchasingInformation = item.purchasingInformation;
if (purchasingInformation && JSON.stringify(purchasingInformation) !== "{}") {
purchasingInformation.formLabel.forEach((label) => {
if (operatorType === "img" && label.type === "upload") {
const uploadImgList = label.uploadImgList;
if (uploadImgList.some((el) => !el.isUpload)) {
myForm.imgData.push(1);
} else {
const chooseImgListOrigin = label.chooseImgListOrigin;
const imgList = chooseImgListOrigin.map((item) => item.new || item);
purchasingInformation.form[label.field] = imgList.length > 0 ? JSON.stringify(imgList) : "";
}
}
});
}
if (item.children) {
this.handleCheckImgAndTable(item.children, myForm, operatorType);
}
});
if (operatorType === "img") {
myForm.list = treeList;
}
return myForm;
},
handleCheckUpload(treeList, fieldInfo, fileList) {
if (!treeList || !treeList.length) {
return;
}
treeList.forEach((item) => {
if (item.$children && item.$children.length > 0 && !item.$refs.rulesForm) {
this.handleCheckUpload(item.$children, fieldInfo, fileList);
} else {
if (fileList.length > 0) {
const formRules = item.$refs.rulesForm?item.$refs.rulesForm.rules:{};
formRules&&formRules[fieldInfo.field] && item.$refs.rulesForm.clearValidate(fieldInfo.field);
}
}
});
},
handleSelectChange() {},
//上传文件的处理(删除及添加)
handleImgInfo(val, file, info) {
this.formList = this.handleSetImgVal(this.formList, val, file, info);
},
//上传文件的处理(删除及添加)
handleImgLoad(val, formInfo) {
this.formList = this.handleSetImgVal(this.formList, val, "add", formInfo);
},
//上传文件的处理(删除及添加)
handleSetImgVal(treeList, val, file, formInfo) {
if (!treeList || !treeList.length) {
return;
}
const node = treeList.find(
(item) =>
item.purchasingInformation &&
item.purchasingInformation.form[formInfo.field] !== undefined
);
if (node) {
for (let j = 0; j < node.purchasingInformation.formLabel.length; j++) {
if (
node.purchasingInformation.formLabel[j].field == formInfo.field
) {
const chooseImgListOrigin =
node.purchasingInformation.formLabel[j].chooseImgListOrigin;
if (file == "delete") {
const index = chooseImgListOrigin.findIndex(
(ele) => ele.id === val.id || ele.uid === val.uid
);
chooseImgListOrigin.splice(index, 1);
} else if (file == "add") {
this.$set(
node.purchasingInformation.formLabel[j],
"uploadImgList",
val
);
} else {
chooseImgListOrigin.push({
new: val,
old: file,
});
this.handleCheckUpload(this.$refs.myFromItem.$children, formInfo, chooseImgListOrigin);
}
break;
}
}
} else {
treeList.forEach((item) => {
this.handleSetImgVal(item.children, val, file, formInfo);
});
}
return treeList;
},
// 获取所有表单填写的form
handleGetFormData(formList) {
let dataList = [];
let submitData = this.handleSetSubmitData(
JSON.parse(JSON.stringify(this[formList])),
dataList
);
let submitObj = {};
submitData.forEach(el => {
submitObj = {
...submitObj,
...el
};
});
return submitObj;
},
handleCheckTreeFormValidate(treeList, myValidate) {
if (!treeList || !treeList.length) {
return;
}
treeList.forEach((item) => {
if (item && item.$children && item.$children.length > 0 && item.$refs && !item.$refs.rulesForm) {
this.handleCheckTreeFormValidate(item.$children, myValidate);
} else if (item && item.$refs && item.$refs.rulesForm) {
myValidate.push(
new Promise((resolve, reject) => {
item.$refs.rulesForm.validate((valid, validObj) => {
if (valid) {
resolve();
} else {
console.log(valid, validObj, "valid, validObj");
reject();
}
});
})
);
}
});
return myValidate;
},
handleSetAxiosData(submitType, type) {
let submitObj = this.handleGetFormData("formList");
let validate = [];
let validateList = [];
if (
this.detailInfo.type == "edit" &&
this.detailInfo.page == "warehouse"
) {
this.handleSubmitData(submitObj, type);
return;
}
if (
this.$refs.myFromItem.$children &&
this.$refs.myFromItem.$children.length > 0
) {
validateList = this.handleCheckTreeFormValidate(
this.$refs.myFromItem.$children,
validate
);
}
console.log(validateList, "validateList");
Promise.all(validateList)
.then(() => {
let ruleFlag = false;
if (this.$route.name == "AddRules") {
let ruleFlagMsg = this.handleValidateUp();
if (ruleFlagMsg) {
this.$commonMessage.message({
type: "warning",
message: `${ruleFlagMsg}`
});
ruleFlag = true;
}
}
if (!ruleFlag && type != "examine") {
this.handleSubmitData(submitObj, type);
}
if (type == "examine") {
this.handleOperatorExamine(submitType, submitObj);
}
})
.catch(() => {
this.$commonMessage.message({
type: "warning",
message: `请完善信息并检查填写信息是否符合要求!`
});
});
},
// 数据回显
handleUpdateForm(treeList, list, info) {
if (!treeList || treeList.length === 0) {
return;
}
for (const item of treeList) {
const {purchasingInformation, display} = item;
if (purchasingInformation && Object.keys(purchasingInformation).length !== 0 && (display === undefined || display === true)) {
for (const formLabel of purchasingInformation.formLabel) {
const {field, type, dataType, disabled} = formLabel;
let key = field;
let infoVal = "";
if (type === "upload") {
infoVal = info &&info[key] ? JSON.parse(info[key]) : this.axiosInfo[key] ? JSON.parse( this.axiosInfo[key]):'';
item.purchasingInformation.form[key] = infoVal;
if(infoVal) {
formLabel.chooseImgListOrigin = JSON.parse(JSON.stringify(infoVal));
formLabel.fileList = JSON.parse(JSON.stringify(infoVal));
}
if (disabled) {
formLabel.initData = infoVal ? JSON.stringify(infoVal) : "";
}
} else if (type === "textarea" && dataType === "multiple") {
let inputValue = "";
if (this.axiosInfo[key] && this.commonFunc.judgeIsArray(this.axiosInfo[key])) {
const textareaValues = JSON.parse(this.axiosInfo[key]);
const textareaValue = [{
disabled: true,
date: "",
userName: "",
value: ""
}];
for (let v = 0; v < textareaValues.length; v++) {
textareaValue[0].value += textareaValues[v].value + (textareaValues.length - 1 === v ? "" : "\n");
}
inputValue = textareaValue;
} else {
inputValue = this.axiosInfo[key]
? [{
date: "",
userName: "",
disabled: true,
value: this.axiosInfo[key]
}]
: [{
date: "",
userName: "",
disabled: false,
value: ""
}];
}
formLabel.deleteWord = inputValue;
item.purchasingInformation.form[key] = inputValue;
} else {
item.purchasingInformation.form[key] = this.axiosInfo[key] !== undefined && this.axiosInfo[key] !== null && this.axiosInfo[key] !== ""
? this.axiosInfo[key]
: item.purchasingInformation.form[key] !== undefined && item.purchasingInformation.form[key] !== "" && item.purchasingInformation.form[key] !== null
? item.purchasingInformation.form[key]
: "";
}
}
}
if (item.children) {
this.handleUpdateForm(item.children, list, info);
}
}
return treeList;
},
// 判断是否需要调用接口显示下拉信息
handleSetValForFormSelect(treeList, fieldVal, index) {
if (!treeList || !treeList.length) {
return;
}
for (let i = 0; i < treeList.length; i++) {
if (
treeList[i].purchasingInformation &&
JSON.stringify(treeList[i].purchasingInformation) != "{}"
) {
for (
let k = 0;
k < treeList[i].purchasingInformation.formLabel.length;
k++
) {
if (treeList[i].purchasingInformation.formLabel[k].selectUrl) {
this.handleGetSelectList(
treeList[i].purchasingInformation.formLabel[k].selectUrl,
treeList[i].purchasingInformation.formLabel[k],
fieldVal,
index
);
}
if (
treeList[i].purchasingInformation.formLabel[k].type == "examine"
) {
this.handleGetFlowTask(
treeList[i].purchasingInformation.formLabel[k],
fieldVal,
index
);
}
}
}
if (treeList[i].children) {
this.handleSetValForFormSelect(treeList[i].children, fieldVal, index);
}
}
},
// 获取form中select的下拉选
async handleGetSelectList(url, obj, fieldVal, index, params) {
let result = await getSelectList(url, params);
this[fieldVal] = this.handleSetValForSelect(
this[fieldVal],
result,
obj,
"normal"
);
if (this.$route.name == "AddRules") {
if (JSON.stringify(this.axiosInfo) != "{}") {
this.handleSelectChange(this.axiosInfo.standardCode, "standardCode");
this.handleSelectChange(this.axiosInfo.checkType, "checkType");
}
}
},
// 审核人下拉
async handleGetFlowTask(obj, fieldVal, index) {
if (this.isMineExamine) {
await this.handleGetExamineInfo(obj, fieldVal, index);
} else {
}
},
// form中下拉赋值
handleSetValForSelect(treeList, data, obj, index) {
if (!treeList || !treeList.length) {
return treeList;
}
for (let i = 0; i < treeList.length; i++) {
const purchasingInfo = treeList[i].purchasingInformation;
if (purchasingInfo && purchasingInfo.form[obj.field] !== undefined) {
const formLabel = purchasingInfo.formLabel.find(
(label) => label.field === obj.field
);
if (formLabel) {
const target = index !== "normal"
? formLabel.tableColumns[index]
: formLabel;
this.$set(target, "options", data);
}
}
this.handleSetValForSelect(treeList[i].children, data, obj, index);
}
return treeList;
},
handleSetFormDisabled(
treeList,
type,
fieldListWidthFit = [],
fieldVal = "type",
param = "selectUrl",
paramVal = "/core/select/crm-dealer-type"
) {
if (!treeList || !treeList.length) {
return;
}
for (let i = 0; i < treeList.length; i++) {
const purchasingInformation = treeList[i].purchasingInformation;
for (let j = 0; j < purchasingInformation.formLabel.length; j++) {
if (type == "special") {
if (fieldVal == purchasingInformation.formLabel[j].field) {
this.$set(purchasingInformation.formLabel[j], param, paramVal);
}
} else {
if (type != "disabled") {
this.$set(purchasingInformation.formLabel[j], "disabled", true);
}
if (
fieldListWidthFit.includes(
purchasingInformation.formLabel[j].field
)
) {
if (type == "disabled") {
this.$set(purchasingInformation.formLabel[j], "disabled", true);
} else {
this.$set(purchasingInformation.formLabel[j], "widthFit", true);
}
}
if (fieldVal == purchasingInformation.formLabel[j].field) {
this.$set(purchasingInformation.formLabel[j], "param", "");
}
}
}
this.handleSetFormDisabled(treeList[i].children);
}
return treeList;
},
handleGetDataToForm() {
// 数据回显赋值
this.formList = this.handleUpdateForm(this.formList);
},
handleBackMessage() {
this.$commonMessage.confrimMessage(
{ message: "有部分修改尚未保存,确定要离开该页面吗?", type: "success" },
() => {
this.handleBack();
}
);
},
back() {
console.log("back");
let formList = JSON.stringify(this.handleGetFormData("formList"));
if (this.oldFormList == formList || this.detailInfo.type == "detail") {
this.handleBack();
return;
}
this.handleBackMessage();
},
handleBack() {
this.$router.back();
}
},
mounted() {
// 下拉选赋值
this.handleSetValForFormSelect(this.formList, "formList");
this.$nextTick(() => {
this.oldFormList = JSON.stringify(this.handleGetFormData("formList"));
});
},
destroyed() {},
created() {
if (!this.isDialog) {
this.$store.commit("setBoxBgVisible", false);
this.detailInfo = this.$route.query.detailInfo
? window.atob(this.$route.query.detailInfo)
? JSON.parse(
decodeURIComponent(window.atob(this.$route.query.detailInfo))
)
: {}
: "";
this.title = this.detailInfo.title;
}
}
};
- 在vue文件中获取到详情数据回显
<script>
export default {
methods: {
getDetail() {
// 接口请求 response返回的数据
this.axiosInfo = response
this.handleGetDataToForm();
},
async handleSubmitData(submitObj) {
let data = {
...submitObj,
};
接口(data).then(res=>{
this.handleBack();
this.$commonMessage.message({
type: "success",
message: `保存成功!`
});
})
}
}
}
</script>