Exemplos de Vanilla JSX
E se JSX retornasse elementos DOM?
- A função
ClickMe cria um botão e exibe a contagem de cliques
- O texto é atualizado cada vez que o botão é clicado
export default function ClickMe() {
let i = 0;
const el = <button>Click me</button> as HTMLButtonElement;
el.onclick = (e) => {
el.textContent = `Clicked ${++i} times`;
};
return el;
}
Reutilização
- O componente
ClickMe pode ser usado várias vezes, mantendo estados diferentes para cada instância
import ClickMe from "./sample1.js";
export default () => <>
<p><ClickMe /></p>
<p><ClickMe /></p>
<p><ClickMe /></p>
</>;
Criação de uma árvore DOM interativa
- É possível gerenciar uma lista de tarefas usando as classes
TodoInput e TodoList
- Itens podem ser adicionados e removidos ao clicar neles
function TodoInput(attrs: { add: (v: string) => void }) {
const input = <input /> as HTMLInputElement;
input.placeholder = 'Add todo item...';
input.onkeydown = (e) => {
if (e.key === 'Enter') {
attrs.add(input.value);
input.value = '';
}
};
return input;
}
class TodoList {
ul = <ul class='todolist' /> as HTMLUListElement;
add(v: string) {
const item = <li>{v}</li> as HTMLLIElement;
item.onclick = () => item.remove();
this.ul.append(item);
}
}
export default () => {
const list = new TodoList();
list.add('foo');
list.add('bar');
return <>
<TodoInput add={(v) => list.add(v)} />
{list.ul}
</>;
};
Processamento de grandes volumes de dados
- A função
FindNames processa e filtra grandes volumes de dados para exibir os resultados
- Os itens correspondentes são atualizados em tempo real conforme o valor de entrada
import { data } from "../fetch-dataset.js";
export default function FindNames() {
const status = <p style='margin:1em 0' /> as HTMLParagraphElement;
const results = <ul /> as HTMLUListElement;
const input = <input value='eri(c|k)a?' autocomplete='new-password' oninput={updateMatches} /> as HTMLInputElement;
updateMatches();
function updateMatches() {
const matched = (data.entries().filter(([k]) => k.match(input.value)).toArray());
const matches = (Iterator.from(matched).map(match => <Item regex={input.value} match={match} />).take(30));
results.replaceChildren(...matches);
status.textContent = `${matched.length} / ${data.size}`;
}
return <div class='sample4'>
{input}
{status}
{results}
</div>;
}
function Item(attrs: { match: [string, number], regex: string }) {
const [name, count] = attrs.match;
const total = <small style='color:#fff3'>({count})</small>;
return <li>
<span innerHTML={highlight(name, attrs.regex)} /> {total}
</li>;
}
function highlight(str: string, regex: string) {
if (!regex) return str;
const r = new RegExp(`(${regex})`, 'gi');
return str.replace(r, '<span class="match">$1</span>');
}
Introdução ao imlib
imlib é uma biblioteca desenvolvida para o immaculatalibrary.com
- Ela é usada para construir o minigamemaker.com e o site que você está lendo agora
- Foi desenvolvida porque o estado da arte existente não era suficiente, e é a forma preferida de criar apps
Resumo do GN⁺
- Este artigo explica como criar e interagir diretamente com elementos DOM usando JSX
- Ele apresenta uma forma de processar grandes volumes de dados com eficiência sem usar um virtual DOM
- A biblioteca
imlib permite desenvolver apps de maneira simples e intuitiva
- Outros projetos com funcionalidades semelhantes incluem React e Vue.js
1 comentários
Comentários do Hacker News
Obrigado pelo interesse no projeto
Se retornar nós DOM reais, uma grande vantagem do JSX se perde
A origem do JSX vem do XHP do Facebook
O exemplo final não funciona no Firefox
É muito parecido com Vanilla TSX
Lembra Action Script 3
Os exemplos não mostram componentes com props que podem mudar ao longo do tempo
Eu também criei uma biblioteca de UI baseada em expressões de template JSX que geram nós DOM reais
Não entendo o apelo do JSX
Recomendo Imba