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

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

    我们如何查看组件有没有被销毁? 在调试工具vue里面看

    那么我们如何去解决呢?

    解决方案1: 在关闭弹层的时候,把子组件销毁了
    在关闭弹层的时候,把子组件销毁,再次打开,重新创建(也就是created再走一遍 , 这样就可以
    每一次调用回填的请求了)
    实现代码: 简单粗暴
    image.png
    image.png

    说明: v-if为false的时候,子组件就会被删除,这样每次把弹层打开,为true的时候,子组件就会又被创建(create ,就又会
    发送一次请求了)
    优点: 简单有效,粗暴

    解决方案2: 在父组件中通过引用找到子组件
    在父组件中,每次打开弹层时,找到子组件,要求它去发请求获取详情(这个请求是需要id的)

    实现代码:
    1.添加引用: image.png

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

    1. // 用户点了编辑
    2. hEdit(id) {
    3. // 获取子组件的引用
    4. this.$nextTick(() => {
    5. console.log('获取子组件的引用', this.$refs.refDialog)
    6. console.log('当前的curId', id)
    7. console.log('获取到子组件中的id--从父传入的', this.$refs.refDialog.id)
    8. // 调用子组件的方法
    9. this.$refs.refDialog.loadDepartmentDetailById() ****
    10. // 这里的 loadDepartmentDetailById 调用的是子组件的方法,这个方法就是封装的回填
    11. // 的请求函数,它不是固定写法
    12. })
    13. },

    注意:
    1. 相信我们可看到了这个为什么会加一个$nextTick()
    2. 首先我们这个时候出现了一个bug : 就是这样直接获取子组件的时候重新调用的ajax的方法(就是调用回填的这
    个请求),是不行的,我们这个请求是需要id的,但是直接这样获取总是拿到上一次的id值,这是为什么呢?
    3. 因为是根据当前的id来的,又因为这个props是异步的,在我们调用这个方法的时候,它就已经去执行了,但是数据还没到呢! 所以我们拿到的总是上一次旧值来发的请求,所以你会发现永远点编辑回填的都是你上一次点编辑的数据(除了第一次),这就是vue数据更新这个过程是异步的,解决方法就是,让调用这个过程变成异步,也就是让它慢一点执行,就可以等等这个props里面的id传递了
    4. 注意第一次点击编辑是不会调用这个方法的,

    解决方案3: 在组件内监听id的变化
    在子组件内部添加一个侦听器:监听当前id的变化

    1. watch: {
    2. // 'id': {
    3. // handler: function(newVal, oldVal) {
    4. // console.log('id变了! 新值:', newVal, '旧值', oldVal)
    5. // // 重发请求获取详情
    6. // this.loadDepartmentDetailById()
    7. // },
    8. // immediate: true
    9. // }
    10. 'id': function(newVal, oldVal) {
    11. console.log('id变了! 新值:', newVal, '旧值', oldVal)
    12. // 重发请求获取详情
    13. this.loadDepartmentDetailById()
    14. }
    15. },


    1. <br />