Skip to content

Commit fc4d360

Browse files
committed
Render dom elements
1 parent 551e350 commit fc4d360

File tree

2 files changed

+99
-1
lines changed

2 files changed

+99
-1
lines changed

src/reconciler.js

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,29 @@
1-
export function render(element, container) {}
1+
export function render(element, parentDom) {
2+
const { type, props } = element;
3+
4+
// Create DOM element
5+
const isTextElement = type === "TEXT ELEMENT";
6+
const dom = isTextElement
7+
? document.createTextNode("")
8+
: document.createElement(type);
9+
10+
// Add event listeners
11+
const isListener = name => name.startsWith("on");
12+
Object.keys(props).filter(isListener).forEach(name => {
13+
const eventType = name.toLowerCase().substring(2);
14+
dom.addEventListener(eventType, props[name]);
15+
});
16+
17+
// Set properties
18+
const isAttribute = name => !isListener(name) && name != "children";
19+
Object.keys(props).filter(isAttribute).forEach(name => {
20+
dom[name] = props[name];
21+
});
22+
23+
// Render children
24+
const childElements = props.children || [];
25+
childElements.forEach(childElement => render(childElement, dom));
26+
27+
// Append to parent
28+
parentDom.appendChild(dom);
29+
}

test/00.render-dom-elements.test.js

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import test from "ava";
2+
import browserEnv from "browser-env";
3+
import { render } from "../src/didact";
4+
5+
// Create document global var
6+
browserEnv(["document"]);
7+
8+
test.beforeEach(t => {
9+
const root = document.createElement("div");
10+
document.body.appendChild(root);
11+
t.context.root = root;
12+
});
13+
14+
test.afterEach.always(t => {
15+
const root = t.context.root;
16+
root.innerHTML = "";
17+
document.body.removeChild(root);
18+
});
19+
20+
test("render div", t => {
21+
const root = t.context.root;
22+
const element = {
23+
type: "div",
24+
props: {}
25+
};
26+
render(element, root);
27+
t.is(root.innerHTML, "<div></div>");
28+
});
29+
30+
test("render div with children", t => {
31+
const root = t.context.root;
32+
const element = {
33+
type: "div",
34+
props: {
35+
children: [
36+
{ type: "b", props: {} },
37+
{ type: "a", props: { href: "foo" } }
38+
]
39+
}
40+
};
41+
render(element, root);
42+
t.is(root.innerHTML, '<div><b></b><a href="foo"></a></div>');
43+
});
44+
45+
test("render div with props", t => {
46+
const root = t.context.root;
47+
const element = {
48+
type: "div",
49+
props: { id: "foo" }
50+
};
51+
render(element, root);
52+
t.is(root.innerHTML, '<div id="foo"></div>');
53+
});
54+
55+
test("render span with text child", t => {
56+
const root = t.context.root;
57+
const element = {
58+
type: "span",
59+
props: {
60+
children: [
61+
{
62+
type: "TEXT ELEMENT",
63+
props: { nodeValue: "Foo" }
64+
}
65+
]
66+
}
67+
};
68+
render(element, root);
69+
t.is(root.innerHTML, "<span>Foo</span>");
70+
});

0 commit comments

Comments
 (0)