Code formatting updates.

This commit is contained in:
2020-10-06 08:32:39 -07:00
parent dbda3e9756
commit 68c84b57d0
3 changed files with 38 additions and 18 deletions

View File

@@ -501,7 +501,8 @@ tree, keyed by the ~container~.
const renderTrees = {}; const renderTrees = {};
function render(element, container) { function render(element, container) {
const tree = const tree =
render_internal(element, container, renderTrees[container]); render_internal(element, container,
renderTrees[container]);
// render complete, store the updated tree // render complete, store the updated tree
renderTrees[container] = tree; renderTrees[container] = tree;
} }
@@ -538,9 +539,11 @@ function render_internal(element, container, prevElement) {
domElement = createDOMElement(element); domElement = createDOMElement(element);
} }
setDOMProps(element, domElement, prevElement); setDOMProps(element, domElement, prevElement);
children = renderChildren(element, domElement, prevElement); children =
renderChildren(element, domElement, prevElement);
if (!prevElement || domElement !== prevElement.domElement) { if (!prevElement ||
domElement !== prevElement.domElement) {
container.appendChild(domElement); container.appendChild(domElement);
} }
@@ -642,16 +645,19 @@ position is passed to ~render_internal~, or ~undefined~ if there is no
corresponding element, like when the list of children has grown. corresponding element, like when the list of children has grown.
#+BEGIN_SRC javascript #+BEGIN_SRC javascript
function renderChildren(element, domElement, prevElement = { props: { children: [] }}) { function renderChildren(element, domElement,
prevElement = { props: { children: [] }}) {
const elementLen = element.props.children.length; const elementLen = element.props.children.length;
const prevElementLen = prevElement.props.children.length; const prevElementLen = prevElement.props.children.length;
// remove now unused elements // remove now unused elements
for (let i = elementLen; i < prevElementLen - elementLen; i++) { for (let i = elementLen; i < prevElementLen - elementLen;
i++) {
removeDOMElement(element.props.children[i]); removeDOMElement(element.props.children[i]);
} }
// render existing and new elements // render existing and new elements
return element.props.children.map((child, i) => { return element.props.children.map((child, i) => {
const prevChild = i < prevElementLen ? prevElement.props.children[i] : undefined; const prevChild = i < prevElementLen ?
prevElement.props.children[i] : undefined;
return render_internal(child, domElement, prevChild); return render_internal(child, domElement, prevChild);
}); });
} }
@@ -729,12 +735,15 @@ const SayNow = ({ dateTime }) => {
const App = () => { const App = () => {
return ['div', { 'className': 'header' }, return ['div', { 'className': 'header' },
[SayNow({ dateTime: new Date() }), [SayNow({ dateTime: new Date() }),
['input', { 'type': 'submit', 'disabled': 'disabled' }, []] ['input',
{ 'type': 'submit', 'disabled': 'disabled' },
[]]
] ]
]; ];
} }
render(createElement(App()), document.getElementById('root')); render(createElement(App()),
document.getElementById('root'));
#+END_SRC #+END_SRC
We are creating two components, that output JSM, as we defined it We are creating two components, that output JSM, as we defined it
@@ -748,7 +757,8 @@ The next step is to call render multiple times.
#+BEGIN_SRC javascript #+BEGIN_SRC javascript
setInterval(() => setInterval(() =>
render(createElement(App()), document.getElementById('root')), render(createElement(App()),
document.getElementById('root')),
1000); 1000);
#+END_SRC #+END_SRC

View File

@@ -11,12 +11,15 @@ const SayNow = ({ dateTime }) => {
const App = () => { const App = () => {
return ['div', { 'className': 'header' }, return ['div', { 'className': 'header' },
[SayNow({ dateTime: new Date() }), [SayNow({ dateTime: new Date() }),
['input', { 'type': 'submit', 'disabled': 'disabled' }, []] ['input',
{ 'type': 'submit', 'disabled': 'disabled' },
[]]
] ]
]; ];
} }
render(createElement(App()), document.getElementById('root')); render(createElement(App()),
document.getElementById('root'));
``` ```
We are creating two components, that output JSM, as we defined it earlier. We create one component prop for the `SayNow` component: `dateTime`. It gets passed from the `App` component. The `SayNow` component prints out the `DateTime` passed in to it. You might notice that we are passing props the same way one does in the real React, and it just works! We are creating two components, that output JSM, as we defined it earlier. We create one component prop for the `SayNow` component: `dateTime`. It gets passed from the `App` component. The `SayNow` component prints out the `DateTime` passed in to it. You might notice that we are passing props the same way one does in the real React, and it just works!
@@ -26,7 +29,8 @@ The next step is to call render multiple times.
{format: "javascript"} {format: "javascript"}
``` ```
setInterval(() => setInterval(() =>
render(createElement(App()), document.getElementById('root')), render(createElement(App()),
document.getElementById('root')),
1000); 1000);
``` ```

View File

@@ -46,7 +46,8 @@ Here we begin by adding a global object that will store our last render tree, ke
const renderTrees = {}; const renderTrees = {};
function render(element, container) { function render(element, container) {
const tree = const tree =
render_internal(element, container, renderTrees[container]); render_internal(element, container,
renderTrees[container]);
// render complete, store the updated tree // render complete, store the updated tree
renderTrees[container] = tree; renderTrees[container] = tree;
} }
@@ -72,9 +73,11 @@ function render_internal(element, container, prevElement) {
domElement = createDOMElement(element); domElement = createDOMElement(element);
} }
setDOMProps(element, domElement, prevElement); setDOMProps(element, domElement, prevElement);
children = renderChildren(element, domElement, prevElement); children =
renderChildren(element, domElement, prevElement);
if (!prevElement || domElement !== prevElement.domElement) { if (!prevElement ||
domElement !== prevElement.domElement) {
container.appendChild(domElement); container.appendChild(domElement);
} }
@@ -144,16 +147,19 @@ For rendering children we use two loops. The first loop removes any elements tha
{format: "javascript"} {format: "javascript"}
``` ```
function renderChildren(element, domElement, prevElement = { props: { children: [] }}) { function renderChildren(element, domElement,
prevElement = { props: { children: [] }}) {
const elementLen = element.props.children.length; const elementLen = element.props.children.length;
const prevElementLen = prevElement.props.children.length; const prevElementLen = prevElement.props.children.length;
// remove now unused elements // remove now unused elements
for (let i = elementLen; i < prevElementLen - elementLen; i++) { for (let i = elementLen; i < prevElementLen - elementLen;
i++) {
removeDOMElement(element.props.children[i]); removeDOMElement(element.props.children[i]);
} }
// render existing and new elements // render existing and new elements
return element.props.children.map((child, i) => { return element.props.children.map((child, i) => {
const prevChild = i < prevElementLen ? prevElement.props.children[i] : undefined; const prevChild = i < prevElementLen ?
prevElement.props.children[i] : undefined;
return render_internal(child, domElement, prevChild); return render_internal(child, domElement, prevChild);
}); });
} }