简体   繁体   English

在 Angular 中使用 Vue 组件

[英]Using Vue Components in Angular

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.我有一个用 Vue 构建的项目,我想在 Angular 应用程序中重用 Vue 应用程序中的组件,这样我就不必从头开始重建每个组件。

I saw this tutorial on medium: How to use Vue 2.0 components in an angular application , but that tutorial is for AngularJS.我在 medium 上看到了这个教程: How to use Vue 2.0 components in an angular application ,但那个教程是针对 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.我想知道以前是否有人这样做过,是否值得,是否有人知道任何教程或参考资料。

Wrap your Vue components as native Web Components .将您的 Vue 组件包装为原生Web 组件

Since Angular supports using custom Web Components, you'll be able to use the Vue components (wrapped as Web Components).由于 Angular 支持使用自定义 Web 组件,您将能够使用 Vue 组件(包装为 Web 组件)。

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).对于 Angular 来说,自定义 Web 组件是否由 Vue 生成并没有区别(因为所有 Angular 都知道,它们可能是原生 HTML 元素)。

Demo演示

Runnable DEMO here. 可运行的演示在这里。

The demo is an Angular 5 app.该演示是一个 Angular 5 应用程序。 The Vue custom component is defined in index.html . Vue 自定义组件在index.html定义。 Notice how in app/app.component.html it is used directly in the template, as if it were a native element.注意在app/app.component.html它是如何直接在模板中使用的,就好像它是一个原生元素一样。

Step by step below.下面一步一步来。

In Vue在 Vue

Use vue-custom-element to wrap your Vue components as Web Components:使用vue-custom-element将您的 Vue 组件包装为 Web 组件:

<script src="https://unpkg.com/vue"></script>
<script src="https://unpkg.com/vue-custom-element@3.0.0/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.这将创建一个<my-vue-web-comp>网络组件,它可以直接在 DOM 中使用,无需拥有一个可用的 Vue 实例。

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:如果您有.vue文件和 vue-cli 应用程序,则需要执行npm install vue-custom-element --save然后创建一个.js文件,例如:

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 .然后,当捆绑时,将生成一个.js文件,该文件可以作为单个<script>标签直接导入,而不是上面的整个代码和脚本标签

For more details, check vue-custom-element 's docs .有关更多详细信息,请查看vue-custom-element的文档

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 :现在,在 Angular 应用程序中,在导入 Web 组件(无论它们是否由Vue 生成)后,通过@NgModule添加schemas: [CUSTOM_ELEMENTS_SCHEMA]来配置它们以供 Angular 使用

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.现在直接在 Angular 模板中使用 Web 组件(从 Vue 生成或不生成)。 Eg 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.您可能需要 polyfills 来支持旧浏览器。 Please check vue-custom-element 's docs for more details.请查看vue-custom-element的文档以获取更多详细信息。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM