编辑-修复-显示详情不准,确解决编辑组件中遇到数据残留的问题

154 阅读2分钟

现状

在编辑时,只有第一次点编辑时,才能正确显示。随后再点编辑,数据显示不正确了

原因

现在的代码中,获取详情这个动作在子组件的created中发出的,而created钩子只会执行一次:后续点击关闭弹层时,子组件被没有销毁,它只是隐藏了。

解决方案1:在关闭弹层时,把子组件销毁

在关闭弹层时,把子组件销毁,再次打开时,重新创建(created再走一遍),就重发请求

image.png

v-if为false时,子组件会被删除!

优点:简单,有效;

缺点:有性能消耗,其中的ajax请求也会随着组件的创建和销毁重复执行

解决方案2:在父组件中通过引用找到子组件

在父组件中,每次打开弹层时,找到子组件,要求它去发请求获取详情

添加引用:

<DeptDialog
        :id="curId"
+       ref="deptDialog"
        :is-edit="isEdit"
        @success="hAddSuccess"
      />

在编辑时:找到子组件,要求它去发请求获取详情

// 用户点了编辑
    hEdit(id) {
      // 1. 保存当前操作的部门编号
      this.curId = id
      // 2.显示弹层
      this.showDialog = true
​
      // 3. 修改isEdit
      this.isEdit = true
​
+     // 获取子组件的引用
+     this.$nextTick(() => {
        console.log('获取子组件的引用', this.$refs.deptDialog)
        console.log('当前的curId', id)
        console.log('获取到子组件中的id--从父传入的', this.$refs.deptDialog.id)
        // 调用子组件的方法
        this.$refs.deptDialog.loadDepartmentDetailById()
      })
    },

解决方案3:在组件内监听id的变化

在子组件内部(deptDialog.vue)添加一个侦听器:监听当前id的变化

watch: {
    // 'id': {
    //   handler: function(newVal, oldVal) {
    //     console.log('id变了! 新值:', newVal, '旧值', oldVal)
    //     // 重发请求获取详情
    //     this.loadDepartmentDetailById()
    //   },
    //   immediate: true
    // }
    'id': function(newVal, oldVal) {
      console.log('id变了! 新值:', newVal, '旧值', oldVal)
      // 重发请求获取详情
      this.loadDepartmentDetailById()
    }
  },

小结

如何判断组件是销毁了,还是隐藏了?在vue调试工具

组件没有销毁,则created/mounted钩子函数只执行一次

解决编辑组件中遇到数据残留的问题-总结

背景:

  • 编辑和新增共用一个组件
  • 编辑会有数据回填 & 表单校验

方案1: v-if 用在子组件上

方案2:

  • 在父组件中点击编辑时,直接通过引用的方式去执行子组件中的加载详情功能,初始化表单数据
  • 弹层隐藏时,清空表单数据

小结:

通过引用去操作组件,尽量少用!