antd table form 表单验证

3 篇文章 0 订阅
文章介绍了如何在Vue.js应用中将表格组件置于表单模型内,以实现数据绑定和验证。方法包括直接在表格内嵌套表单模型,通过`prop`属性动态绑定数组中的属性,并进行必填项检查。还展示了处理包含多个表格的复杂表单场景,以及如何对每个表格进行独立验证的方法。
摘要由CSDN通过智能技术生成

三种方式:
将table放置在form-model 内

<!-- html -->
<advance-table
    bordered
    :scroll="{ x:'100%',y: 300 }"
    :columns="columns_white_list_edit"
    :data-source="siteList"
    :rowKey="(row,index) => row.siteId"
    :rowSelection="{selectedRowKeys:selectedRowKeysSite,onChange:onChangeSite,columnWidth:50}"
    :pagination="paginationSite"
    @change="handleTableChangeSite"
    :showToolbar="false"
  >
    <a-form-model :model="record" :ref="`formData_${index}`" slot="endTime" class="handle-btn-box" slot-scope="{text, record, index}">
      <a-form-model-item prop="endTime" :rules="{ required: true, message: '请选择' }" >
        <a-date-picker v-model="record.endTime" @change="changeItemTime(record.siteId,index)" showTime format="YYYY-MM-DD hh:mm:ss" valueFormat="YYYY-MM-DD hh:mm:ss" :getCalendarContainer="() => win.document.body" />
      </a-form-model-item>
    </a-form-model>
  </advance-table>

<!-- js -->
for (const key in _this.$refs) {
  if (key === 'con') break
  _this.$refs[key].validate(async valid => {
    if (!valid) return false
  })
}

二、将table放置在form-model 内
重点是 :prop=“siteList.${index}.endTime”

<!-- html -->
<a-form-model :model="reqData" ref="formData">
  <advance-table
    bordered
    :scroll="{ x:'100%',y: 300 }"
    :columns="columns_white_list_edit"
    :data-source="reqData.siteList"
    :rowKey="(row,index) => row.siteId"
    :rowSelection="{selectedRowKeys:selectedRowKeysSite,onChange:onChangeSite,columnWidth:50}"
    :pagination="paginationSite"
    @change="handleTableChangeSite"
    :showToolbar="false"
  >
    <template slot="endTime" slot-scope="{text, record, index}">
      <a-form-model-item :prop="`siteList.${index}.endTime`" :rules="{ required: true, message: '请选择' }" >
        <a-date-picker v-model="record.endTime" showTime format="YYYY-MM-DD hh:mm:ss" valueFormat="YYYY-MM-DD hh:mm:ss" :getCalendarContainer="() => win.document.body" />
      </a-form-model-item>
    </template>
  </advance-table>
</a-form-model>

<!-- js -->
_this.$refs.formData.validate(async valid => {
          if (!valid) return
})

三、2 的进化 -> table在form-model内;并且table是数组循环的内容

