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


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

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

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

    1. <template>
    2. <div>
    3. <form1 />
    4. <hr />
    5. <form2 />
    6. div>
    7. template>
    8. <script>
    9. import form1 from "@/components/form1.vue";
    10. import form2 from "@/components/form2.vue";
    11. export default {
    12. components: {
    13. form1,
    14. form2,
    15. },
    16. };
    17. script>

    form1.vue

    1. <template>
    2. <div>
    3. 用户名:<input type="text" v-model="form1.username" /> 昵称:<input
    4. type="text"
    5. v-model="form1.nickname"
    6. />
    7. <button @click="clean">清空button>
    8. <button @click="recover">重置button>
    9. div>
    10. template>
    11. <script>
    12. export default {
    13. created() {
    14. // 模拟发送请求 更改数据
    15. setTimeout(() => {
    16. this.form1 = { username: "admin", nickname: "echo" };
    17. this.original = JSON.parse(JSON.stringify(this.$data)); // 备份数据
    18. }, 1000);
    19. },
    20. data() {
    21. return {
    22. form1: { username: "", nickname: "" },
    23. };
    24. },
    25. methods: {
    26. clean() {
    27. // 最容易想到的实现 1. 属性名固定不利于复用和维护
    28. // this.form1 = {
    29. // username: "",
    30. // nickname: "",
    31. // };
    32. // 框架提供了this.$option 可以获取到data中定义的属性
    33. // this.form1 = this.$options.data().form1; // 进阶:2. 可以做到清空,但不建议,避免直接操作自定义的属性,便于方法抽离和复用
    34. // this.$data = this.$options.data(); // 报错:避免修改根实例的data属性的指向,可以通过覆盖属性来替换
    35. Object.assign(this.$data, this.$options.data()); // 最终 3. 使用覆盖属性,而不是直接改变对象的指向
    36. },
    37. recover() {
    38. // this.form1 = JSON.parse(JSON.stringify(this.original)); // 最容易想到的实现 1. 避免直接操作自定义的属性
    39. // this.$data = JSON.parse(JSON.stringify(this.original)); // error 不能修改根实例的data属性的指向
    40. Object.assign(this.$data, JSON.parse(JSON.stringify(this.original))); // 最终 2. 使用覆盖属性,
    41. },
    42. },
    43. };
    44. script>

    公共方法抽离 mixins 混入

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

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

    1. export default {
    2. methods: {
    3. save() {
    4. this.original = JSON.parse(JSON.stringify(this.$data));
    5. },
    6. clean() {
    7. Object.assign(this.$data, this.$options.data());
    8. },
    9. recover() {
    10. Object.assign(this.$data, JSON.parse(JSON.stringify(this.original)));
    11. },
    12. },
    13. };

    终版 form1 和 form2 组件实现

    此时 form1 中的代码简化为:

    1. <template>
    2. <div>
    3. 用户名:<input type="text" v-model="form1.username" /> 昵称:<input
    4. type="text"
    5. v-model="form1.nickname"
    6. />
    7. <button @click="clean">清空button>
    8. <button @click="recover">重置button>
    9. div>
    10. template>
    11. <script>
    12. import formOperation from "../mixins/formOperation";
    13. export default {
    14. mixins: [formOperation],
    15. created() {
    16. setTimeout(() => {
    17. this.form1 = { username: "admin", nickname: "echo" };
    18. this.save();
    19. }, 1000);
    20. },
    21. data() {
    22. return {
    23. form1: { username: "", nickname: "" },
    24. };
    25. },
    26. };
    27. script>

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

    1. <template>
    2. <div>
    3. 用户名:<input type="text" v-model="form2.a" /> 昵称:<input
    4. type="text"
    5. v-model="form2.b"
    6. />
    7. <button @click="clean">清空button>
    8. <button @click="recover">重置button>
    9. div>
    10. template>
    11. <script>
    12. import formOperation from "../mixins/formOperation";
    13. export default {
    14. mixins: [formOperation],
    15. created() {
    16. setTimeout(() => {
    17. this.form2 = { a: "test", b: "yya" };
    18. this.save();
    19. }, 1000);
    20. },
    21. data() {
    22. return {
    23. form2: { a: "", b: "" },
    24. };
    25. },
    26. };
    27. script>
  • 相关阅读:
    BFS:多源BFS问题
    深度学习 Pytorch笔记 B站刘二大人 梯度下降算法 Gradient-Descend 数学推导与源码实现 (2/10)
    软考高级软件架构风格定义以及分类
    室内设计常用的涂料清单
    Hadoop学习总结(Shell操作)
    java反射机制
    win10电脑不小心卸载的软件怎么恢复
    【网络编程】套接字编程——UDP通信
    企业业务中台应用架构和技术架构
    Java RMI详解
  • 原文地址:https://blog.csdn.net/angel1003645956/article/details/132633953