facebook / jsx

The JSX specification is a XML-like syntax extension to ECMAScript.
http://facebook.github.io/jsx/
1.95k stars 133 forks source link

Proposal: faster way to id and classes #153

Open rafikalid opened 1 year ago

rafikalid commented 1 year ago

Using CSS Selector Syntax to create components:

orenelbaum commented 1 year ago

<div .my-class /> (needs the space to remove ambiguity)

fabiospampinato commented 1 year ago

@orenelbaum it's not ambiguous because this syntax can only be used on native elements and native elements don't have properties like that.

wooorm commented 1 year ago

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

fabiospampinato commented 1 year ago

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.

wooorm commented 1 year ago

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 (like h1) or not (like Component), they are as follows:

  • If there’s a dot, it’s a member expression (<a.b> -> h(a.b)), which means that the b component is taken from object a
  • 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 component A

https://mdxjs.com/docs/using-mdx/#components

lxsmnsyc commented 1 year ago

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>

ahmed0saber commented 3 months ago

Why not adding these shortcuts as user snippets in your code editor?