JSFiddle - React, Tailwind, and code Playground
by gothic
HTML
<div id="root"></div>
Babel + JSX
/** @jsx h */
function h(type, props, ...children) {
return { type, props: props || {}, children };
}
function setBooleanProp($target, name, value) {
if (value) {
$target.setAttribute(name, value);
$target[name] = true;
} else {
$target[name] = false;
}
}
function isCustomProp(name) {
return false;
}
function setProp($target, name, value) {
if (isCustomProp(name)) {
return;
} else if (name === 'className') {
$target.setAttribute('class', value);
} else if (typeof value === 'boolean') {
setBooleanProp($target, name, value);
} else {
$target.setAttribute(name, value);
}
}
function setProps($target, props) {
Object.keys(props).forEach(name => {
setProp($target, name, props[name]);
});
}
function createElement(node) {
if (typeof node === 'string') {
return document.createTextNode(node);
}
const $el = document.createElement(node.type);
setProps($el, node.props);
node.children
.map(createElement)
.forEach($el.appendChild.bind($el));
return $el;
}
//--------------------------------------------------
/* 这种写法是 babel 的写法
const f = (
<ul style="list-style: none;">
<li className="item">item 1</li>
<li className="item">
<input type="checkbox" checked={true} />
<input type="text" disabled={false} />
</li>
</ul>
);
*/
// 这种写法其实最后和 babel的写法是一样的,和上面的其实是一个效果,看自己喜好
const b = h(
'ul', {
'style': 'list-style: none;'
},
h(
'li',
{
'className': 'item'
},
'item 1'
),
h(
'input',
{
'type': 'checkbox',
'checked': 'true'
},
'hello!'
),
h(
'input',
{
'type': 'text',
'disabled': 'false'
},
'hello!'
)
);
const $root = document.getElementById('root');
$root.appendChild(createElement(b));