• This repository has been archived on 07/Sep/2022
  • Stars
    star
    306
  • Rank 136,456 (Top 3 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created almost 9 years ago
  • Updated over 6 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Converts web components into React components so that you can use them as first class citizens in your React components.

React Integration

We're in the process of finding alternative, more sustainable ways to integrate better with React as React is also looking at ways to do the same. We've started another project at https://github.com/skatejs/val to try and make this more opt-in from consumers of web components and to open up the integration to libraries other than React.

Converts web components into React components so that you can use them as first class citizens in your React components.

  • Web components become lexically scoped so you can use them as tag names in JSX.
  • Listen for custom events triggered from web components declaratively using the standard on* syntax.
  • Passes React props to web components as properties instead of attributes.
  • Works with any web component library that uses a standard native custom element constructor, not just Skate or native web components.

Usage

Web components are converted to React components simply by passing them to the main react-integration function:

import reactify from 'skatejs-react-integration';

// Create your constructor.
class MyComponent extends HTMLElement {};

// Define your custom element.
window.customElements.define('my-component', MyComponent);

// Reactify it!
export default reactify(MyComponent);

Usage with SkateJS is pretty much the same, Skate just makes defining your custom element easier:

import reactify from 'skatejs-react-integration';

export default reactify(skate('my-component', {}));

Lexical scoping

When you convert a web component to a React component, it returns the React component. Therefore you can use it in your JSX just like any other React component.

const ReactComponent = reactify(WebComponent);
ReactDOM.render(<ReactComponent />, container);

Custom events

Out of the box, React only works with built-in events. By using this integration layer, you can listen for custom events on a web component.

// in MyComponent
var event = new Event('customevent');
elem.dispatchEvent(event);

// after reactified
<ReactComponent onCustomevent={handler} />

Now when customevent is emitted from the web component, your handler on ReactComponent will get triggered.

Web component properties

When you pass down props to the web component, instead of setting attributes like React normally does for DOM elements, it will set all props as properties on your web component. This is useful because you can now pass complex data to your web components.

// reactified component
<ReactComponent items={[ 'item1', 'item2' ]} callback={function() {}} />

// in MyComponent
<MyComponent items={elem.items} callback={elem.callback} />

Children

If your web component renders content to itself, make sure you're using Shadow DOM and that you render it to the shadow root. If you do this children and props get passed down as normal and React won't see your content in the shadow root.

ref

If you need access the the underlying DOM element, you can use the standard ref API. Beware that since you're dealing with a React Component, you'll need to use ReactDOM.findDOMNode:

import ReactDOM from 'react-dom';
const ReactComponent = reactify(class WebComponent extends HTMLElement {});

class MyComponent extends Component {
  constructor() {
    super();
    this.webComponent = null;
  }
  
  render() {
    return (
      <ReactComponent
        ref={reactComponent => { 
          this.webComponent = ReactDOM.findDOMNode(reactComponent);
        }}
      />
    );
  }
}

Injecting React and ReactDOM

By default, the React integration will import React and ReactDOM via peerDependencies. However, you can override this by passing your own versions:

import reactify from 'skatejs-react-integration';
import React from 'my-custom-react';
import ReactDOM from 'my-custom-react-dom';

class WebComponent extends HTMLElement {}
const ReactComponent = reactify(WebComponent, { React, ReactDOM });

Multiple React versions

The integration sets a peer-dependency on React so you know what it's compatible with. That said, you still need to be mindful that the version of React you provide to the integration layer is correct.

More Repositories

1

webcomponentsjs

A suite of polyfills supporting the HTML Web Components specs
HTML
3,874
star
2

custom-elements-everywhere

Custom Element + Framework Interoperability Tests.
JavaScript
1,169
star
3

polyfills

Web Components Polyfills
HTML
1,137
star
4

gold-standard

1,029
star
5

webcomponents.github.io

WebComponents.org is where community-members document Web Components best practices
JavaScript
734
star
6

custom-elements

A polyfill for HTML Custom Elements v1
HTML
455
star
7

polymer-boilerplate

Fork this repo if you want to start your own Web Component using Polymer
HTML
369
star
8

webcomponents.org

Home of the web components community
TypeScript
366
star
9

custom-elements-manifest

A file format for describing custom elements
TypeScript
365
star
10

element-boilerplate

Fork this repo if you want to start your own Web Component using VanillaJS
HTML
271
star
11

shadycss

HTML
197
star
12

shadydom

ShadowDOM v1 shim
HTML
162
star
13

hello-world-element

Web Component example using VanillaJS
HTML
151
star
14

chrome-webcomponents-extension

Google Chrome extension to identify all Custom Elements used on a site
JavaScript
81
star
15

html-imports

HTML Imports polyfill
HTML
73
star
16

angular-interop

A demo of interoperability between Polymer and AngularJS
TypeScript
72
star
17

template

Minimal polyfill for <template>
HTML
69
star
18

hello-world-polymer

Web Component example using Polymer
HTML
58
star
19

xtag-boilerplate

Fork this repo if you want to start your own Web Component using X-Tag
HTML
52
star
20

sass-interop

A demo of interoperability between Sass and Polymer
CSS
46
star
21

slush-element

Slush generator to create Custom Elements using Polymer, X-Tag or VanillaJS
JavaScript
41
star
22

webcomponents-icons

Collection of high resolution Web Components icons for presentations, blog posts or whatever
CSS
40
star
23

template-shadowroot

TypeScript
38
star
24

community

A space for the webcomponents community
JavaScript
26
star
25

hello-world-xtag

Web Component example using X-Tag
HTML
24
star
26

webcomponents-platform

Very minimal platform related polyfills
JavaScript
23
star
27

less-interop

A demo of interoperability between Less and Polymer
CSS
20
star
28

webcomponents-lite

Web Components Polyfills minus Shadow DOM
JavaScript
16
star
29

wc-catalog

11
star
30

custom-elements-manifest-tools

Tools for working with custom elements manifests
TypeScript
7
star
31

apply-shim

Shim for CSS @apply mixins
JavaScript
5
star
32

.allstar

1
star