element-ui让el-form绑定的深层对象也能通过内置的resetFields方法重置

先看需求场景(当我们绑定的formData中有嵌套对象时,el-form的resetFields并不能帮我们重置)

vue 复制代码
<template>
    <el-form :model="formData">
        <!--  
        ...
        ...这里el-form-item都绑定了prop
        ...
        -->
    </el-form>
</template>
<script>
export default {
    data () {
        return {
            formData: {
                prop1: '',
                prop2: [],
                prop3: {
                    subProp1: '',
                    subProp2: ''
                }
            }
        }
    }
}
</script>

二次封装覆盖el-form-item源码中的方法

vue 复制代码
<script>
import Vue from 'vue';
import elFormItem from 'element-ui/lib/form-item';
import { getPropByPath } from 'element-ui/src/utils/util';
import { cloneDeep } from 'lodash';

function isObject(obj) {
  return obj !== null && typeof obj === 'object' && !Array.isArray(obj);
}

export default Vue.extend({
  extends: elFormItem,
  data() {
    return {
      internalInitialValue: null,
    };
  },
  mounted() {
    if (this.prop) {
      this.internalInitialValue = isObject(this.initialValue) ? cloneDeep(this.initialValue) : this.initialValue;
    }
  },
  methods: {
    // 重置resetField方法
    resetField() {
      this.validateState = '';
      this.validateMessage = '';

      let model = this.form.model;
      let value = this.fieldValue;
      let path = this.prop.replace(/:/, '.');

      let prop = getPropByPath(model, path, true);
      this.validateDisabled = true;

      if (Array.isArray(value)) {
        prop.o[prop.k] = [].concat(this.internalInitialValue);
      } else if (isObject(this.internalInitialValue)) {
        prop.o[prop.k] = cloneDeep(this.internalInitialValue);
      } else {
        prop.o[prop.k] = this.internalInitialValue;
      }

      this.$nextTick(() => {
        this.validateDisabled = false;
      });
    },
  },
});
</script>
相关推荐
剪刀石头布啊2 分钟前
iframe通信、跨标签通信的常见方案
前端·javascript·html
宇之广曜11 分钟前
搭建 Mock 服务,实现前端自调
前端·mock
yuko093113 分钟前
【手机验证码】+86垂直居中的有趣问题
前端
用户15129054522016 分钟前
Springboot中前端向后端传递数据的几种方式
前端
阿星做前端17 分钟前
如何构建一个自己的 Node.js 模块解析器:node:module 钩子详解
前端·javascript·node.js
用户15129054522020 分钟前
Web Worker:让前端飞起来的隐形引擎
前端
司宸21 分钟前
学习笔记十 —— 自定义hooks设计原则 笔试实现
前端
用户15129054522025 分钟前
踩坑与成长:WordPress、MyBatis-Plus 及前端依赖问题解决记录
前端·后端
半个烧饼不加肉31 分钟前
React + ts + react-webcam + CamSplitter 实现虚拟摄像头解决win摄像头独占的问题
前端·react.js·前端框架
上单带刀不带妹1 小时前
JavaScript 中的宏任务与微任务
开发语言·前端·javascript·ecmascript·宏任务·微任务