It feels like I'm facing the same thing the same problems writing the API of these components. In particular:
- A component might have several distinct modes. As in, an
<x-gif speed="1.0">has a very different playback mode from<x-gif bpm="120">, so you shouldn't be allowed to have bothspeedandbpm. But it doesn't seem right to break them into separate components, so either one takes precedence or having both present causes an explosion. - A component might require more than one attribute to be valid. As in,
<x-beat midi channel="0" note="65">. Until you have both thechannelandnoteyou can't make connection to the midi signal. But if you're driving the component with a framework like angular, it will first render incompletely (as<x-beat midi channel="{{ channel }}" note="{{ note }}">), then after a$digestwill insert the right values. So a component may need to permit being in an invalid state temporarily, then when all attributes are set go and get set up.
The first bit feels like command-line options-parsing, but the second one is trickier. You have this stateful lifecycle of these components and tracking all the potential changes is really hard. Thoughts?
Feels like we need a declarative way of describing a component API that understands the different kinds of attributes, to reduce some of this complexity. Unless... some work like this has already been done. Like within x-tag or something?
I'd say that attributes are pretty necessarily intertwined with the rest of their components. We tend not to coerce attributes into property members of the element other than for convenience, and then frequently use the attribute of the source of truth. For example, an element with a
srcattribute can have a getter and setter for.srcthat just gets and sets the attribute.