动态表单动态渲染问题?
在Vue2环境中,有一个动态表单,数据源如下:
list: [
{ name: '姓名', props: 'name', show: [] },
{ name: '年龄', props: 'age', show: [] },
{ name: '身高', props: 'height', show: [] },
{
name: '是否合格',
props: 'isPass',
show: [
{ key: 'age', symbol: '<=', value: 28 },
{ key: 'height', symbol: '>=', value: 180 },
],
value: ''
}
],
formData: { name: '', age: '', height: '', isPass: '' },
要实现的功能是:每个表单项根据其对象里的show来判断是否显示,如果show为空数组,代表无条件限制。比如是否合格这一项,只有在 年龄<=28&&身高>=180 时才显示。
测试渲染代码如下:
<div class="list">
<template v-for="item in list">
<div class="item" :key="item.name">
<span>{{ item.name }}</span>
<input type="text" v-model="formData[item.props]" :placeholder="'请输入' + item.name" />
</div>
</template>
</div>
请问下一步该如何进行?
回复
1个回答
test
2024-06-24
<template>
<div class="list">
<template v-for="item in list">
<div class="item" v-if="shouldShow(item)" :key="item.name">
<span>{{ item.name }}</span>
<input type="text" v-model="formData[item.props]" :placeholder="'请输入' + item.name" />
</div>
</template>
</div>
</template>
<script>
export default {
data() {
return {
list: [
{ name: '姓名', props: 'name', show: [] },
{ name: '年龄', props: 'age', show: [] },
{ name: '身高', props: 'height', show: [] },
{
name: '是否合格',
props: 'isPass',
show: [
{ key: 'age', symbol: '<=', value: 28 },
{ key: 'height', symbol: '>=', value: 180 },
],
value: ''
}
],
formData: { name: '', age: '', height: '', isPass: '' },
};
},
methods: {
shouldShow(item) {
if (item.show.length === 0) {
return true;
}
return item.show.every(condition => {
const formValue = this.formData[condition.key];
switch (condition.symbol) {
case '<=':
return formValue <= condition.value;
case '>=':
return formValue >= condition.value;
default:
return false;
}
});
}
}
};
</script>
<style scoped>
</style>
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容