JSX from Scratch
Iain Nash
@isiain
JSX isn't only for React!
Syntax Sugar for a standard createElement call.
JSX
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin urna odio, aliquam vulputate faucibus id, elementum lobortis felis. Mauris urna dolor, placerat ac sagittis quis.
dom()
return (0, _dom2.default)(
'div',
{ className: 'text' },
(0, _dom2.default)(
_HeaderHi.HeaderHi,
{ step: atStep, className: 'headerHi' },
(0, _dom2.default)(
'div',
{ className: 'hidiv' },
'Welcome to JSConf!'
),
(0, _dom2.default)(
'div',
{ className: 'step' },
'Can you see me now? ',
(0, _dom2.default)(
'span',
null,
atStep
)
)
)
);
<div>
<img
width={this.step*20+100}
height={this.step*20+100}
src="./logo.png" />
<div>{this.children}</div>
</div>
What can we do with this?
- Avoid using JSX and babel for simple components
- Use as an interactive DSL for other languages
- Build custom shadow trees with easier syntax
Styling?
<rules for="body">
<rules for="img">
<margin>0 auto</margin>
<display>block</display>
<paddingTop>50px</paddingTop>
</rules>
<background color="#eee" />
<fontSize>26pt</fontSize>
<fontFamily>Helvetica</fontFamily>
<padding animate="2s">{`${-1*atStep*20+200}px`}</padding>
<rules for=".text">
<background color="black" />
<color>#eee</color>
<textAlign>center</textAlign>
<userSelect>none</userSelect>
<fontSize>{`${atStep*10+20}pt`}</fontSize>
<rules for=".hidiv">
<padding>200px</padding>
<margin animate=".5s">
{`${rand(10, 20)}px`} 30px {`${rand(10, 20)}px`} 20px
</margin>
</rules>
</rules>
</rules>
Renders
body{
background: #eee;
font-size: 26pt;
font-family: Helvetica;
transition: padding 2s;
padding: 200px;
}
body img{
margin: 0 auto;
display: block;
padding-top: 50px;
}
body .text{
background: black;
color: #eee;
text-align: center;
user-select: none;
font-size: 20pt;
}
body .text .hidiv {
padding: 200px;
transition: margin .5s;
margin: -11px 30px -13px 20px;
}
Demo
raw-jsx
By Iain Nash
raw-jsx
- 1,278