Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

[Reclamação] Não entendi esse "Para saber mais" sobre template literal

Olá.

Infelizmente, achei essa atividade ruim (atividade 6, "Para saber mais: template literals - tagged templates") :-(

A explicação está muito rasa e não consegui entender. Essa parte, apesar de ser um "extra" no curso, não foi bem explicada.

Além disso, rodei o código no console e o que retornou foi isso:

var a = 42;
var b = 73;

function tag(strings, ...valores) {
  console.log(strings[0]); // "Sheldon "
  console.log(strings[1]); // " Cooper "
  console.log(valores[0]);  // 42
  console.log(valores[1]);  // 73

  return "Bazinga!";
}

tag`Hello ${ a + b } world ${ a * b}`;
// "Bazinga!"


// retorno do console
// Hello 
//  world 
// 115
// 3066
//'Bazinga!'

Não entendi esse retorno nem a ordem do que foi impresso no console.

3 respostas

Salve, Matheus!

Dá uma olhada nesse artigo sobre Tagged Template Literals, ele explica extamente isso!

Se precisar de ajuda, deixa uma mensagem aqui pra mim ;)

solução!

Eu também expandi e alterei o meu texto original, vê se assim fica mais fácil de compreender:

Conceito

Tagged template strings expandem a utilidade dos template literals, permitindo que você passe um literal de template através de uma função. A função pode então realizar operações nesses strings antes de retornar o resultado final. Isso é útil para sanitização, localização, e muitos outros propósitos.

Como Funciona

A função especial que trata o template literal é chamada com argumentos de forma um pouco diferente:

  1. Primeiro argumento: um array de strings contendo os textos literais (os que estão fora das expressões de interpolação).
  2. Demais argumentos: os valores resultantes das expressões de interpolação.

Exemplo

Vamos atualizar o exemplo para usar let ao invés de var, seguindo as recomendações do ES6, e detalhar melhor o que acontece:


let a = 42;
let b = 73;

function tag(strings, ...valores) {
  console.log(strings[0]); // "Hello "
  console.log(strings[1]); // " world "
  console.log(valores[0]);  // 115 (resultado de a + b)
  console.log(valores[1]);  // 3066 (resultado de a * b)

  // Aqui podemos manipular os strings e valores como desejarmos
  return "Bazinga!";
}

// Vamos passar o template literal pela função tag
let resultado = tag`Hello ${a + b} world ${a * b}`;
console.log(resultado); // "Bazinga!"
 

Fluxo Quando você chama tag com um template literal como:


tag`Hello ${a + b} world ${a * b}`, 
 

O JavaScript automaticamente divide o template em partes:

  • Strings literais: "Hello " e " world ", passados no primeiro argumento como um array.
  • Valores das expressões: 115 (a soma de a e b) e 3066 (o produto de a e b), passados como argumentos subsequentes.

A função tag então imprime os componentes do template para demonstrar como eles são recebidos. Por fim, retorna "Bazinga!", mostrando que o retorno da função substitui o valor original do template literal.

Obrigado Vinny, o texto está mais claro!

Acho que o que estava me confundindo mais era procurar como "Sheldon" e "Cooper" apareceriam no texto anterior. Eu pensei que estivesse faltando um pedaço de código e por isso não estava conseguindo ligar os pontos.

Agradeço também pelo artigo. Foi bem esclarecedor, principalmente para entender melhor o funcionamento de styled-components (eu achava que era alguma magia negra dessa tecnologia).