动态表单不同项的处理

问题描述

项目中的问题:

项目表单项是根据后台数据来循环渲染的,部分的表单项目的值需要进行特殊的处理,渲染项目会返回一个type

      <!-- 动态渲染数据 -->
      <section v-for="(item, index) in fields" :key="index">
        <!-- 日期格式数据 -->
        <section v-if="item.type === 'date'">
          <van-field
            readonly
            clickable
            name="calendar"
            :value="item.value"
            :label="item.name"
            placeholder="点击选择日期"
            @click="item.show = true"
          />
          <van-calendar
            v-model="item.show"
            title="选择日期"
            :row-height="56"
            :show-mark="false"
            :show-subtitle="false"
            :color="calendarColor"
            :style="{ height: '460px', fontSize: '12px' }"
            @confirm="e => dynamicAction(item.type, { item, e })"
          />
        </section>
        <!-- 文本输入数据 -->
        <template v-if="item.type === 'text'">
          <van-field
            v-model="item.value"
            name="计划工时"
            :label="item.name"
            placeholder="请输入"
          />
        </template>
        <!-- 下拉选择 -->
        <template v-if="item.type === 'select'">
          <van-field
            readonly
            clickable
            name="picker"
            :value="item.value"
            :label="item.name"
            placeholder="请选择"
            @click="item.show = true"
          />
          <van-popup v-model="item.show" position="bottom">
            <van-picker
              show-toolbar
              :columns="item.column"
              value-key="name"
              @confirm="e => dynamicAction(item.type, { item, e })"
              @cancel="e => cancel(item.type, { item, e })"
            />
          </van-popup>
        </template>
        <!-- 时间选择 -->
        <template v-if="item.type === 'time'">
          <van-field
            readonly
            clickable
            name="datetimePicker"
            :value="value"
            label="时间选择"
            placeholder="点击选择时间"
            @click="item.show = true"
          />
          <van-popup v-model="item.show" position="bottom">
            <van-datetime-picker
              type="time"
              @confirm="e => dynamicAction(item.type, { item, e })"
              @cancel="e => cancel(item.type, { item, e })"
            />
          </van-popup>
        </template>
      </section>

解决方案:

问题的解决方案:

这些表单项统一用同一个方法进行处理,根据后台不同的类型(type字段)来进行处理


    /**
     * @description: 动态渲染的情况下操作数据方法
     * @param {String} type: 类型,根据类型来操作数据
     * @param {Object} params:{item:选择的元素,e:元素框自身的值}
     * @return {none}
     */
    dynamicAction (type, params) {
      // 定义对象去处理不同类型的方法, 策略模式
      const handleList = {
        time: params => {
          const { item, e } = params
          this.fields.forEach(el => {
            if (el.name === item.name) {
              el.value = e
              el.show = false
            }
          })
        },
        text: function (params) {}, // 文本不做任何处理
        // 下拉框的情况
        select: params => {
          const { item, e } = params || {}
          this.fields.forEach(el => {
            if (el.name === item.name) {
              el.value = e
              el.show = false
            }
          })
        },
        // 选择为日期的情况下
        date: params => {
          const { item, e } = params
          const time = new Time(e).handleTime()
          this.fields.forEach(el => {
            if (el.name === item.name) {
              el.value = time
              el.show = false
            }
          })
        }
      }
      // 调用方法
      handleList[type](params)
    },
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值