zoukankan      html  css  js  c++  java
  • element:记一次重置表单引发提交数据为默认数据现象

    需求

    前端表单提交后,关闭弹出对话框

    现象

    前端提交后,不关闭(重置)对话框情况下有数据,关闭对话框后,提交数据为默认数据

    现象代码

    表单组件代码

    <template>
      <!-- 表单内容主体 -->
      <div>
        <el-form ref="addFormRef" :model="formData" :size="formAttributes.size" :inline="formAttributes.inline" :label-width="formAttributes.labelWidth">
          <div v-for="(item, index) in formItemList" :key="index">
            <!-- <el-form-item :prop="item.prop" :label="item.label" :rules="item.rules"> -->
            <el-form-item :prop="formItemList[index].prop" :label="item.label" :rules="item.rules">
              <!-- text输入框 -->
              <el-input v-if="item.type==='text'" v-model="formData[item.prop]" clearable :placeholder="item.placeholder"></el-input>
              <!-- textarea输入框 -->
              <el-input v-if="item.type==='textarea'" v-model="formData[item.prop]" clearable autosize :type="textarea" :placeholder="item.placeholder"></el-input>
              <!-- 下拉框 -->
              <el-select v-if="item.type==='select'" v-model="formData[item.prop]" clearable :multiple="item.multiple">
                <el-option v-for="op in item.options" :key="op.value" :label="op.label" :value="op.value"></el-option>
              </el-select>
              <el-switch v-if="item.type==='switch'" v-model="formData[item.prop]" :label="item.label"></el-switch>
    
              <template v-if="item.type==='json'">
                <div v-for="(json_item, json_index) in item.item" :key="json_index">
                  <!-- <el-form-item :prop="item.prop + '.' + json_item.prop" :label="json_item.label" :rules="json_item.rules" style="margin-left: -80px;"> -->
                  <el-form-item :prop="formItemList[index].prop + '.' + item.item[json_index].prop" :label="json_item.label" :rules="json_item.rules" style="margin-left: -80px;">
                    <!-- text输入框 -->
                    <el-input v-if="json_item.type==='text'" v-model="formData[item.prop][json_item.prop]" clearable :placeholder="json_item.placeholder"></el-input>
                    <!-- textarea输入框 -->
                    <el-input v-if="json_item.type==='textarea'" v-model="formData[json_item.prop]" clearable autosize :type="textarea" :placeholder="json_item.placeholder"></el-input>
                    <!-- 下拉框 -->
                    <!-- <el-select v-if="item.type==='select'" v-model="formData[item.prop]" clearable :placeholder="item.label" :multiple="item.multiple" @change="item.change(formData[item.prop])"> -->
                    <el-select v-if="json_item.type==='select'" v-model="formData[json_item.prop]" clearable :multiple="json_item.multiple">
                      <el-option v-for="op in json_item.options" :key="op.value" :label="op.label" :value="op.value"></el-option>
                    </el-select>
                    <el-switch v-if="json_item.type==='switch'" v-model="formData[json_item.prop]" :label="json_item.label"></el-switch>
                  </el-form-item>
                </div>
              </template>
    
            </el-form-item>
          </div>
        </el-form>
        <el-divider></el-divider>
        <span slot="footer" class="dialog-footer">
          <el-button @click="resetForm">重置</el-button>
          <el-button type="primary" @click="validateFormData">提交</el-button>
        </span>
      </div>
    </template>
    
    <script>
    
    export default {
      name: 'DynamicForm',
      props: {
        formAttributes: {
          type: Object,
          default: () => { }
        },
        formData: {
          type: Object,
          default: () => { }
        },
        formItemList: {
          type: Array,
          default: () => []
        }
      },
      data() {
        return {
        }
      },
      methods: {
        // 重置表单数据和验证规则
        resetForm() {
          this.$refs.addFormRef.resetFields()
        },
        // 验证表单和提交数据给父组件
        validateFormData() {
          this.$refs.addFormRef.validate(valid => {
            if (valid) {
              this.$emit('callFather', this.formData)
            } else {
              return false
            }
          })
        }
      }
    }
    </script>
    

    views使用表单组件关键代码

    <!-- template代码 -->
        <el-dialog title="添加菜单" :visible.sync="addDialogVisible" width="50%" :close-on-click-modal="false" @closed="addDialogClosed">
          <!-- 动态表单 -->
          <DynamicForm ref="child" :form-attributes="formAttributes" :form-item-list="formItemList" :form-data="formData" @callFather="submitForm"></DynamicForm>
    
        </el-dialog>
    
    <!-- script下methods代码,为了方便复现,这里用重置表单代替关闭表单 -->
    submitForm(data) {
          this.listLoading = true
          if (!data) return false
          addMenu(data).then(response => {
            console.log(data)
            console.log(response)
          })
          this.$refs.child.resetForm()
          // this.addDialogVisible = false
          this.listLoading = false
        }
    

    以上就是触发现象代码,为了方便展示,我在后端处理返回前端请求参数

    现象截图

    为了方便查看有没有数据提交到后端,这里先注释 submitForm 方法下的 this.$refs.child.resetForm() 语句

    submitForm(data) {
          this.listLoading = true
          if (!data) return false
          addMenu(data).then(response => {
            console.log(data)
            console.log(response)
          })
          // this.$refs.child.resetForm()
          // this.addDialogVisible = false
          this.listLoading = false
        }
    

    从上面的图可以看到此时提交数据不为空

    还原重置数据表单提交数据为空

    submitForm(data) {
          this.listLoading = true
          if (!data) return false
          addMenu(data).then(response => {
            console.log(data)
            console.log(response)
          })
          this.$refs.child.resetForm()
          // this.addDialogVisible = false
          this.listLoading = false
        }
    


    从图中看到此时重置表单,提交数据为空,关闭表单也是同样的现象

    解决方法

    采用 $nextTick 触发重置或者关闭表单,此时表单提交数据不会被重置为默认表单数据

    submitForm(data) {
          this.listLoading = true
          if (!data) return false
          addMenu(data).then(response => {
            console.log(response.data)
          })
          this.$nextTick(
            this.addDialogVisible = false
          )
          this.listLoading = false
        }
    

    从上图可以看到,此时提交了表单,关闭表单后,提交数据不会重置为默认值

  • 相关阅读:
    用户体验的时间尺度
    ibatis的xml中的dtd问题
    ASP.NET AJAX调用服务
    C#打包安装与卸载
    学习 WCF (6)学习调用WCF服务的各种方法
    C#.NET ActiveX控件的制作
    如何使用C#开发“类ActiveX组件”
    Asp.Net框架下WebService和Remoting的区别
    今天打开网站,突然发现sql 2005出现错误:数据库 'mybase_db' 的事务日志已满。若要查明无法重用日志中的空间的原因,请参阅 sys.databases 中的 log_reuse_wait_desc 列。
    VS部署中的ProductCode问题
  • 原文地址:https://www.cnblogs.com/AutoSmart/p/15765445.html
Copyright © 2011-2022 走看看