jsx
jsx copied to clipboard
Proposal: faster way to id and classes
Using CSS Selector Syntax to create components:
-
<div#myId />
as shortcut of<div id="myId">
-
<div#.my-class />
as shortcut of<div className="my-class"/>
-
<div#myId.my-class />
as shortcut of<div id="myId" className="my-class" />
-
<div#myId.c1.c2.c3 />
as shortcut of<div id="myId" className="c1 c2 c3" />
<div .my-class />
(needs the space to remove ambiguity)
@orenelbaum it's not ambiguous because this syntax can only be used on native elements and native elements don't have properties like that.
Define native? Is a-b native? Also: a.b is a member expression, component b from object a, I think that's what's meant here
Native as in "name of a tag that's supported by the browser by default". div.foo
won't be a sub-component, Something.foo
might be.
Though I suppose this syntax should work for any kind of element/component? 🤔 I wasn't thinking about that for some reason. In that case sure, without a space its ambiguous.
div.foo
will be a subcomponent. The rules (as they are implemented) are a bit different than people sometimes expect. People seem to think that the capital makes it a component, which isn’t the case. There’s also no “knowledge” in JSX about “native” or not: it’s agnostic to the semantics of HTML.
Here’s the rules quoted from the MDX site:
If you ever wondered what the rules are for whether a name in JSX (so
x
in<x>
) is a literal tag name (likeh1
) or not (likeComponent
), they are as follows:
- If there’s a dot, it’s a member expression (
<a.b>
->h(a.b)
), which means that theb
component is taken from objecta
- Otherwise, if the name is not a valid identifier, it’s a literal (
<a-b>
->h('a-b')
)- Otherwise, if it starts with a lowercase, it’s a literal (
<a>
->h('a')
)- Otherwise, it’s an identifier (
<A>
->h(A)
), which means a componentA
https://mdxjs.com/docs/using-mdx/#components
Native as in "name of a tag that's supported by the browser by default".
div.foo
won't be a sub-component,Something.foo
might be.
div.foo
always counts as a JSXMemberExpression
. A famous example would be Framer Motion's <motion.div>
Why not adding these shortcuts as user snippets in your code editor?