Skip to content

Commit 9c6e215

Browse files
committed
Merge branch 'twharmon-update-rendrjs'
2 parents 92f4f2f + 60ceb42 commit 9c6e215

File tree

10 files changed

+133
-120
lines changed

10 files changed

+133
-120
lines changed

frameworks/keyed/rendrjs/README.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Rendrjs Implementation
2+
3+
4+
See the implementation
5+
```sh
6+
http://localhost:8080/frameworks/keyed/rendrjs/
7+
```
8+
9+
Run the benchmark
10+
```sh
11+
npm run bench -- --framework keyed/rendrjs --chromeBinary /var/lib/flatpak/exports/bin/com.google.Chrome && npm run results
12+
```
13+
14+
See the results
15+
```sh
16+
http://localhost:8080/webdriver-ts-results/dist/index.html
17+
```

frameworks/keyed/rendrjs/package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frameworks/keyed/rendrjs/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"webpack-cli": "5.1.4"
1111
},
1212
"dependencies": {
13-
"@rendrjs/core": "0.1.190"
13+
"@rendrjs/core": "0.1.236"
1414
},
1515
"js-framework-benchmark": {
1616
"frameworkVersionFromPackage": "@rendrjs/core",

frameworks/keyed/rendrjs/src/App.js

Lines changed: 46 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
1-
import { rendr, useCallback, useState } from '@rendrjs/core';
2-
import Jumbotron from './Jumbotron';
3-
import Row from './Row';
1+
import { div, rendr, table, tbody, useState } from '@rendrjs/core';
2+
import { Jumbotron } from './Jumbotron';
3+
import { Row } from './Row';
4+
import { makeIcon } from './RemoveIcon';
45

5-
const random = (max) => Math.round(Math.random() * 1000) % max;
6+
let random = (max) => Math.round(Math.random() * 1000) % max;
67

7-
const A = ['pretty', 'large', 'big', 'small', 'tall', 'short', 'long', 'handsome',
8+
let A = ['pretty', 'large', 'big', 'small', 'tall', 'short', 'long', 'handsome',
89
'plain', 'quaint', 'clean', 'elegant', 'easy', 'angry', 'crazy', 'helpful', 'mushy',
910
'odd', 'unsightly', 'adorable', 'important', 'inexpensive', 'cheap', 'expensive',
1011
'fancy'];
11-
const C = ['red', 'yellow', 'blue', 'green', 'pink', 'brown', 'purple', 'brown',
12+
let C = ['red', 'yellow', 'blue', 'green', 'pink', 'brown', 'purple', 'brown',
1213
'white', 'black', 'orange'];
13-
const N = ['table', 'chair', 'house', 'bbq', 'desk', 'car', 'pony', 'cookie',
14+
let N = ['table', 'chair', 'house', 'bbq', 'desk', 'car', 'pony', 'cookie',
1415
'sandwich', 'burger', 'pizza', 'mouse', 'keyboard'];
1516

1617
let nextId = 1;
1718

18-
const buildData = (count) => {
19-
const data = new Array(count);
19+
let buildData = (count) => {
20+
let data = new Array(count);
2021

2122
for (let i = 0; i < count; i++) {
2223
data[i] = {
@@ -28,64 +29,53 @@ const buildData = (count) => {
2829
return data;
2930
};
3031

31-
const preloadIcon = rendr('span', {
32-
className: 'preloadicon glyphicon glyphicon-remove',
33-
'aria-hidden': true,
34-
});
32+
export let preloadIcon = makeIcon(true);
3533

36-
const App = () => {
37-
const [state, setState] = useState({ data: [], selected: 0 });
34+
export let App = () => {
35+
let [state, setState] = useState({ arr: [], sel: 0 });
3836

39-
const onRun = useCallback(() => setState({ data: buildData(1000), selected: 0 }), []);
40-
const onRunlots = useCallback(() => setState({ data: buildData(10000), selected: 0 }), []);
41-
const onClear = useCallback(() => setState({ data: [], selected: 0 }), []);
42-
const onUpdate = useCallback(() => setState(old => {
43-
const newData = old.data.slice(0);
44-
for (let i = 0; i < newData.length; i += 10) {
45-
const r = newData[i];
46-
newData[i] = { id: r.id, label: r.label + ' !!!' };
37+
let run = () => setState({ arr: buildData(1000), sel: 0 });
38+
let lots = () => setState({ arr: buildData(10000), sel: 0 });
39+
let clear = () => setState({ arr: [], sel: 0 });
40+
let update = () => setState(old => {
41+
for (let i = 0; i < old.arr.length; i += 10) {
42+
old.arr[i].label += ' !!!';
4743
}
48-
return { data: newData, selected: old.selected };
49-
}), []);
50-
const onSwap = useCallback(() => setState(old => {
51-
if (old.data.length > 998) {
52-
const d1 = old.data[1];
53-
const d998 = old.data[998];
54-
old.data[1] = d998;
55-
old.data[998] = d1;
56-
return { ...old };
44+
return { ...old };
45+
});
46+
let swap = () => setState(old => {
47+
if (old.arr.length > 998) {
48+
let one = old.arr[1];
49+
old.arr[1] = old.arr[998];
50+
old.arr[998] = one;
5751
}
58-
return { data: old.data, selected: 0 };
59-
}), []);
60-
const onAppend = useCallback(() => setState(old => {
61-
return { data: old.data.concat(buildData(1000)), selected: old.selected };
62-
}), []);
63-
const onDelete = useCallback((id) => setState(old => {
64-
old.data.splice(old.data.findIndex((d) => d.id === id), 1);
52+
return { ...old, sel: 0 };
53+
});
54+
let push = () => setState(old => ({ arr: old.arr.concat(buildData(1000)), sel: old.sel }));
55+
let del = (id) => setState(old => {
56+
old.arr.splice(old.arr.findIndex((d) => d.id === id), 1);
6557
return { ...old };
66-
}), []);
67-
const onSelect = useCallback((id) => setState(old => ({ ...old, selected: id })), []);
58+
});
59+
let sel = id => setState(old => ({ ...old, sel: id }));
6860

69-
return rendr('div', {
70-
className: 'container',
61+
return div({
62+
class: 'container',
7163
slot: [
72-
rendr(Jumbotron, { onRun, onRunlots, onClear, onUpdate, onSwap, onAppend, memo: [] }),
73-
rendr('table', {
74-
className: 'table table-hover table-striped test-data',
75-
slot: rendr('tbody', {
76-
slot: state.data.map(item => rendr(Row, {
77-
key: `${item.id}`,
78-
item: item,
79-
selected: state.selected === item.id,
80-
onSelect,
81-
onDelete,
82-
memo: [item.id === state.selected, item.label],
64+
rendr(Jumbotron, { run, lots, clear, update, swap, push, memo: [] }),
65+
table({
66+
class: 'table table-hover table-striped test-data',
67+
slot: tbody({
68+
slot: state.arr.map(item => rendr(Row, {
69+
key: item.id,
70+
item,
71+
hi: state.sel === item.id,
72+
sel,
73+
del,
74+
memo: [item.id === state.sel, item.label],
8375
})),
8476
}),
8577
}),
8678
preloadIcon,
8779
],
8880
});
8981
};
90-
91-
export default App;
Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
import { rendr } from '@rendrjs/core';
1+
import { button, div } from '@rendrjs/core';
2+
import { colSm6 } from './classes';
23

3-
const Button = (props) => {
4-
return rendr('div', {
5-
className: 'col-sm-6 smallpad',
6-
slot: rendr('button', {
4+
let className = colSm6 + ' smallpad';
5+
export let Button = (props) => {
6+
return div({
7+
class: className,
8+
slot: button({
79
id: props.id,
810
onclick: props.cb,
911
type: 'button',
10-
className: 'btn btn-primary btn-block',
11-
slot: props.title,
12+
class: 'btn btn-primary btn-block',
13+
slot: props.text,
1214
}),
1315
});
1416
};
15-
16-
export default Button;

frameworks/keyed/rendrjs/src/Jumbotron.js

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,34 @@
1-
import { rendr } from '@rendrjs/core';
2-
import Button from './Button';
1+
import { div, h1, rendr } from '@rendrjs/core';
2+
import { Button } from './Button';
3+
import { colMd6 } from './classes';
34

4-
const Jumbotron = (props) => {
5-
return rendr('div', {
6-
className: 'jumbotron',
7-
slot: rendr('div', {
8-
className: 'row',
5+
let header = div({
6+
class: colMd6,
7+
slot: h1({ slot: 'Rendrjs keyed' }),
8+
});
9+
10+
export let Jumbotron = (props) => {
11+
return div({
12+
class: 'jumbotron',
13+
slot: div({
14+
class: 'row',
915
slot: [
10-
rendr('div', {
11-
className: 'col-md-6',
12-
slot: rendr('h1', { slot: 'Rendrjs keyed' }),
13-
}),
14-
rendr('div', {
15-
className: 'col-md-6',
16-
slot: rendr('div', {
17-
className: 'row',
16+
header,
17+
div({
18+
class: colMd6,
19+
slot: div({
20+
class: 'row',
1821
slot: [
19-
rendr(Button, { id: 'run', title: 'Create 1,000 rows', cb: props.onRun }),
20-
rendr(Button, { id: 'runlots', title: 'Create 10,000 rows', cb: props.onRunlots }),
21-
rendr(Button, { id: 'add', title: 'Append 1,000 rows', cb: props.onAppend }),
22-
rendr(Button, { id: 'update', title: 'Update every 10th row', cb: props.onUpdate }),
23-
rendr(Button, { id: 'clear', title: 'Clear', cb: props.onClear }),
24-
rendr(Button, { id: 'swaprows', title: 'Swap rows', cb: props.onSwap }),
22+
rendr(Button, { id: 'run', text: 'Create 1,000 rows', cb: props.run }),
23+
rendr(Button, { id: 'runlots', text: 'Create 10,000 rows', cb: props.lots }),
24+
rendr(Button, { id: 'add', text: 'Append 1,000 rows', cb: props.push }),
25+
rendr(Button, { id: 'update', text: 'Update every 10th row', cb: props.update }),
26+
rendr(Button, { id: 'clear', text: 'Clear', cb: props.clear }),
27+
rendr(Button, { id: 'swaprows', text: 'Swap rows', cb: props.swap }),
2528
],
2629
}),
2730
}),
2831
],
2932
}),
3033
});
3134
};
32-
33-
export default Jumbotron;
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { span } from '@rendrjs/core';
2+
3+
export let makeIcon = preload => span({
4+
class: `${preload ? 'preloadicon ' : ''}glyphicon glyphicon-remove`,
5+
ariaHidden: true,
6+
});

frameworks/keyed/rendrjs/src/Row.js

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,30 @@
1-
import { rendr } from '@rendrjs/core';
1+
import { a, td, tr } from '@rendrjs/core';
2+
import { colMd1, colMd4, colMd6 } from './classes';
3+
import { makeIcon } from './RemoveIcon';
24

3-
const Row = (props) => {
4-
return rendr('tr', {
5-
className: props.selected ? 'danger' : undefined,
5+
let icon = makeIcon();
6+
let emptyTd = td({ class: colMd6 });
7+
8+
export let Row = ({ hi, sel, item, del }) => {
9+
return tr({
10+
class: hi ? 'danger' : undefined,
611
slot: [
7-
rendr('td', {
8-
className: 'col-md-1',
9-
slot: `${props.item.id}`,
10-
}),
11-
rendr('td', {
12-
className: 'col-md-4',
13-
slot: rendr('a', {
14-
onclick: () => props.onSelect(props.item.id),
15-
slot: props.item.label,
12+
td({ class: colMd1, slot: `${item.id}` }),
13+
td({
14+
class: colMd4,
15+
slot: a({
16+
onclick: () => sel(item.id),
17+
slot: item.label,
1618
}),
1719
}),
18-
rendr('td', {
19-
className: 'col-md-1',
20-
slot: rendr('a', {
21-
onclick: () => props.onDelete(props.item.id),
22-
slot: rendr('span', {
23-
className: 'glyphicon glyphicon-remove',
24-
'aria-hidden': true,
25-
}),
20+
td({
21+
class: colMd1,
22+
slot: a({
23+
onclick: () => del(item.id),
24+
slot: icon,
2625
}),
2726
}),
28-
rendr('td', {
29-
className: 'col-md-6',
30-
}),
27+
emptyTd,
3128
],
3229
});
3330
};
34-
35-
export default Row;
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export let colMd1 = 'col-md-1';
2+
export let colMd4 = 'col-md-4';
3+
export let colMd6 = 'col-md-6';
4+
export let colSm6 = 'col-sm-6';

frameworks/keyed/rendrjs/src/main.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
import { mount, rendr } from '@rendrjs/core';
2-
import App from './App';
2+
import { App } from './App';
33

44
mount(document.querySelector('#root'), rendr(App));

0 commit comments

Comments
 (0)