javascript - 如何判断 Vue 组件是否已卸载以防止异步函数访问已卸载组件的数据?

标签 javascript vue.js

请参阅这个最小示例

import Vue from 'vue';

Vue.extend({
  data() {
    return {
      name: 'James',
    };
  },
  methods: {
    greet() {
      setTimeout(() => {
        const componentIsUnmounted = ???; // How do I tell if component is unmounted?

        if (!componentIsUnmounted) {
          console.log(this.name);
        }
      }, 300);
    },
  },
});

正如你所看到的,我有一个带有异步函数的组件,当你调用它时,它会在300ms后触发,到那时,Vue组件可能会被卸载。

我想我可以通过 Lodash 的 uniqueID() 在全局中存储一个标志来做到这一点函数在 mounted()beforeDestroyed() 创建唯一 ID。

还有其他更简单的方法吗?

最佳答案

这是我刚刚使用的,效果很好。

创建超时时,将 ID 存储在 this 上。然后在 beforeDestroy 上,使用 ID 调用 clearTimeout。即使您事先手动取消超时,clearTimeout也不会失败。

<script>
  export default {
    created() {
      this.timeoutId = setTimeout(() => {}, 1000)
    },

    beforeDestroy() {
      clearTimeout(this.timeoutId)
    }
  }
</script>

无需在 data 属性中设置它,因为它不是响应式的。

关于javascript - 如何判断 Vue 组件是否已卸载以防止异步函数访问已卸载组件的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59681762/

相关文章:

javascript - 针对 javascript 中的多个正则表达式测试字符串

javascript Uncaught ReferenceError : e is not defined

javascript - 对象字面量变量在创建对象的语句内未定义

javascript - 如何授权 amazon pay 请求到 "get checkout session"?

javascript - 使用mutationobservers检测获取请求结果的变化

javascript - 将 Vue 与 Vuex 结合使用时清除输入字段

javascript - 如何结束管道式http请求?

javascript - jQuery 与 kwicks Accordion 的问题

javascript - 是否有任何 JavaScript 方法来停止函数工作

javascript - Nuxt i18n 在中间件中调用 useRoute 可能会导致误导结果