ChatGPT解决这个技术问题 Extra ChatGPT

[Vue warn]: Cannot find element

I'm using Vuejs. This is my markup:

<body>
  <div id="main">
    <div id="mainActivity" v-component="{{currentActivity}}" class="activity"></div>
  </div>
</body>

This is my code:

var main = new Vue({
    el: '#main',
    data: {
        currentActivity: 'home'
    }
})
;

When I load the page I get this warning:

[Vue warn]: Cannot find element: #main

What am I doing wrong?

Doing this in the footer, or header?
move your script to a window ready handler
the ready handler was the issue. seems silly that vue doesnt include this... @ArunPJohny - if you submit an answer with a snippet ill mark it as correct.
Why is this not included in the Vue docs? I had the same issue but this worked.

A
Arun P Johny

I think the problem is your script is executed before the target dom element is loaded in the dom... one reason could be that you have placed your script in the head of the page or in a script tag that is placed before the div element #main. So when the script is executed it won't be able to find the target element thus the error.

One solution is to place your script in the load event handler like

window.onload = function () {
    var main = new Vue({
        el: '#main',
        data: {
            currentActivity: 'home'
        }
    });
}

Another syntax

window.addEventListener('load', function () {
    //your script
})

hey thanks, sorry for comment here why vue js need to be load it, in the doc there is no telling, thanks
Also to note, the addEventListener method is "technically" a more maintainable approach because it isn't overriding the global window.onload property.
Including the Webpack bundle script in the <head></head> section is what caused me the error. Waiting for the window to be loaded is working.
No warning in console that script statements containing references to DOM elements are being evaluated before the DOM is loaded? How can this be a difficult warning to implement?
S
Su Chuan

I've solved the problem by add attribute 'defer' to the 'script' element.


Is there any side-effect with using defer?
You can read more about how the script tag's defer attribute works here. It will delay running the JS code until after the DOM has parsed, but before the window onload event is fired.
l
li bing zhao

I get the same error. the solution is to put your script code before the end of body, not in the head section.


before the end of body but not in the head? what does that mean exactly?
put your vue.js code before the , the browsers will load the body content first,then load the vue.js code, it will work.
Ran into this issue while using Laravel and its accompanying laravel-mix. Moving the loading of the js to after the body resolved it.
T
Tadas Stasiulionis

The simple thing is to put the script below the document, just before your closing </body> tag:

<body>
   <div id="main">
      <div id="mainActivity" v-component="{{currentActivity}}" class="activity"></div>
   </div>
   <script src="app.js"></script>
</body>

app.js file:

var main = new Vue({
    el: '#main',
    data: {
        currentActivity: 'home'
    }
});

N
Nijat Mursali

You can solve it in two ways.

Make sure you put the CDN into the end of html page and place your own script after that. Example:

    <body>
      <div id="main">
        <div id="mainActivity" v-component="{{currentActivity}}" class="activity"></div>
      </div>
    </body>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11"></script>
    <script src="js/app.js"></script>

where you need to put same javascript code you wrote in any other JavaScript file or in html file.

Use window.onload function in your JavaScript file.


N
Nisharg Shah

I think sometimes stupid mistakes can give us this error.

<div id="#main"> <--- id with hashtag
    <div id="mainActivity" v-component="{{currentActivity}}" class="activity"></div>
</div>

To

<div id="main"> <--- id without hashtag
    <div id="mainActivity" v-component="{{currentActivity}}" class="activity"></div>
</div>