Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to run VueJS code only after Vue is fully loaded and initialized?

I am working on a Vue component that will be placed on multiple websites via a CMS system. The issue I encounter is that even if my js scripts loading order is correct, sometime I get this error:

Uncaught ReferenceError: Vue is not defined     at HTMLDocument.<anonymous> 

Vue is loaded via cdn and it's above the component's code.

All the Vue code is run like this:

document.addEventListener("DOMContentLoaded", () => {   // here is the Vue code }); 

I even added a setTimeout() inside the DOMContentLoaded event and still did not do the trick. window.onload = function() did not work either in all cases. I still got that error from time to time. The scripts are loaded in the body.

Do you have any idea what it can be another approach? I want to be sure that in the moment the Vue code is fired, Vue is loaded and ready to be initialized on the page. Thank you!

like image 967
Bogdan Lungu Avatar asked Apr 27 '17 08:04

Bogdan Lungu


People also ask

How do I stop my Vue from propagating?

We can prevent the click event from propagating to the parent when clicking a button inside an element with Vue. js with the self modifier. We add the self modifier to the @click directive on the outer div so that the click event will be confined to the parent div.

How do I set Vue setTimeout?

We can use setTimeout with Vue. js by passing in an arrow function as an argument into it. We have the setShow method that calls setTimeout with an arrow function that calls this. show to true as the first argument.

How do I trigger an event at the Vue?

To trigger events using Vue. js, we can assign a ref to the element we want to trigger the element from. And then we can use the element's methods to trigger the event. to assign the myBtn ref to the button.

How do I run an existing Vuejs project?

Simply type in the terminal vue create [name-of-my-app] and it will create a new Vue. js project with a lot of configuration (the *magic* I was referring to). When the wizard is finished, you will be asked to navigate into the folder with cd name-of-my-app . After that you can just run npm run serve .


2 Answers

use vue mounted() to run any code on page load, and updated() to run after any component operations, so a perfect solution would be combining both Roy j and vue lifecycle hooks

mounted() {     window.addEventListener('load', () => {          // run after everything is in-place     }) },  // 99% using "mounted()" with the code above is enough,  // but incase its not, you can also hook into "updated()" // // keep in mind that any code in here will re-run on each time the DOM change updated() {     // run something after dom has changed by vue } 

note that you can omit the window.addEventListener() and it still going to work but it might miss + if you are using something like jquery outerHeight(true) its better to use it inside the window event to make sure you are getting correct values.

Update 1 :

instead of window.addEventListener('load') there is also another way by using document.readyState so the above can be

mounted() {   document.onreadystatechange = () => {      if (document.readyState == "complete") {          // run code here     }    } }, 

Update 2 :

the most reliable way i've found so far would be using debounce on $nextTick, so usage becomes

import debounce from 'lodash/debounce'  // bad updated() {     this.$nextTick(debounce(() => {         console.log('test') // runs multiple times     }, 250)) // increase to ur needs }  // good updated: debounce(function () {     this.$nextTick(() => {         console.log('test') // runs only once     }) }, 250) // increase to ur needs 

when using debounce with updated it gets tricky, so make sure to test it b4 moving on.

Update 3 :

you may also try MutationObserver

like image 109
ctf0 Avatar answered Sep 20 '22 13:09

ctf0


Use the load event to wait until all resources have finished loading:

<script>   window.addEventListener("load", function(event) {     // here is the Vue code   }); </script> 

Further explanation

DOMContentLoaded is an event fired when the HTML is parsed and rendered and DOM is constructed. It is usually fired pretty fast in the lifetime of the app. On the other hand, load is only fired when all the resources (images, stylesheets etc.) are retrieved from the network and available to the browser.

You can also use the load event for a specific script.

like image 35
Roy J Avatar answered Sep 18 '22 13:09

Roy J