- From: /#!/JoePea <trusktr@gmail.com>
- Date: Tue, 12 Apr 2016 01:01:37 -0700
- To: Ryosuke Niwa <rniwa@apple.com>
- Cc: Domenic Denicola <d@domenic.me>, "public-webapps@w3.org" <public-webapps@w3.org>
On Mon, Apr 11, 2016 at 4:44 PM, Ryosuke Niwa <rniwa@apple.com> wrote:
> You'd have to instead write it as "new SomeClass(this.shadowRoot)" and then (1) needs to be modified as: `super(..arguments)` to pass the argument along to the HTMLElement constructor.
For sure, similar to the examples in the GitHub issue. :]
React doesn't encourage the instantiation of element classes directly.
What if browsers did that too and threw errors whenever someone tried
to instantiate a class using `new` that extended from any of the
native classes:
```js
import {SomeElement} from 'some-library'
// this would cause a `TypeError: Illegal constructor` or something
let el = new SomeElement()
// does not return a constructor
shadowRoot1.registerElement('any-name', SomeElement)
// only this instantiation method is allowed
let el1 = shadowRoot1.createElement('any-name')
// we can use the same class in a different component where
// <any-name> is already defined but isn't backed by SomeElement
shadowRoot2.registerElement('other-name', SomeElement)
let el2 = shadowRoot2.createElement('other-name')
// maybe this should throw an error instead of returning
// HTMLUnknownElement, otherwise it might hide the obvious
// human error instead teaching the developer
shadowRoot1.registerElement('a-name', SomeElement)
let el3 = shadowRoot2.createElement('a-name')
// this would cause an error because el1 was created from
// shadowRoot1 so el1 doesn't work in shadowRoot2
shadowRoot2.appendChild(el1)
```
ShadowDOM is still evolving and the Web Component spec hasn't
officially settled, so I think there's a good opportunity here for the
web to be more helpful by throwing errors and not being ambiguous as
for example in `document.createElement('ths-has-a-typo')`.
TLDR - ShadowDOM could be the encapsulation of HTML to Custom Elements
as JSX is the encapsulation of HTML to React Components (in a morphed
way, as obviously the mechanics are different).
Here's what a small component might look like:
```js
// --------------- HandyForm.js
import AwesomeButton from './AwesomeButton'
import { FancyForm, FancyInput } from './FancyForm'
export default
class HandyForm extends HTMLElement {
constructor() {
this.root = this.createShadowRoot()
this.root.registerElement('<cool-button>', AwesomeButton)
this.root.registerElement('<fancy-form>', FancyForm)
this.root.registerElement('<fancy-input>', FancyInput)
const frag = document.createDocumentFragment()
frag.innerHTML = `
<div>
<fancy-form>
<fancy-input type="text" /> <!-- allow
self-closing tags, pleeeease -->
<cool-button type="submit"></cool-button>
</fancy-form>
</div>
`
this.root.appendChild(frag)
}
static get observedAttributes() { return [ ... ] }
connectedCallback() { ... }
disconnectedCallback() { ... }
attributeChangedCallback() { ... }
}
// --------------- app.js
import HandyForm from './HandyForm'
// elements registered on the document won't cross into shadow roots
document.registerElement('handy-form', HandyForm)
document.body.appendChild(document.createElement('handy-form'))
```
- Joe
/#!/JoePea
Received on Tuesday, 12 April 2016 08:02:44 UTC