动态表单动态渲染问题?

作者站长头像
站长
· 阅读数 8

在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个回答
avatar
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>
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容