实现通用的表单清空重置功能

第一版单个表单实现功能并一步步优化

通过一步步代码的优化,实现清空重置功能,尽量做到抽离后,可以直接复用,不需要修改任何变量名

先实现一版,单个表单组件的清空和重置功能,此时 form1 组件可以实现parent.vue父组件中调用 form1 和 form2

<template>
  <div>
    <form1 />
    <hr />
    <form2 />
  </div>
</template>
<script>
  import form1 from "@/components/form1.vue";
  import form2 from "@/components/form2.vue";
  export default {
    components: {
      form1,
      form2,
    },
  };
</script>

form1.vue

<template>
  <div>
    用户名:<input type="text" v-model="form1.username" /> 昵称:<input
      type="text"
      v-model="form1.nickname"
    />
    <button @click="clean">清空</button>
    <button @click="recover">重置</button>
  </div>
</template>
<script>
  export default {
    created() {
      // 模拟发送请求 更改数据
      setTimeout(() => {
        this.form1 = { username: "admin", nickname: "echo" };
        this.original = JSON.parse(JSON.stringify(this.$data)); // 备份数据
      }, 1000);
    },
    data() {
      return {
        form1: { username: "", nickname: "" },
      };
    },
    methods: {
      clean() {
        // 最容易想到的实现 1. 属性名固定不利于复用和维护
        //   this.form1 = {
        //     username: "",
        //     nickname: "",
        //   };

        //   框架提供了this.$option 可以获取到data中定义的属性
        //   this.form1 = this.$options.data().form1; // 进阶:2. 可以做到清空,但不建议,避免直接操作自定义的属性,便于方法抽离和复用

        //   this.$data = this.$options.data(); // 报错:避免修改根实例的data属性的指向,可以通过覆盖属性来替换
        Object.assign(this.$data, this.$options.data()); // 最终 3. 使用覆盖属性,而不是直接改变对象的指向
      },
      recover() {
        //   this.form1 = JSON.parse(JSON.stringify(this.original)); // 最容易想到的实现 1. 避免直接操作自定义的属性
        //   this.$data = JSON.parse(JSON.stringify(this.original)); // error 不能修改根实例的data属性的指向
        Object.assign(this.$data, JSON.parse(JSON.stringify(this.original))); // 最终 2. 使用覆盖属性,
      },
    },
  };
</script>

公共方法抽离 mixins 混入

如果 form2 中,同样想要实现 form1 中的清空和重置功能,就可以将公共的部分抽取成mixins进行混入

抽离的公共方法文件formOperation.js,(此文件中取消了优化过程和注释)

export default {
  methods: {
    save() {
      this.original = JSON.parse(JSON.stringify(this.$data));
    },
    clean() {
      Object.assign(this.$data, this.$options.data());
    },
    recover() {
      Object.assign(this.$data, JSON.parse(JSON.stringify(this.original)));
    },
  },
};

终版 form1 和 form2 组件实现

此时 form1 中的代码简化为:

<template>
  <div>
    用户名:<input type="text" v-model="form1.username" /> 昵称:<input
      type="text"
      v-model="form1.nickname"
    />
    <button @click="clean">清空</button>
    <button @click="recover">重置</button>
  </div>
</template>
<script>
  import formOperation from "../mixins/formOperation";
  export default {
    mixins: [formOperation],
    created() {
      setTimeout(() => {
        this.form1 = { username: "admin", nickname: "echo" };
        this.save();
      }, 1000);
    },
    data() {
      return {
        form1: { username: "", nickname: "" },
      };
    },
  };
</script>

此时 form2 中的代码简化为:其中表单数据中的属性名可以随意定义,而抽取的公共方法,不需要进行任务的修改,同样可以实现上述功能

<template>
  <div>
    用户名:<input type="text" v-model="form2.a" /> 昵称:<input
      type="text"
      v-model="form2.b"
    />
    <button @click="clean">清空</button>
    <button @click="recover">重置</button>
  </div>
</template>
<script>
  import formOperation from "../mixins/formOperation";
  export default {
    mixins: [formOperation],
    created() {
      setTimeout(() => {
        this.form2 = { a: "test", b: "yya" };
        this.save();
      }, 1000);
    },
    data() {
      return {
        form2: { a: "", b: "" },
      };
    },
  };
</script>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
清空 ElementUI 表单的内容,可以通过以下步骤实现: 1. 获取表单对象 ```javascript const form = this.$refs.formName; ``` 其中,`formName` 是表单的 `ref` 属性值。 2. 重置表单 ```javascript form.resetFields(); ``` 这个方法会将表单中的所有输入框的值清空,并将验证状态重置。 3. 清空自定义组件的值 如果表单中包含自定义组件,需要在自定义组件实现清空值的方法,并在表单重置调用方法。 完整的代码示例: ```javascript <template> <el-form ref="form" :model="formData" label-width="80px"> <el-form-item label="姓名" prop="name"> <el-input v-model="formData.name"></el-input> </el-form-item> <el-form-item label="性别" prop="gender"> <el-radio-group v-model="formData.gender"> <el-radio label="male">男</el-radio> <el-radio label="female">女</el-radio> </el-radio-group> </el-form-item> <el-form-item label="爱好" prop="hobby"> <el-checkbox-group v-model="formData.hobby"> <el-checkbox label="reading">阅读</el-checkbox> <el-checkbox label="music">音乐</el-checkbox> <el-checkbox label="sports">运动</el-checkbox> </el-checkbox-group> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm">提交</el-button> <el-button @click="resetForm">重置</el-button> </el-form-item> </el-form> </template> <script> export default { data() { return { formData: { name: '', gender: '', hobby: [] } }; }, methods: { submitForm() { this.$refs.form.validate(valid => { if (valid) { // 提交表单 } else { return false; } }); }, resetForm() { this.$refs.form.resetFields(); // 清空自定义组件的值 this.$refs.customComponent.resetValue(); } } }; </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值