上周换到新项目组,依然是vue,不过是搭配element-ui。javascript
这两天开始用el-form,发现了个问题。vue
就是个人表单肯定提交以后,须要重置表单,一开始我没看熟API,直接将form对象手动赋成初始值,可是这样的问题是再打开每一个el-form-item仍是校验成功,java
这时我发现了resetFields方法(对整个表单进行重置,将全部字段值重置为初始值并移除校验结果),因而改用这个方法。element-ui
改了以后出现了另外一个问题,其余字段都重置了,可是有一个form-item里面放的是checkbox,我给的初始值是false,可是重置后变成了true。我觉得我给的值类型不对,后来发现怎么也不行。ui
去看了下elementui form/form-item的源码,发现,必须在每一个form-item里加上prop属性,而且与-model的值相同才能够。this
由于个人checkbox不是必选的,也没什么其余验证,因此一开始没有给prop属性:spa
<el-form-item label="领取限制" prop="limitType"> <el-checkbox v-model="form.limitType">关注公众号才能领取</el-checkbox> </el-form-item>
后来改为了:code
<el-form-item label="领取限制" prop="limitType">
<el-checkbox v-model="form.limitType">关注公众号才能领取
</el-checkbox>
</el-form-item>
rules: {
limitTYpe: []
}
这样才重置成功~orm
来看一下form-item中关于resetField的代码:对象
// 重置字段为初始值 resetField() { this.validateState = ''; this.validateMessage = ''; // 获取model数据模型中所对应的值 let model = this.form.model; // 全部表单数据 let value = this.fieldValue; // 该项表单数据 let path = this.prop; if (path.indexOf(':') !== -1) { path = path.replace(/:/, '.'); } let prop = getPropByPath(model, path, true); this.validateDisabled = true; // 重置为一开始获取的初始值 if (Array.isArray(value)) { prop.o[prop.k] = [].concat(this.initialValue); } else { prop.o[prop.k] = this.initialValue; } // 向下寻找select组件,发布fieldReset事件暴露初始表单数据 this.broadcast('ElTimeSelect', 'fieldReset', this.initialValue); },
能够看到初始值是经过prop计算获得当前path,由path获得getPropByPath的返回值prop,并将prop.o[prop.k]设置为初始值,完成重置。