Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Vue Components in Angular

Tags:

I have a project that is built in Vue and I want to reuse the components from the Vue application in an Angular application so I don't have to go and rebuild every single component from scratch.

I saw this tutorial on medium: How to use Vue 2.0 components in an angular application, but that tutorial is for AngularJS.

I'm wondering if anyone has done this before, if it's worth it and if anyone knows of any tutorials or reference material.

like image 934
Smokey Dawson Avatar asked Apr 09 '18 00:04

Smokey Dawson


People also ask

Can you use Vue in Angular?

Since Angular supports using custom Web Components, you'll be able to use the Vue components (wrapped as Web Components).

Is Vue harder than Angular?

Learning Curve You'll need to learn HTML, MVC, and Typescript to use the Angular frontend development framework to create an application. However, this is not the case with Vue. Vue is simpler to use than Angular since it has built-in app templates and allows for more flexibility.

What is the use of Vue component?

Vue Components are a handy, powerful and important utility that enables developers to create custom elements which can be reused in HTML. Vue Components are single, independent units of an interface that have their own state, markup and style. Their key aspect is that they help to encapsulate reusable code.

Is Vue faster than React?

Vue is faster and smaller, which contributes to better performance. When it comes to hiring developers, both have their advantages and drawbacks. Vue is easier to learn, but React is more popular, and therefore, finding hires is faster.


1 Answers

Wrap your Vue components as native Web Components.

Since Angular supports using custom Web Components, you'll be able to use the Vue components (wrapped as Web Components).

To Angular it doesn't make a difference if the custom Web Components were generated by Vue or not (for all Angular knows, they could be native HTML elements).

Demo

Runnable DEMO here.

The demo is an Angular 5 app. The Vue custom component is defined in index.html. Notice how in app/app.component.html it is used directly in the template, as if it were a native element.

Step by step below.

In Vue

Use vue-custom-element to wrap your Vue components as Web Components:

<script src="https://unpkg.com/vue"></script> <script src="https://unpkg.com/[email protected]/dist/vue-custom-element.js"></script> <script>   const MyVueWebComp = {     props: ['msg'],     template:`     <div style="border: 3px dashed green; padding: 5px">       I am my-vue-web-comp.<br>       Value of "msg" prop: {{ msg }}<br>       <input v-model="text"><button @click="addText">Click me</button>       <div v-for="t in texts">         Text: {{ t }}       </div>     </div>     `,     data() {         return {             text: '',             texts: []         };     },     methods: {       addText() {         this.texts.push(this.text);         this.text = '';       }     }   };   Vue.customElement('my-vue-web-comp', MyVueWebComp); </script> 

That will create a <my-vue-web-comp> web component that can be used directly in the DOM, without the need to have a working Vue instance.

The above is just a demo runnable directly in the browser. If you have .vue files and a vue-cli app, you'll need to do npm install vue-custom-element --save and then create a .js file like:

import Vue from 'vue'; import vueCustomElement from 'vue-custom-element'; import MyElement from './MyElement.vue';  Vue.use(vueCustomElement); Vue.customElement('my-element', MyElement); 

And then this, when bundled, will generate a .js file that can be imported directly as a single <script> tag, instead of the whole code and script tags above.

For more details, check vue-custom-element's docs.

In Angular

Now, in the Angular app, after importing the Web Components (being them Vue-generated or not), configure them to be used by Angular by adding schemas: [CUSTOM_ELEMENTS_SCHEMA] in your @NgModule:

import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';  //...  @NgModule({   // ...   schemas: [     CUSTOM_ELEMENTS_SCHEMA  // added this   ] }) export class AppModule {  

Now use the Web Components (generated from Vue or not) directly in Angular templates. E.g. the component defined in the code above could be used like:

<my-vue-web-comp [msg]="name"></my-vue-web-comp> 

In fact, the runnable demo shows an example of that usage.

Limitations

You may need polyfills for older browser support. Please check vue-custom-element's docs for more details.

like image 163
acdcjunior Avatar answered Oct 15 '22 19:10

acdcjunior