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


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

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

    先实现一版,单个表单组件的清空和重置功能,此时 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>
  • 相关阅读:
    图片翻译成中文怎么弄?分享三个图片翻译小技巧
    C++字符串操作【超详细】
    CTFhub-RCE-综合过滤练习
    MySQL数据库 -- 表的约束
    画刷和画笔
    教教大家Win10怎么看处理器是几核
    springboot基本使用十一(自定义全局异常处理器)
    重保特辑|拦截99%恶意流量,揭秘WAF攻防演练最佳实践
    uni-app 背景音频 熄屏或者退回桌面之后不在播放
    【第29例】IPD体系进阶:PL-TMT 产品线技术管理团队
  • 原文地址:https://blog.csdn.net/angel1003645956/article/details/132633953