[ElemeFE/element]el-form-item和整个form清空值的问题

2024-08-13 981 views
6

整个form放在dialog里,form包含id和name,下拉框和输入框,给form赋值时出现问题。 第一次给form赋值为{id:1,name:'a'},关闭dialog的时候清空form的值,第二次给form赋值为{id:2, name:'b'},结果弹框出现后,form的值仍然是{id:1, name: 'a'},请问有没有同学知道这是什么原因,当我把el-form-item的prop属性去掉时,form赋值正常了,但是表单校验失效了。麻烦帮忙看看原因

回答

0

多次试验,好像是Form 的这个方法resetFields有问题,调用后不是重置为空,而是重置为第一次给form赋的值

4

resetFields 中的 reset 就是重置的意思,并不是 clearFields。

0

@Leopoldthecoder 文档上说不是把form的所有值重置为空值么?clearFields是啥意思

1

咦,看起来文档描述有误,我改一下。

9

@Leopoldthecoder 噢噢,那就看官方的考虑吧,我个人觉得还是清空form的model值比较好

8

@Leopoldthecoder 感觉这个resetFields是重置为上一次的值,并不是初始值,文档描述还是有问题还是这是bug?

6

@yushaoyi 一样的问题,每次都是重置为第一次的值,请问兄台有解决办法吗

7

@chenxvhua @AlenWang 额,好久没用vue了,当时是这样处理的





//开启dialog的时候
init: function() {
    this.form.name=  '';
    this.form.phone=  '';
    this.dialogVisible = true;
}
//关闭dialog回调
cancel: function (str) {
    this.form = {
        name: '',
        phone: ''
    };
    this.$refs[str].resetFields();
    this.dialogVisible = false;
},

不知道你的是否可以

4

<el-dialog :close-on-click-modal=false @close="cancel('teacherForm')" :title="dialogTitle" v-model="dialogVisible">

6

问题再细化一下是这样的: 比如我有一个用来修改数据的表单,第一条数据是{name: 'Xixi', age: 12},打开表单后就有两个输入框分别填的是Xixi和12,此时我修改Xixi为Haha,调用this.$refs[].resetFields()后,该表单数据恢复为Xixi和12,这是没问题的。 现在我要修改第二条数据{name: 'Dog', age: 4},打开表单后将Dog修改为Cat,此时我再次调用this.$refs[].resetFields(),表单数据理想情况应该被重置为{name: 'Dog', age: 4},可是实际上会变成第一次传入的数据{name: 'Xixi', age: 12},而理想的重置应该是重置为表单打开后的数据,无论是第几次被打开。

也就是说: 对于增操作,这个resetFields()是有效的,因为每次重置的值都是空。 对于改操作,因为每条数据不同,每次重置需要回到的值不同,但是resetFields()只认第一次打开表单后接收到的数据,这个功能就没用了。

解决办法: 现在我的解决办法是,利用v-if的特性,进行form的销毁和重建,强行让每一次改操作拿到的数据为传说中的初始值。

2

@Holybasil 相当于加载完数据后强行重新新建一个 form ? 可不可以使用 key 标记来解决呢?

7

@kid1412621 key标记组件的重用 是多个组件之间进行对比 而这个表单其实是一个组件进行复用(也就是只用了一次) 你可以前后给这个组件标记不同的key值 但是由于他就是一个组件 所以并不能改变什么

5

<el-dialog v-dialogDrag :visible="edit.dialogVisible" title="编辑" width="60%" :before-close="handleClose" center> <project-form v-if="edit.dialogVisible" @submit="editForm" :form="edit.form" /> </el-dialog> 因为重置表单是让表单回到create时的初始状态,那么每次dialog隐藏的时候就让他从内存里消失,所以我用了v-if指令

7

I also have this problem, like the same scenario of @Holybasil and I have to fix this using the v-if directive on each editForm.

6

我用了你的方法解决了问题,但是有个问题就是动画方面的,form先消失,dialog后消失,这个怎么解决呢?我想让用户感觉不到这种变化。

4

@14glwu 这个动画的问题是这个解决办法的最大bug 暂时没有办法解决呢

0

1.用表单对数据直接进行编辑时,可利用setTimeout机制,设置各项数据初始值为空 image

2.清空表单,可直接使用resetFields image

1

这样子肯定可以啦,这不就相当于重新赋值了嘛

3

created(){ this.form=this.form; }验证过可以

8

我看楼上也是各种骚操作,我认为最优秀的清空方案: this.$refs.form.resetfield() Object.assign(this.form, this.$options.data().form)

2

@wangwanchao 老哥 稳

5

@wangwanchao 溜呀,好方法

9

this.$options.data();获得是实例之前的数据

5

this.$nextTick(() => { this.form.user_id = "111"; ... }); 楼主是用v-if的时候,应该赋值也要$nextTick(),不然也是无效的。

3

`<el-dialog title="编辑" width="30%" :visible.sync="isEdit"

定义一下fade的transition就可以了

5

这才是又骚又稳的操作

4

牛逼

0

大佬没看懂你这个写法,是这么写吗 closeDialog() { // this.$nextTick(() => { // this.$refs['form'].resetFields(); // }); this.$refs.form.resetfield(); Object.assign(this.form, this.$options.data().form) },