W E B C O M P O N E N T S E L M A N D W E B C O M P O N E N T S - R I C H A R D F E L D M A N H T T P S : / / W W W. Y O U T U B E . C O M / WAT C H ? V = A R 3 TA K W E 8 O 0
W H AT I S N E E D E D ? yarn add document-register-element Pollyfil https://github.com/WebReflection/document-register-element import "document-register-element"
C U S T O M E L E M E N T S + R E A C T import "document-register-element" import r from "ramda" import React from "react" import ReactDOM from "react-dom" function render(ComponentClass: ReactClass) { return function() { function reducer(acc, node) { const merge = { [node.nodeName]: node.nodeValue, } return r.merge(merge, acc) } const props = r.reduce(reducer, {}, this.attributes) ReactDOM.render( , this ) } } function detach() { ReactDOM.unmountComponentAtNode(this) } function registerCustomElement(ComponentClass: ReactClass, tagName: string) { const elementPrototype = Object.create(HTMLElement.prototype) elementPrototype.attachedCallback = render(ComponentClass) elementPrototype.attributeChangedCallback = render(ComponentClass) elementPrototype.detachedCallback = detach elementPrototype.createdCallback = created try { return document.registerElement(tagName || ComponentClass.displayName, { prototype: elementPrototype, }) } catch(e) { rollbar.error(e) } } export default registerCustomElement
E V E N T S F R O M R E A C T let customEventDecoder = Decode.at [ "detail" ] Decode.string decoder = Decode.map OnTriggerEvent customEventDecoder in node "x-widget" [ attribute "eventname" "trigger" , on "trigger" decoder ] [] Listen to DOM events