elementui模态框-元素模态框对话框中的select组件被选中时没有任何响应

元素模态框对话框中的select组件被选中时没有任何响应

1.问题描述

准确的说,是对话框的el-from组件中的el-select组件。 当模态框打开时,select绑定的数据会被重新参数化为value1,select的视口状态也会变成value1,但是后面的option选项会发生变化。 ,选择视图图层*不再更新。

一般情况下,在创建或编辑数据时,会弹出一个对话框模式框,以弹窗的形式对数据进行编辑和更改。

<el-dialog :visible.sync="dialogEdit">
    <el-form ref="editValidateForm" :model="editValidateForm">
    	...
        <el-form-item prop="workType" label="类型:">
            <el-select v-model="editValidateForm.workType" 
                       placeholder="请选择类型" 
                       @change="handleChange">
                <el-option v-for="(item,index) in types" 
                           :key="index" 
                           :label="item.name" 
                           :value="item.value">
                    {{item.name}}
                </el-option>
            </el-select>
        </el-form-item>
    </el-form>
</el-dialog>

editValidateForm 在 data 中会有一组初始数据:

export default {
   name: "test",
   data(){
       return{
           editValidateForm:{
           	...
               workType:'',
           }
       }
   },
   methods:{
   		open(){},
   		handleChange(){}
   }
}

2.问题情况1

如果只是用dialogEdit=true打开模态框,不重新参数化表单数据,就不会有问题。

如果有问题elementui模态框,可能是vue或者element版本的bug。 我用的是elemnt2.4.6,没有这个bug,这里就不解释这些情况了。

3.问题情况2

如果在打开对话框时对此数据设置正式参数:

this.editValidateForm.worktType = 1

会听说select的选中项变成1,但是以后就不能选择其他选项了。

其实只是视口没有更新而已。 select的change方法中,改变了this.editValidateForm.worktType的值。

这个问题好像是因为下拉框中的数据是通过回收其他socket得到的。 由于数据层太多,渲染函数不能手动更新,需要自动刷新

3.1 尝试1

由此,我想到了vue文档中所说的,当使用索引直接设置链表中原本不存在的一项时

this.items[索引] = newValue

视图不会更新。 为了解决这些情况,Vue 提供了一个 set 方法 vm.$set(target, propertyName/index, value),它使用该参数来更新视图。 与这里的问题类似,我尝试使用设置参数:

this.$set(this.editValidateForm,'workType','1');

问题解决了,这个方法应该是强制刷新,对我的情况有效

3.2 尝试2

从强制刷新这一点出发,还有另外一种解决方案,vue API文档中也提供了vm.$forceUpdate()方法:

强制 Vue 实例重新渲染。 请注意,它仅影响实例本身和插入套接字内容的子组件,而不影响所有子组件。

模态框vue_elementui框架_elementui模态框

我们参考旧的形式,但是在select的change函数中添加这个方法:

open(){
	..
	this.editValidateForm.worktType = 1
}
handleChange(){
	this.$forceUpdate();
}

也解决了这个问题。

3.3 尝试3

编辑时,因为这条数据已经存在,所以点击数据请求数据信息,数据在成功反弹中正式参数化如下:

requestApi(params).then(function(res) {
	this.editValidateForm =  res.data;
})

在这些情况下,不存在此类错误。 因此,虽然目标只是重新参数化workType项,但也有必要给整个this.editValidateForm对象一个参数:

this.editValidateForm = {
	...
	workType:"1"
}

模态框vue_elementui框架_elementui模态框

问题解决了。 但这比较冗长,对于一个属性,需要重新参数化整个对象。

3.4 尝试4

尝试3也是在对话框中,但是给表单中的select组件绑定一个data子属性级别的data,也就是说将绑定的workType移到与editValidateForm同一级别也可以解决这个问题:

<el-form-item label="类型:">
    <el-select v-model="workType" 
               placeholder="请选择类型">
        <el-option v-for="(item,index) in types" 
                   :key="index" 
                   :label="item.name" 
                   :value="item.value">
            {{item.name}}
        </el-option>
    </el-select>
</el-form-item>
data(){
       return{
      	   workType:'',
           editValidateForm:{
           	... 
           }
       }
   },

3.5 尝试5

因为这是修改别人的代码,我发现里面的方法确实可以解决我的问题elementui模态框,但是这里我的视图没有更新的真正原因是上一行代码,去掉之后,这个问题就不存在了:

 methods:{
	open(){
		 this.editValidateForm = {};	//问题所在
		 this.editValidateForm.worktType = 1
	},
}

想了想,我觉得应该是这样的:首先将表单对象editValidateForm设置为空对象,那么这个对象之前的所有属性包括worktType都将不存在,然后使用“.”的形式。 形式参数。 这样,情况并不类似于尝试1中提到的情况,而是同样的问题:

数组更新检查

防范措施

由于 JavaScript 限制,Vue 无法检查以下更改列表:

当您直接通过索引设置项目时,例如: vm.items[indexOfItem] = newValue

对象修改检查注意事项

还是因为 JavaScript 的限制,Vue 无法检查对象属性的添加或删除:

对于已经创建的实例,Vue 无法动态添加根级响应式属性。但是,可以使用 Vue.set(object, propertyName, value) 方法向嵌套对象添加响应式属性

所以尝试3能解决的问题关键在于它是现有editValidateForm对象的形参

在Vue中,当你直接使用“.”时对不存在的属性或对象使用index参数,或者对链表中不存在的索引项直接使用index参数,从控制台复制可以看到数据变化,但视图无法显示。 更新

因此,即使表单不在对话框中,形参也不会更新视图。在这些情况下,可以尝试前面的方法