vue+antd 通用表单模板开发

日常开发中涉及到较多表单功能,如何设计一模板,传递一JSON字符内容,即可呈现对应表单,对提升开发效率和降低开发难度有较大帮助,因此设计常规表单需解决包含表单组件、表单验证、表单提交等元素

源码地址

演示效果 账号: admin 密码: 123456

一、设计动态表单组件

 <div v-if="!modalFnData[formItem.model]" class="div_text" :class="formItem.divStyle">{{ showText(formItem, activeEnumList) }} </div>
    <a-input
      v-show="modalFnData[formItem.model]"
      v-if="formItem.compTag === 'text'"
      v-model="modalForm[`${formItem.model}`]"
      :prefix="formItem.prefix"
      :suffix="formItem.suffix"
      :addon-before="formItem.addonBefore"
      :addon-after="formItem.addonAfter"
      :style="formItem.inputStyle"
      allow-clear
      :placeholder="formItem.placeholder"
      @change="onInputChange(formItem)"
      @pressEnter="onInputPressEnter(formItem)"
    ></a-input>
    <a-input
      v-show="modalFnData[formItem.model]"
      v-else-if="formItem.compTag === 'textIcon'"
      v-model="modalForm[`${formItem.model}`]"
      :prefix="formItem.prefix"
      :suffix="formItem.suffix"
      :addon-before="formItem.addonBefore"
      :addon-after="formItem.addonAfter"
      :style="formItem.inputStyle"
      allow-clear
      :placeholder="formItem.placeholder"
      @change="onInputChange(formItem)"
      @pressEnter="onInputPressEnter(formItem)"
      :defaultValue="formItem.defVal"
    >
      <a-icon v-if="formItem.prefixIcon !== undefined" slot="prefix" :type="formItem.prefixIcon" />
      <a-icon v-if="formItem.suffixIcon !== undefined" slot="suffix" :type="formItem.suffixIcon" />
      <a-icon v-if="formItem.addonBeforeIcon !== undefined" slot="addonBefore" :type="formItem.addonBeforeIcon" />
      <a-tooltip v-if="formItem.tooltipTitle !== undefined" slot="suffix" :title="formItem.tooltipTitle">
        <a-icon v-if="formItem.tooltipIcon !== undefined" :type="formItem.tooltipIcon" style="color: rgba(0,0,0,.45)" />
      </a-tooltip>
      <a-icon v-if="formItem.addonAfterIcon !== undefined" slot="addonAfter" :type="formItem.addonAfterIcon" />
      <a-select
        v-if="formItem.addonBeforeCompItem !== undefined && formItem.addonBeforeCompItem.compTag === 'select'"
        v-show="modalFnData[formItem.addonBeforeCompItem.model]"
        slot="addonBefore"
        v-model="modalForm[`${formItem.addonBeforeCompItem.model}`]"
        style="width: 90px"
        @change="onSelectChange(formItem.addonBeforeCompItem)"
        @select="onSelectSelect(formItem.addonBeforeCompItem)"
        :defaultValue="formItem.defVal"
      >
        <a-select-option v-for="(data, i) in beforeActiveEnumList" :key="data.value">{{ data.text }}</a-select-option>
      </a-select>
      <a-select
        v-if="formItem.addonAfterCompItem !== undefined && formItem.addonAfterCompItem.compTag === 'select'"
        v-show="modalFnData[formItem.addonAfterCompItem.model]"
        slot="addonAfter"
        v-model="modalForm[`${formItem.addonAfterCompItem.model}`]"
        style="width: 80px"
        @change="onSelectChange(formItem.addonAfterCompItem)"
        @select="onSelectSelect(formItem.addonAfterCompItem)"
        :defaultValue="formItem.defVal"
      >
        <a-select-option v-for="(data, i) in afterActiveEnumList" :key="data.value">{{ data.text }}</a-select-option>
      </a-select>
    </a-input>

 <a-input-search
      v-show="modalFnData[formItem.model]"
      v-else-if="formItem.compTag === 'inputSearch'"
      v-model="modalForm[`${formItem.model}`]"
      :prefix="formItem.prefix"
      :suffix="formItem.suffix"
      :addon-before="formItem.addonBefore"
      :addon-after="formItem.addonAfter"
      :style="formItem.inputStyle"
      allow-clear
      :placeholder="formItem.placeholder"
      @search="onInputSearch"
    />

    <a-input-search
      v-show="modalFnData[formItem.model]"
      v-else-if="formItem.compTag === 'inputSearchButton'"
      v-model="modalForm[`${formItem.model}`]"
      enter-button="查询"
      :prefix="formItem.prefix"
      :suffix="formItem.suffix"
      :addon-before="formItem.addonBefore"
      :addon-after="formItem.addonAfter"
      :style="formItem.inputStyle"
      allow-clear
      :placeholder="formItem.placeholder"
      @search="onInputSearch"
    />
    <a-input-group v-else-if="formItem.compTag === 'inputGroup'" compact>
      <a-select
        v-for="(groupItem,itemIndex) in formItem.groupItems"
        v-show="modalFnData[groupItem.model]"
        v-if="groupItem !== undefined && groupItem.compTag === 'select'"
        :key="groupItem.model"
        :style="groupItem.inputStyle"
        v-model="modalForm[`${groupItem.model}`]"
        allow-clear
        :placeholder="groupItem.placeholder"
        :defaultValue="formItem.defVal"
      >
        <a-select-option v-for="(data, i) in activeEnumData[groupItem.data]" :key="data.value">{{ data.text }}</a-select-option>
      </a-select>
      <a-input
        v-for="(groupItem,itemIndex) in formItem.groupItems"
        v-show="modalFnData[groupItem.model]"
        v-if="groupItem !== undefined && groupItem.compTag === 'text'"
        :key="groupItem.model"
        v-model="modalForm[`${groupItem.model}`]"
        :style="groupItem.inputStyle"
        :prefix="groupItem.prefix"
        :suffix="groupItem.suffix"
        :addon-before="groupItem.addonBefore"
        :addon-after="groupItem.addonAfter"
        allow-clear
        :placeholder="groupItem.placeholder"
        @change="onInputChange(groupItem)"
        @pressEnter="onInputPressEnter(groupItem)"
        :defaultValue="formItem.defVal"
      />
    </a-input-group>
