Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Vue.js 2: How to initialize(construct) a Vue component from a .vue file?

I'm trying to create a Component instance:

App.vue

import MyComponent from './components/MyCompnent.vue';
export default {
    mounted() {
        // The following line fails.
        const vm = new MyComponent();
        vm.$mount('#some-place');
    }
}

and the new line reports an error:

Uncaught TypeError: MyComponent.default is not a constructor

So how if I want to create the component?

like image 790
Alfred Huang Avatar asked Nov 29 '22 09:11

Alfred Huang


2 Answers

Finally, I found the solution myself, very simple:

The Component imported itself is not a constructor, but we can easily make a constructor:

import MyComponent from './components/MyCompnent.vue';
const MyComponentConstructor = Vue.extend(MyComponent);

So the final solution is:

import MyComponent from './components/MyCompnent.vue';
export default {
    mounted() {
        const MyComponentConstructor = Vue.extend(MyComponent);
        const vm = new MyComponentConstructor();
        vm.$mount('#some-place');
    }
}
like image 109
Alfred Huang Avatar answered Dec 04 '22 07:12

Alfred Huang


Following is the way to register a component inside other component:

export default {
  el: '#some-place'
  components: {
      'my-component'
  }
}

Documentation: link

Edited: How to create vm instance

If you want to initialise the vm instance, you can do it using Vue.extend. What is does is:

Create a “subclass” of the base Vue constructor. The argument should be an object containing component options.

and one point to note here is:

The special case to note here is the data option - it must be a function when used with Vue.extend().

You need to make changes similar to following in your code:

import MyComponent from './components/MyCompnent.vue';
const vmClass = Vue.extend(MyComponent)
const vm = new MyComponent();
vm.$mount('#some-place');
like image 43
Saurabh Avatar answered Dec 04 '22 08:12

Saurabh