Modelagem
Markup usa literais de modelo marcados chamados html para descrever o HTML que você deseja renderizar.
const temp = html`<h1>Hello World</h1>`O html retorna uma instância HTMLTemplate contendo métodos e propriedades que você pode usar para acessar ou executar muitas ações.
Renderização
Existem algumas maneiras de renderizar um modelo depois de defini-lo:
render: utiliza um HTMLElement para anexar o modelo;replace: Leva qualquer Node ou outra instânciaHTMLTemplatepara substituir no DOM;insertAfter: Pega qualquer Node ou outra instânciaHTMLTemplatepara inserir o template depois;
render
O método render usará ShadowRoot, HTMLElement ou DocumentFragment para anexar o conteúdo.
temp.render(document.body)A análise do modelo acontece no momento da renderização e só acontecerá uma vez. Isto também se aplica a outros métodos de renderização.
Chamar o método render com o mesmo destino repetidamente funcionará apenas uma vez. Você pode chamá-lo com um alvo diferente para mover o conteúdo para um local diferente.
temp.render(document.body) // will parse and append to document.body
temp.render(document.body) // will be ignored
temp.render(document.body) // will be ignored
temp.render(document.getElementById('app')) // will move content to #appreplace
O método replace utiliza qualquer HTMLTemplate ou Node, desde que não seja um ShadowRoot, HTMLBodyElement, HTMLHeadElement ou HTMLHtmlElement para substituir no DOM.
temp.replace(document.getElementById('app'))Semelhante ao método render, ele analisará o conteúdo apenas uma vez.
const loading = html`<p>loading...</p>`
html`${loading}`.render(document.body)
doSomethingAsync().then(() => {
const done = html`<p>Done</p>`
done.replace(loading)
})O método replace é poderoso, especialmente ao trabalhar com renderização assíncrona, você pode renderizar algo temporariamente como um indicador de carregamento e substituí-lo mais tarde, assim que tiver seus dados. Isso é exatamente o que o utilitário suspense faz.
insertAfter
O método insertAfter funciona exatamente como o método render. A única diferença é que ele adiciona o conteúdo do modelo após o nó de destino fornecido.
temp.insertAfter(document.getElementById('app'))Outra diferença é que ele também pode levar uma instância HTMLTemplate como alvo, permitindo renderizar templates um após o outro.
const items = [
html`<li>Buy groceries</li>`,
html`<li>Go to gym</li>`,
html`<li>Write a blog</li>`,
]
html`<ul>
${items}
</ul>`.render(document.body)
html`<li>Read a book</li>`.insertAfter(items[1])parentNode
A propriedade parentNode informará onde o modelo foi renderizado. Ele retornará o elemento ao qual os nós do modelo foram adicionados.
mounted
Depois de renderizar seu modelo, você pode usar a propriedade mounted para verificar se seu modelo foi adicionado ao destino conforme desejado.
A propriedade mounted não informará se o modelo está realmente anexado a um documento. Para isso, você pode usar o parentNode?.isConnected.
const temp1 = html`one`.render(document.createDocumentFragment())
const temp2 = html`two`.render(document.body)
console.log(
temp1.mounted, // true
temp1.parentNode?.isConnected // false
)
console.log(
temp2.mounted, // true
temp2.parentNode?.isConnected // true
)childNodes
O childNodes fornecerá uma variedade de nós de nível superior renderizados pelo modelo.
const temp = html`
Loose text
<p>a paragraph</p>
<button>click me</button>
ending
`.render(document.body)
console.log(temp.childNodes) // [text, p, text, button, text]unmount
Para remover seu modelo do destino, você pode usar o método unmount.
temp.unmount()O unmount deve ser a ÚNICA maneira de remover o modelo do DOM. Isso ocorre porque ele também cancela a assinatura de qualquer estado recursivamente. Isso significa que mesmo quando você aninhar modelos, o unmount será chamado para todos eles.
A manipulação direta do DOM pode ter resultados indesejados.
toString
Convenientemente, você pode obter uma representação em string do seu modelo em seu estado renderizado atual.
const temp = html`
Loose text
<p>a paragraph</p>
<button>click me</button>
ending
`.render(document.body)
console.log(temp.toString())
/*
Loose text
<p>a paragraph</p>
<button> click me</button>
ending
*/Ciclos ao vivo
Existem métodos adicionais disponíveis para fins de ciclo de vida. Você pode saber mais verificando o documento lifecycle.
editar este documento