DEV Community

Diogo Neves
Diogo Neves

Posted on • Edited on

Super componentes... E muito mais!

Super-heróis Batman e homem aranha de mãos dadas

O último lançamento da biblioteca Bemtv veio com recursos interessantes, o mais marcante deles a sintaxe possibilitada pelos SuperComponents.

Por que SuperComponent?

Um dos objetivos de criar componentes é poder utilizá-los muitas vezes em sua aplicação. Com o SuperComponent, internamente, cada vez que o componente é usado, cria-se uma instância leve que gerência essa nova renderização do componente. Essas instâncias assumem o “controle”, sempre que ocorre uma ação nelas, onde a reação é a execução de um callback passado anteriormente, normalmente em Hooks e eventos do DOM.

Um breve olhar

Componente Counter:

import { _ } from "bemtv"; const { click$, $, css, template, render } = _`Counter`({ count: 0 }); click$(() => $.count++); css` padding: 20px; color: blue; `; template`button[Clicked: $count ]`; render(); 
Enter fullscreen mode Exit fullscreen mode

Logo, vemos que não precisamos envolver a lógica do componente em uma função como de costume, então a sintaxe parece melhor e mais limpa.

Variáveis de ​​componentes(compVars)

No exemplo anterior, passamos um objeto com uma propriedade count como argumento, este objeto é chamado compVars e todas as propriedades adicionadas a ele são isoladas a cada renderização do componente, incluindo estruturas de dados como Array, Set, Map e Object.

Conhecendo nossas “variáveis”, a Bemtv consegue fornecer açúcares sintáticos realmente doces.

Um exemplo é que podemos adicionar o caminho para a propriedade diretamente no template usando o símbolo $:

import { _ } from "bemtv"; const { template, render } = _`Counter`({ message: "Hey!" }); template`button[Clicked: $message ]`; render(); 
Enter fullscreen mode Exit fullscreen mode

Se tivermos uma propriedade com o mesmo nome de um atributo HTML podemos usar o símbolo @ para informar a Bemtv para tratar a propriedade como chave e valor:

import { _ } from "bemtv"; const { template, render } = _`Img`({ src: "avatar.png", alt: "My avatar", }); template`img[ @src @alt ]`; render(); 
Enter fullscreen mode Exit fullscreen mode

Funções de transformação

As funções de transformação nos permitem adicionar uma “marca” a uma estrutura de dados e informa ao Bemtv para transformar a estrutura de dados somente quando necessário, isso nos permite focar apenas na estrutura de dados.

import { tFn } from "bemtv"; const tListJoin = tFn((list) => list.join(" br[] ")); 
Enter fullscreen mode Exit fullscreen mode

O exemplo acima cria uma função de transformação que pode ser usada com listas, e quando a lista é solicitada pelo template ele executa essa função e adiciona o resultado ao template:

import { _, tFn} from "bemtv"; const tListJoin = tFn((list) => list.join(" br[] ")); const { template } = _`List`({ list: tListJoin(["user1", "user2", "user3"]), }); template`div[Users: $list ] 
Enter fullscreen mode Exit fullscreen mode

Sempre que esta lista for alterada (ex: $.list.push(item)), A Bemtv detectará e usará a função de transformação novamente e renderizará a alteração.

As funções de transformação podem ser incrivelmente poderosas porque com Brackethtml podemos até retornar a marcação com CSS-In-JS.

Router

Um Router é usado para navegação entre visualizações de vários componentes em uma aplicação Bemtv, permite alterar a URL do navegador e mantém a UI sincronizada com a URL:

import { _, router } from "bemtv"; _`Home`().template`Hey!`; _`AboutUs`().template`Hey Again!`; const { template, render } = _`MyPages`(); template` #[] br[]br[] Links: #Home[Click to go home!] #AboutUs[Click to know about us!]`; render(); 
Enter fullscreen mode Exit fullscreen mode

No exemplo acima, criamos duas rotas(Bemtv cria rotas automaticamente) e fornecemos um local para que elas sejam renderizadas #[] e também criamos links #Home[ Texto do link ], tudo isso em poucas linhas!

Fechamento

Esses são apenas alguns dos novos recursos da biblioteca, caso queira saber mais segue o link para o repositório do projeto: Bemtv.

Obrigado por chegar até aqui!

Top comments (0)