Vue RS के पन्नों के बीच स्विच करने से VueJS माउंटेड () पर कई इवेंट में आग लग जाती है
मैं एक इलेक्ट्रॉन परियोजना पर काम कर रहा हूं जहां मैं Vue CLI परियोजना और Vue CLI प्लगिन इलेक्ट्रॉन बिल्डर का उपयोग करता हूं । हाल ही में मुझे मिली एक अजीब बग को छोड़कर सब कुछ बढ़िया काम करता है।
जब भी मैं पृष्ठों (Vue Router) के बीच नेविगेट करता हूं, तो मैं जिस घटक सामग्री से सुनता हूं वह घटना mounted()
दोहरी हो जाती है। यह वास्तव में N+1
मुद्दा है।
समस्या का अधिक स्पष्ट रूप से वर्णन करने के लिए, मेरे पास दो Home.vue
और HelloWorld.vue
घटक हैं। से Home.vue
घटक, मैं करने के लिए एक घटना भेज रहा हूँ main
कि जब भी कोई बटन क्लिक करके और सुनने की प्रक्रिया event.reply()
एक ही घटक से mounted()
संपत्ति। यह पूरी तरह से इस स्तर पर अपेक्षित है।
हालांकि, जब भी मैं HelloWorld
पृष्ठ पर जाता Home
हूं और फिर से पृष्ठ पर वापस जाता हूं और जब मैं प्रक्रिया event
से भेजने और प्राप्त करने के लिए बटन पर क्लिक करता main
हूं, तो मैं केवल एक बार नहीं देखता हूं, event
भले ही मैं केवल एक बार क्लिक करता हूं, लेकिन मुझे दो event
उत्तर मिलते हैं । यदि मैं फिर से पृष्ठों के बीच स्विच करता हूं, तो मुझे तीन event
उत्तर और इसी तरह का N+1
मुद्दा दिखाई देगा।
आपकी सुविधा के लिए, मैंने एक त्वरित GIF बनाया है जो इस मुद्दे को स्पष्ट रूप से दिखाएगा।
Home.vue
<template>
<div class="home">
<button @click="send()">Home</button>
</div>
</template>
<script>
export default {
name: "Home",
data() {
return {
cause: null
}
},
mounted() {
window.ipcRenderer.on("home:reply", event => console.log(event));
},
methods: {
send() {
window.ipcRenderer.send("home");
}
},
};
</script>
main.js
ipcMain.on("home", event => {
return event.reply("home:reply");
});
मेरे पास Vue Router पर कुछ विशेष नहीं है और यह केवल डिफ़ॉल्ट मचान है जो Vue CLI के साथ आता है। जैसा कि आप उपरोक्त कोड स्निपेट में देख सकते हैं, मैं जो कुछ भी कर रहा हूं, वह केवल एक बटन भेजने पर एक घटना भेज रहा है और उसी घटक mounted()
संपत्ति से उसी घटना के उत्तर को सुन रहा है।
मैंने स्टैक ओवरफ्लो पर भी इसी तरह का विषय पाया, लेकिन यह खुद पता नहीं लगा सका। मेरे पास मेरे कोड what's में क्या गलत है, इसका कोई सुराग नहीं है
जवाब
जब घटक नष्ट हो जाता है, तो आपको इवेंट हैंडलर को अपंजीकृत करने की आवश्यकता होती है, अन्यथा आप प्रत्येक ईवेंट हैंडलर को फिर से पंजीकृत कर रहे हैं और हर बार घटक माउंट होने पर।
mounted() {
window.ipcRenderer.on('home:reply', this.handleHomeReply)
},
destroyed() {
window.ipcRenderer.off('home:reply', this.handleHomeReply)
},
methods: {
handleHomeReply(event) {
console.log(event)
}
}