<a-rate
      v-show="modalFnData[formItem.model]"
      v-else-if="formItem.compTag === 'rate'"
      v-model="modalForm[`${formItem.model}`]"
      :character="formItem.character"
      :count="formItem.count"
      :allow-half="formItem.allowHalf"
      :tooltips="formItem.tooltips"
      :style="formItem.inputStyle"
      allow-clear
      :placeholder="formItem.placeholder"
      :defaultValue="formItem.defVal"
    />
    <a-rate
      v-show="modalFnData[formItem.model]"
      v-else-if="formItem.compTag === 'rateIcon'"
      v-model="modalForm[`${formItem.model}`]"
      :count="formItem.count"
      :allow-half="formItem.allowHalf"
      :tooltips="formItem.tooltips"
      :style="formItem.inputStyle"
      allow-clear
      :placeholder="formItem.placeholder"
      :defaultValue="formItem.defVal"
    >
      <a-icon slot="character" :type="formItem.character" />
    </a-rate>
    <a-slider
      v-show="modalFnData[formItem.model]"
      v-else-if="formItem.compTag === 'slider'"
      :tip-formatter="changeSliderFormatter"
      :min="formItem.min"
      :max="formItem.max"
      :step="formItem.step"
      v-model="modalForm[`${formItem.model}`]"
      :dots="formItem.dots"
      :included="formItem.included"
      :reverse="formItem.reverse"
      :vertical="formItem.vertical"
      :range="formItem.range"
      :tooltip-visible="formItem.tooltipVisible"
      :tooltip-placement="formItem.tooltipPlacement"
      :style="formItem.inputStyle"
      allow-clear
      :placeholder="formItem.placeholder"
      :defaultValue="formItem.defVal"
    />

二、数据结构

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue antd table 是一种非常方便的数据格组件,可以用来展示和管理大量的数据信息。在使用中,我们有时候需要在某个元格里面嵌套一个格,用来展示更详细的数据信息。这种场景下,我们需要实现vue antd table一格加多行的效果。 实现这个效果的方法有多种,这里介绍一种比较简的方式: 1. 首先,在vue antd table中找到需要嵌套的元格,给它加上一个 slot 插槽。例如: ```html <a-table-column title="姓名"> <template slot-scope="text, record"> <span>{{ record.name }}</span> <div slot="expandedRowRender"> <p>更详细的信息。。。</p> <p>更详细的信息。。。</p> <p>更详细的信息。。。</p> </div> </template> </a-table-column> ``` 这里要注意,设置 slot 的名称为 expandedRowRender,这样才可以使多行数据展开在同一个元格内。 2. 接着,在 a-table 中添加一个属性,用来指定当前格是否支持展开行:expandedRowRender。例如: ```html <a-table :columns="columns" :data-source="data" :pagination="false" :expanded-row-render="true"></a-table> ``` 这里要注意,设置 expanded-row-render 的值为 true,示允许展开行。当然,还可以给 expanded-row-render 设置具体的属性值,比如属性值为 object 示可以通过对象来配置展开的行。 3. 最后,在 table 中添加一个事件监听函数,用来处理展开行功能的具体逻辑。例如: ```html <a-table :columns="columns" :data-source="data" :pagination="false" :expanded-row-render="true" @expandedRowsChange="onExpandedRowsChange"></a-table> ``` 在 onExpandedRowsChange 函数中,我们可以进行一些格展开和关闭的操作,例如: ```javascript methods: { onExpandedRowsChange(rows) { if (rows.length == 0) { // 关闭所有行 return; } console.log('展开行:', rows[0]); } } ``` 需要注意的是,由于 expandedRowRender 的值为 true,示允许展开行,所以属性 @expandedRowsChange 才会生效,才能实现展开行的效果。 通过以上三个步骤,我们就可以实现vue antd table一格加多行的效果了。当然,具体实现方式还要根据自己的实际情况来进行调整,如果你还有其他更好的实现方式,欢迎在评论中分享给大家。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值