<a-form-model :model="value" ref="formData" :rules="rules" labelAlign="left">
      <a-card title="背景/方案说明" :bordered="false">
        <a-row :gutter="[24]">
          <a-col :span="6">
            <a-form-model-item label="签约主体" prop="companyId">
              <BlSelectCommon v-model="value.companyId" :apiFn="blCommonDropdownCompany" />
            </a-form-model-item>
          </a-col>
        </a-row>
      </a-card>
      <DetailDivider />
      <a-card title="机台明细" :bordered="false">
        <a-button slot="extra" type="primary" :disabled="value.contactList.length > 4" @click="handleArr('add')">新增</a-button>
        <a-row :gutter="[24]" v-for="(item,index) in value.contactList" :key="index" class="m-b-20">
            <a-col :span="6">
              <a-form-model-item label="场所名称">
                <BlSelectCommon v-model="item.companyId" :apiFn="blCommonDropdownCompany" />
              </a-form-model-item>
            </a-col>
            <a-col :span="6">
              <a-form-model-item label="操作">
                <a-button type="primary" @click="handleAddOrReduce('contactList','add',index)">新增一条点位</a-button>
              </a-form-model-item>
            </a-col>
            <a-col :span="24">
            <!-- 将table放在form-model中;因为table内可能存在很多必填项  -->
            <!-- model值应为一个对象;ref动态拼接index  -->
              <a-form-model :model="item" :ref="`table_${index}`">
              <advance-table
                class="m-t-10"
                bordered
                :scroll="{ x:'100%',y: 400 }"
                :columns="columns_project_apply_plan_explain_tab"
                :data-source="item.list"
                :rowKey="(row,index) => index"
                :pagination="false"
                :showToolbar="false"
              >
                <template slot="number" slot-scope="{text, record, index}">
                  <span >{{index + 1}}</span>
                </template>
                <template slot="companyName" slot-scope="{text, record,index}">
                <!-- prop使用动态方式;注意此处第一个key应为table实际渲染的key;即`:data-source="item.list"`的list  -->
                  <a-form-model-item :prop="`list.${index}.companyName`" :rules="{ required: true, message: '请输入' }">
                    <a-input v-model="record.companyName" :disabled="disabled" placeholder="场所名+投放场地+摆放位置"></a-input>
                  </a-form-model-item>
                </template>
                <div slot="handle" class="handle-btn-box" slot-scope="{text, record, innerIndex}">
                  <a-icon type="minus-circle" style="color: red;font-size: 20px;" class="m-l-10" @click="handleAddOrReduce('contactList','del',index,innerIndex)" />
                </div>
              </advance-table>
            </a-form-model>
            </a-col>
        </a-row>
      </a-card>
      <DetailDivider />
    </a-form-model>

<!-- js - rules -->

rules: {
        companyId: [{ required: true, message: '请输入' }], // 非table内的prop
        companyName: [{ required: true, message: '请输入' }], // table内的prop
        ...
    }

<!-- js - check 校验函数 -->
async checkItem(index) {
      try {
        return await this.$refs[`table_${index}`][0].validate()
      } catch (error) {
        return false
      }
    },
    // 直接调用 check 函数即可
    async check() {
      const result_arr = []
      this.value.contactList.forEach((el, index) => {
        result_arr.push(
          this.checkItem(index)
        )
      })
      try {
        // 单独添加一条其他form-model的验证
        const formData = this.$refs.formData.validate().then(res => res).catch(err => err)
        const all = await Promise.all(result_arr);
        if ([...all, formData].includes(false)) {
          return false
        }
        return true
      } catch (error) {
        return false
      }
    }
antd是一个非常流行的React组件库,其中包含了丰富的UI组件和工具。它提供了一个Table组件用于快速创建数据表格,也提供了Form组件用于创建表单。 在实际应用中,我们通常需要将表格与表单结合使用。一种常见的场景是,当用户点击表格中的一行数据时,需要将该数据的详细信息展示在表单中,以便用户进行编辑或其他操作。 使用antdTable组件和Form组件结合时,我们可以根据需求进行如下操作: 1. 设置表格的选择功能:antdTable组件支持设置行级的选择功能,可以通过设置rowSelection属性来实现,该属性可以指定选择操作的配置项,比如选择模式、默认选中的行、选择时触发的回调函数等。 2. 设置表格的行点击事件:我们可以通过设置Table组件的onRow属性来指定行点击时触发的回调函数,该函数可以接收点击的行索引作为参数,我们可以在回调函数中将该索引赋值给一个状态变量,然后在表单中根据这个状态变量获取点击行的具体数据。 3. 在表单中展示点击行的数据:使用Form组件创建表单时,可以使用getFieldDecorator方法来绑定表单项与数据源,从而实现数据的双向绑定。我们可以通过在表单项的初始值中设置获取点击行数据的方式,从而在表单中展示对应数据。 4. 表单的提交与重置:在表单中编辑完数据后,我们可以通过antdForm组件提供的handleSubmit和handleReset方法来分别处理表单的提交和重置操作。handleSubmit方法会在表单校验通过后触发一个回调函数,我们可以在该回调函数中进行数据的提交操作。handleReset方法会重置表单的所有字段和初始值。 综上所述,antdTable组件和Form组件可以很方便地结合使用,通过设置选择功能、行点击事件以及使用数据绑定和提交重置方法,可以实现自定义的表格与表单交互功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值