Kolejne ćwiczenie z tagged template literals, będące kontynuacją poprzedniego ćwiczenia. Rozwijamy swoje umiejętności.
Ok, przypomnijmy sobie ostatnie ćwiczenie:
let languages = ["JS", "PHP", "C#"];
function wrapMany(tags, elements){
const newHTML = elements.map(function(content){
return `${tags[0]}${content}${tags[1]}`;
});
return newHTML;
}
let res = wrapMany`<li>${languages}</li>`;
console.log(res);
//Array(3) [ "<li>JS</li>", "<li>PHP</li>", "<li>C#</li>" ]
Jeżeli wszystko bezbłędnie rozumiemy, zobaczmy co chcemy osiągnąć:
let ul = wrapIntoList`${"ul"}<li>${languages}</li>`;
console.log(ul);
//<ul><li>JS</li><li>PHP</li><li>C#</li></ul>
let ol = wrapIntoList`${"ol"}<li>${languages}</li>`;
console.log(ol);
//<ol><li>JS</li><li>PHP</li><li>C#</li></ol>
Ok, zastanówmy się jak wygląda tzw. zmienna strings do której przekazujemy coś w ten sposób:
function strings(strs){
console.log(strs);
}
strings`${"expr1"}txt1${"expr2"}txt2`;
//Array(3) [ "", "txt1", "txt2" ]
Tak wygląda – na początku pusty string, potem pierwszy tekst, potem drugi. Ok, dalej drążymy temat, aż zrozumiemy co chcemy osiągnąć:
function expressions(strs, ...exprs){
console.log(strs);
console.log(exprs);
}
let expr1 = "ul";
let expr2 = ["JS", "PHP", "C#"];
expressions`${expr1}txt1${expr2}txt2`;
//[ "", "txt1", "txt2" ]
//["ul", ["JS", "PHP", "C#" ]]
Ok, już powinniśmy mieć jakiś pomysł, jak powinna wyglądać sygnatura funkcji:
function signature(tags, tag, elements ){
console.log(tags);
console.log(tag);
console.log(elements);
}
signature`${expr1}txt1${expr2}txt2`;
//[ "", "txt1", "txt2" ]
//"ul"
//["JS", "PHP", "C#"]
Teraz mała popraweczka:
function signature(tags, tag, elements ){
tags = tags.slice(1);
console.log(tags);
console.log(tag);
console.log(elements);
}
signature`${expr1}txt1${expr2}txt2`;
//[ "txt1", "txt2" ]
//"ul"
//["JS", "PHP", "C#"]
Ok, możemy pracować. Piszemy funkcję:
function wrapIntoList(tags, tag, elements){
tags = tags.slice(1);
const newHTML = elements.map(function(content){
return `${tags[0]}${content}${tags[1]}`;
});
let htmlString = newHTML.reduce(function(acc, curr){
return acc + curr;
}, `<${tag}>`);
htmlString += `</${tag}>`;
return htmlString;
}
let ul = wrapIntoList`${"ul"}<li>${languages}</li>`;
console.log(ul);
//<ul><li>JS</li><li>PHP</li><li>C#</li></ul>
let ol = wrapIntoList`${"ol"}<li>${languages}</li>`;
console.log(ol);
//<ol><li>JS</li><li>PHP</li><li>C#</li></ol>
Jeżeli tak sobie będziemy rozkładać zawsze wszystko na drobne części zanim zaczniemy pisać funkcję dla tagged template literal (aż zrozumiemy i zapamiętamy jak one działają) to nigdy nie będziemy mieć problemu
Zagadnienie jest „trudne” bo jest inne niż to, do czego jesteśmy zazwyczaj przyzwyczajeni.