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>
相关推荐
2501_9462243110 分钟前
旅行记录应用外观设置 - Cordova & OpenHarmony 混合开发实战
javascript·harmonyos·harvester
离&染1 小时前
vue.js2.x + elementui2.15.6实现el-select滚动条加载数据
前端·javascript·vue.js·el-select滚动加载
inferno1 小时前
HTML基础(第一部分)
前端·html
kirinlau1 小时前
pinia状态管理在vue3项目中的用法详解
前端·javascript·vue.js
zhuà!2 小时前
腾讯地图TMap标记反显,新增标记
前端·javascript·vue.js
未知原色2 小时前
web worker使用总结(包含多个worker)
前端·javascript·react.js·架构·node.js
ttod_qzstudio2 小时前
CSS改变图片颜色方法介绍
前端·css
幽络源小助理2 小时前
SpringBoot+Vue摄影师分享社区源码 – Java项目免费下载 | 幽络源
java·vue.js·spring boot
curdcv_po2 小时前
我接入了微信小说小程序官方阅读器
前端·微信小程序