I have a Vue component that is wrapped in a <keep-alive>
tag to prevent re-rendering.
Within the component, I want to react to some change in global data by firing a method. But, I only want to fire the method if the component is currently active.
Right now, I'm doing something like this:
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;
},
}
But I was hoping there was already a property of the component's instance that I could reference. Something like this:
export default {
data() {
return { globalVar: this.$store.state.var };
},
methods: {
foo() { console.log('foo') };
},
watch: {
globalVar() {
if (this.$isComponentActive) {
this.foo();
}
},
},
}
I can't find anything like that in the documentation for the <keep-alive>
tag. And, looking at the Vue instance, it doesn't appear to have a property for it. But, does anyone know of a way I could get the "activated" state of the Vue instance without having to maintain it myself through the hooks?
Probably you can use _inactive
(based on the source code at vue/src/core/instance/lifecycle.js
) to check whether the component is activated or not.
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()
}
}
})
<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>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With