Table of Contents
URL: https://www.progressiverobot.com/vuejs-custom-elements/
The Web Components / Custom Elements spec allows you to define your own custom elements in the browser and the logic attached to them. It's been a long time coming, but it's almost here. The advantage of Web Components is that they are interoperable between any framework or library, or even Vanilla JS. Thanks to <^>Vue's<^> small size, with the help of a plugin, you can create native custom elements from Vue components.
Installation
Vue custom elements require the (appropriately named) <^>vue-custom-element<^> plugin.
Install it via <^>Yarn<^> or <^>NPM<^>.
# Yarn
$ yarn add vue-custom-element -D
# NPM
$ npm install vue-custom-element --save-dev
Additionally, unless you're only building for Chrome, you'll probably want the document-register-element polyfill.
Creating a Web Component
Write your component as you normally would, single-file components work fine if using a build system.
[label ExampleComponent.vue]
<template>
<p>Dynamic prop value: {{myProp}}</p>
</template>
<script>
export default {
props: ['myProp']
}
</script>
Then, add the <^>vue-custom-element<^> plugin to Vue and register your component.
[label main.js]
import Vue from 'vue';
import vueCustomElement from 'vue-custom-element';
import ExampleComponent from './ExampleComponent.vue';
// Configure Vue to ignore the element name when defined outside of Vue.
Vue.config.ignoredElements = [
'example-component'
];
// Enable the plugin
Vue.use(vueCustomElement);
// Register your component
Vue.customElement('example-component', ExampleComponent, {
// Additional Options: https://github.com/karol-f/vue-custom-element#options
});
Now, after building to a standalone script, you should be able to add that script to any webpage and have it render <^>example-component<^> as expected.
[label index.html]
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>My Example Vue Page</title>
<script src="dist/build.js" async deferred></script>
</head>
<body>
<example-component myProp="I can pass props!"></example-component>
</body>
</html>
Props will still be reactive, though you can't pass values other than strings.
And there you have it! A custom element made with Vue!