使用ELementPlus表单的resetFields不生效

在Vue.js应用中,遇到一个问题,即在Dialog组件中使用resetFields()方法无法清空表单。问题出现在编辑模式下关闭弹窗后打开新增弹窗,表单未能被正确重置。原因可能是el-form组件会记住首次打开时的值作为默认值。解决办法是设置一个默认值对象,在新建模式下将表单数据重置为这个默认值,通过watch监听并判断场景来实现清空操作。
摘要由CSDN通过智能技术生成

需求:由于业务需求新增编辑使用同个dialog框,编辑根据id向后端获取数据回显,新增应直接清空dialog内的表单

问题: 直接打开新增弹窗没有问题,打开编辑弹窗关闭后打开新增弹窗 代码中已经使用了resetFields()进行表单清空无效

代码如下

<template>
  <Dialog
    class="wg-dialog"
    v-model="dialogVisible"
    :title="dialogTitle"
    width="1000px"
    :close-on-click-modal="false"
  >
    <div style="display: flex">
      <div style="width: 55%; border-right: 1px solid #cccccc">
        <div class="sub-title"><span class="blue-icon"></span>素材信息</div>
        <div>
          <el-form
            class="-mb-15px"
            :model="sourceForm"
            ref="groupFormRef"
            :rules="rules"
            label-width="100px"
          >
            <el-form-item label="素材类型" prop="materialType">
              <el-radio-group
                :disabled="dialogTitle !== '新建素材'"
                style="margin: 0 10px"
                v-model="sourceForm.materialType"
                size="default"
                @change="changeType($event)"
              >
                <el-radio-button label="0">文本</el-radio-button>
                <el-radio-button label="1">图片</el-radio-button>
                <el-radio-button label="2">图文</el-radio-button>
                <el-radio-button label="3">音频</el-radio-button>
                <el-radio-button label="4">视频</el-radio-button>
                <el-radio-button label="5">文件</el-radio-button>
              </el-radio-group>
            </el-form-item>
            <el-form-item label="归属分组" prop="groupIds">
              <el-tree-select
                class="select-input"
                node-key="id"
                check-strictly
                :props="treeProps"
                :render-after-expand="false"
                v-model="sourceForm.groupIds"
                multiple
                :data="belongOptions"
                :default-expanded-keys="[100]"
              >
                <template #default="{ data }">
                  <span>{{ `${data.groupName}(${data.topicNum})` }}</span>
                </template>
              </el-tree-select>
            </el-form-item>
            <el-form-item label="标题" prop="title">
              <el-input
                style="width: 87%"
                v-model="sourceForm.title"
                placeholder="请输入标题"
                clearable
                show-word-limit
                maxlength="50"
              />
            </el-form-item>
            <el-form-item label="搜索关键词" prop="searchTerm">
              <el-input
                style="width: 87%"
                v-model="sourceForm.searchTerm"
                placeholder="多个关键词逗号隔开(,)"
              />
            </el-form-item>
            <el-form-item label="内容标签" prop="contentTag">
              <el-input
                style="width: 87%"
                v-model="sourceForm.contentTag"
                placeholder="多个标签逗号隔开(,)"
              />
            </el-form-item>
            <el-form-item label="设为雷达链接" prop="isRadarLink">
              <el-switch v-model="sourceForm.isRadarLink" :active-value="1" :inactive-value="0" />
            </el-form-item>
   
    <template #footer>
      <div>
        <el-button type="primary" :loading="subLoading" @click="confirm">确定</el-button>
        <el-button @click="cancel">取消</el-button>
      </div>
    </template>
  </Dialog>
</template>
<script setup lang="ts">
const sourceForm = ref({
  materialType: 0,
  groupIds: '',
  title: '',
  searchTerm: '',
  isRadarLink: '',
  contentTag: '',
})
const groupFormRef = ref<FormInstance>()
const openDialog = async (type, data) => {
  dialogTitle.value = type === 'create' ? '新建' : '编辑'
  dialogVisible.value = true
  if (data) {
    const res = await getSourceDetails({ id: data.id })
    nextTick(() => {
      sourceForm.value = res
      image.value = res.filePaths
      console.log('image.value',image.value)
      sourceForm.value.groupIds = res.attributionGroup
    })
  }else{
    groupFormRef.value?.resetFields()
  }
}

defineExpose({ openDialog }) // 提供 openModal 方法
</script>

按照上面的代码 使用resetFields()无法进行清空,考虑到可能是没有监听到ref的问题

于是使用watch进行监听,依然无法重置

watch(
  groupFormRef,
  (val) => {
    if (val && dialogTitle.value === '新建') {
     //这里的ref打印出来是有值的,但是依然无法进行清空
       console.log('groupFormRef.value', groupFormRef.value)
       groupFormRef.value?.resetFields()
    }
  },
  {
    deep: true
  }
)

于是在网上百度查到的原因可能是

el-form会记录第一次打开的值当做表单的默认值 ,在后续调用resetFields会将当前绑定的数据对象设置为el-form的默认值

1.编辑时

const res = await getSourceDetails({ id: data.id })
sourceForm.value = res

dialogVisible.value = true (此时将第一次打开的formValue值当成是默认值)

2.关闭

groupFormRef.value?.resetFields() (此处重置有问题 会将当前的form值重置为返回的res的值)

所以采用下面的办法解决

const defaultValue = {
  materialType: 0,
  groupIds: '',
  title: '',
  searchTerm: '',
  isRadarLink: 1,
  contentTag: '',
  graphic: '',
  author: '',
  link: '',
  isShare: 0,
  isEfficient: 1, //是否有效 默认为1
  isSuitableBrand: 0,
  suitableBrands: null,
  isSuitableMechanism: 0,
  suitableMechanisms: null,
  isShow: 1,
  efficientType: 0,
  efficientTimes: null,
  materialSource: '系统维护',
  files: <any>[]
}

//素材信息
const sourceForm = ref(defaultValue)

watch(
  groupFormRef,
  (val) => {
    if (val && dialogTitle.value === '新建素材') {
      sourceForm.value = defaultValue
    }
  },
  {
    deep: true
  }
)

这样就可以清空啦!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值