首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何判断Vue组件是否处于活动状态

如何判断Vue组件是否处于活动状态
EN

Stack Overflow用户
提问于 2018-05-11 23:53:07
回答 3查看 16.6K关注 0票数 8

我有一个包装在<keep-alive>标记中的Vue组件,以防止重新呈现。

在组件中,我希望通过触发一个方法来对全局数据中的某些更改做出反应。但是,我只想在组件当前处于活动状态时触发该方法。

现在,我正在做这样的事情:

代码语言:javascript
复制
export default {
  data() {
    return { 
      globalVar: this.$store.state.var,
      isComponentActive: false,
    };
  },
  methods: {
    foo() { console.log('foo') };
  },
  watch: {
    globalVar() {
      if (this.isComponentActive) {
        this.foo();
      }
    },
  },
  activated() {
    this.isComponentActive = true;
  },
  deactivated() {
    this.isComponentActive = false;
  },
}

但是我希望组件的实例已经有一个我可以引用的属性。如下所示:

代码语言:javascript
复制
export default {
  data() {
    return { globalVar: this.$store.state.var };
  },
  methods: {
    foo() { console.log('foo') };
  },
  watch: {
    globalVar() {
      if (this.$isComponentActive) {
        this.foo();
      }
    },
  },
}

我在the documentation for the tag里找不到这样的东西。而且,看看Vue实例,它似乎没有对应的属性。但是,有没有人知道有一种方法可以让我获得Vue实例的“激活”状态,而不必自己通过钩子来维护它?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-12 06:44:59

也许你可以使用_inactive (基于the source code at vue/src/core/instance/lifecycle.js )来检查组件是否被激活。

代码语言:javascript
复制
Vue.config.productionTip = false
Vue.component('child', {
  template: '<div>{{item}}</div>',
  props: ['item'],
  activated: function(){
    console.log('activated', this._inactive, this.item)
  },
  deactivated: function(){
    console.log('deactivated', this._inactive, this.item)
  },
  mounted: function(){
    console.log('mounted', this._inactive, this.item)
  },
  destroyed: function () {
    console.log('destroyed', this._inactive, this.item)
  }
})

new Vue({
  el: '#app',
  data() {
    return {
      testArray: ['a', 'b', 'c']
    }
  },
  methods:{
    pushItem: function() {
      this.testArray.push('z')
    },
    popItem: function() {
      this.testArray.pop()
    }
  }
})
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.js"></script>
<div id="app">
  <button v-on:click="pushItem()">Push Item</button>
  <button v-on:click="popItem()">Pop Item</button>
  <div v-for="(item, key) in testArray">
    <keep-alive>
      <child :key="key" :item="item"></child>
    </keep-alive>
  </div>
</div>

票数 13
EN

Stack Overflow用户

发布于 2018-05-12 06:13:45

查看source code,看起来组件实例中的任何状态都没有改变。相反,只需在缓存中添加或删除元素。所以,我不认为除了生命周期钩子之外没有其他选择。

票数 0
EN

Stack Overflow用户

发布于 2021-08-14 13:42:15

使用Vue 3组合API,您可以使用onDeactivated在组件中设置inactive标志属性

https://v3.vuejs.org/api/options-lifecycle-hooks.html#deactivated

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50295985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档