值计算
该章节仅叙述实现思路,具体实现需要根据实际情况进行调整,且PC端与移动端实现基本相同,便不做区分。
一、根据表单的值计算
如有标题或合计等需要根据其他字段的值进行显示的场景,监听formModel变化并进行相应变更的方法有几种:
1. computed计算属性
推荐在拆分后的组件中使用computed计算属性与模板字符串。可以不在表单生成与存储新的字段,减少前后端开销,但是只能执行同步方法。
2. 组件事件触发 change/blur
表单组件一般有统一的change/blur事件触发,然后在事件处理函数中计算新的值并存储到其他的字段中。缺陷只适用于需监听字段较少的情况下,且每个需要考虑到的变量都需要绑定响应函数。
3. watch监听
在拆分后的组件中使用watch监听formModel变化,根据需要计算新的值并存储到其他的字段中。该方法可以进行异步操作,从后端获取数据。缺陷是开销较大,需要在每次formModel变化时重新计算。watch事件尽量避免使用,后期维护的时候容易察觉不到数据修改源头。
二、在操作表单前处理数据
如从后端获取的表单数据需要处理后才可以在表单中正常显示,那么可以在生成的form组件的onMounted生命周期中的所有判断之后进行formModel的获取与修改操作,然后将处理后的数据使用setFieldsValue函数存储到表单中。(适用于未拆分的组件)
onMounted(async () => {
try {
if (props.fromPage == FromPageType.MENU) {
setMenuPermission();
// 表单处理部分 略过
}
let data = {}
// 获取及修改表单数据的逻辑
setFieldsValue(data)
emits('form-mounted', formProps);
} catch (error) {
}
});
// 辅助设置表单数据
function setFieldsValue(record) {
systemFormRef.value.setFieldsValue(record);
}
或是在拆分后的CustomDevForm组件中直接修改formModel。
onMounted(() => {
this.formModel.xxx = 'xxx'
})
移动端则可以在生成的form组件的loadForm函数中进行处理。
async function loadForm(val){
let id = val[rowKey]
formConfig.id = id;
const {
data
} = await getAppFormSplit(id);
if (data) {
// 在这里处理表单数据
await formRef.value.setFormData({...props.formModel, ...data})
}
}
三、在提交表单前处理数据
在PC端,流程的提交和表单的提交都会触发基础表单的提交事件并且会重新查询并回填数据,因此可以在生成表单的add及update事件中进行处理。
// 新增api表单数据
async function add(values) {
try {
state.formModel = values;
// 可以在这里处理表单数据
let saveVal = await addAppFormSplit(values);
await submitFormEvent(formEventConfigs, state.formModel,
systemFormRef.value,
formProps.schemas); //表单事件:提交表单
return saveVal;
} catch (error) {}
}
// 更新api表单数据
async function update({ values, rowId }) {
try {
values[RowKey] = rowId;
state.formModel = values;
// 可以在这里处理表单数据
let saveVal = await updateAppFormSplit(values);
await submitFormEvent(formEventConfigs, state.formModel,
systemFormRef.value,
formProps.schemas); //表单事件:提交表单
return saveVal;
} catch (error) {}
}
但是流程表单数据的提交现阶段还是取表单的校验后的值,因此如果想修改流程表单的提交数据,则需要在生成的form组件中添加函数并用defineExpose函数暴露
function getFormModel() {
// 处理逻辑
return systemFormRef.value.formModel
}
然后对/SystemForm/src/Form.vue中的getFormModels方法进行修改,将获取表单数据的逻辑替换为调用暴露的函数。
async function getFormModels() {
try {
return (SystemFormRef.value?.getFormModel && SystemFormRef.value?.getFormModel()) || await validate()
} catch (error) {
console.error(error)
}
}
这样即可在提交流程表单时直接获取表单数据并进行修改