- Notifications
You must be signed in to change notification settings - Fork53
Add acustomElementRoot prop for registered Custom Elements#92
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
base:master
Are you sure you want to change the base?
Uh oh!
There was an error while loading.Please reload this page.
Conversation
Avoids the need to setup a Ref and query its parentElement to gain access to the root of the Custom Element.
Neat idea! Another option that would be similar but avoid having to inject into props would be to expose it via context with a functionMyComponent(props:Props,{$host:HTMLElement}){useEffect(()=>{consthandler=(ev:Event)=>{/* ... */};$host.addEventListener("my-event",handler);return()=>$host.removeEventListener("my-event",handler);});return<div>...content...</div>;}register(MyComponent,"my-component",["prop1","prop2"]); |
That sounds neat! But I'm not sure how it would be implemented 😅 If I get it right, thecontext here is retrieved from a parent, so I'd need to check that the context there is null/undefined? constcontext=event.detail.context??{$host:this._root} ... something like that? I haven't needed |
Uh oh!
There was an error while loading.Please reload this page.
NOTE: this a "show don't tell" PR, and I'm guessing it may require changes to other parts of the library, but before adding docs or tests, I want to test the waters.
Working with custom elements, it is almost always necessary (except for the simplest of components) to get a hold of the root of the element, for instance to register event handlers to communicate with other parts of the DOM.
So, a Web component needs to do something like this:
I propose adding the root element as prop. This is a very minimal change that would make the API a lot cleaner:
This is just one option, another one could be to have some sort of hook to pick up the root element, but I think that would be a bit more complicated to setup. I like this change because is very minimal and should not even conflict with people that already have that prop name (unlikely as that might be).
Also, since the Component function is always calledafter the DOM element has been instantiated, it makes sense to make it available to the component without needing to use a Ref.