新手上路~VUE3+Element-PLUS dialog弹出框重置表单不生效问题

文章讲述了在Vue应用中遇到的一个问题,即dialog弹窗中的表单在切换操作(如从编辑到新增)时无法正确清空。问题源于父组件通过子组件ref调用的打开和关闭方法。作者发现,当从编辑状态切换到新增状态时,由于之前已经给表单赋值,单纯调用清空方法仍会出现数据回显。解决方案是利用Vue的nextTick在DOM更新后清空表单,确保了数据的正确重置。
摘要由CSDN通过智能技术生成

遇到问题:添加操作,dialog弹出框里面的表单 清空不生效!!!

  • 父组件 核心代码
<tempalte>
    <roleDialog ref="roleDialogRef" @refresh="getTableData()"/>
</template>
<script setup lang="ts">

// 打开新增弹窗
import {defineAsyncComponent, ref} from 'vue';
const roleDialogRef = ref();
// 引入组件
const roleDialog = defineAsyncComponent(() => import('/@/views/system/organization/roleJurisdiction/dialog.vue'));
const onOpenAddPerson = (type: string) => {
  roleDialogRef.value.openDialog(type);
};
// 打开修改弹窗
const onOpenEditDic = (type: string, row: RowRoleJurisdictionType) => {
  roleDialogRef.value.openDialog(type, row);
};
</script>
  • 子组件 核心代码
<script setup lang="ts">
const state = reactive({
  ruleForm: {
    name: '', // 角色名称
    roleCode: '', // 角色编码
    description: '',	// 角色描述
  },
})
// 打开弹窗
const openDialog = (type: string, row: RowRoleJurisdictionType) => {
  if (type === 'edit') {
    state.ruleForm = {...row};  // 对象解构赋值
    state.dialog.title = '修改角色';
    state.dialog.type = 'edita';
    state.dialog.submitTxt = '修 改';
  } else {
    state.dialog.title = '新增角色';
    state.dialog.type = 'add';
    state.dialog.submitTxt = '新 增';
    nextTick(() => {
      roleDialogRef.value.resetFields(); // 清空表单
    });
  }
   state.dialog.isShowDialog = true;
};
// 关闭弹窗
const closeDialog = () => {
  state.dialog.isShowDialog = false;
};
</script>

思考问题:我父组件是通过子组件的ref调用子组件的打开、关闭弹窗方法
我先点击新增,在点击修改,再次点击新增正常。
如果先点击修改,在点击新增,新增里面就会有数据回显,可能是因为点击编辑的时候,已经给表单赋值了导致初始值已经有值了,所以我再次点击新增的时候 调用了清空表单的方法 也一样导致数据回显了

解决问题:中途尝试在关闭dialog弹窗的时候清空表单,也会概率性的出现表单未清空的情况。 官方文档解释:

image.png 重要:数据回显 用 nextTick 包裹解决问题!

// 打开弹窗
const openDialog = (type: string, row: RowRoleJurisdictionType) => {
  if (type === 'edit') {
    state.dialog.title = '修改角色';
    state.dialog.type = 'edita';
    state.dialog.submitTxt = '修 改';
    nextTick(() => {  // 重要!!!
      state.ruleForm = {...row};
    })
  } else {
    state.dialog.title = '新增角色';
    state.dialog.type = 'add';
    state.dialog.submitTxt = '新 增';
    nextTick(() => {
      roleDialogRef.value.resetFields(); // 清空表单
    });
  }
  state.dialog.isShowDialog = true;
};
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
表单验证是前端开发中一项非常重要的工作。Vue3和Element-Plus提供了更加便捷和灵活的表单验证方式。下面是一个示例,使用Vue3和Element-Plus实现表单验证: 1. 安装Element-Plus ```shell npm i element-plus -S ``` 2. 在Vue3项目中引入Element-Plus并注册表单组件 ```javascript import { createApp } from 'vue'; import ElementPlus from 'element-plus'; import 'element-plus/lib/theme-chalk/index.css'; import App from './App.vue'; const app = createApp(App); app.use(ElementPlus); app.mount('#app'); ``` 3. 在Vue3组件中使用Element-Plus表单组件,并设置校验规则 ```html <template> <el-form :model="form" :rules="rules" ref="form" label-width="80px"> <el-form-item label="用户名" prop="username"> <el-input v-model="form.username"></el-input> </el-form-item> <el-form-item label="密码" prop="password"> <el-input v-model="form.password" show-password></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm('form')">提交</el-button> </el-form-item> </el-form> </template> <script> export default { data() { return { form: { username: '', password: '' }, rules: { username: [ { required: true, message: '请输入用户名', trigger: 'blur' }, { min: 3, max: 10, message: '长度在 3 到 10 个字符', trigger: 'blur' } ], password: [ { required: true, message: '请输入密码', trigger: 'blur' }, { min: 6, max: 15, message: '长度在 6 到 15 个字符', trigger: 'blur' } ] } }; }, methods: { submitForm(formName) { this.$refs[formName].validate(valid => { if (valid) { alert('提交成功'); } else { console.log('error submit!!'); return false; } }); } } }; </script> ``` 以上代码实现了一个带有两个输入表单,每个输入都有校验规则,包括必填、长度限制等,点击提交按钮后,会触发表单验证,如果校验通过,则弹出提交成功的提示,否则不会提交表单
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值