Tym razem poznajemy coś, co osobiście uważam za antywzorzec. Recursive func params antipattern, tak to nazywam. Zobaczmy w czym rzecz.
Oto nasza funkcja:
const elFactory = (type, attributes, ...children) => {
const el = document.createElement(type)
for (key in attributes) {
el.setAttribute(key, attributes[key])
}
children.forEach(child => {
if (typeof child === 'string') {
el.appendChild(document.createTextNode(child))
} else {
el.appendChild(child);
}
})
return el
}
Rozumiemy, o co w niej chodzi? Okej, podpowiedź, oto jej użycie:
const markup = elFactory(
'div',
{ class: 'my-component' },
elFactory('span', {}, 'Hello World!'),
' Thanks for reading my blog!',
)
document.body.appendChild(markup);
Rozumiemy o co w niej chodzi? Okej, podpowiedź, oto wynik:
<div class="my-component">
<span>Hello World!</span> Thanks for reading my blog!
</div>
Zakładam, że nasze odpowiedzi wyglądały tak:
- Wszystko wiem, działa jak React.createElements!
- Czy argumenty funkcji mają związek z rekurencją?
- Eee… jak niby do tego doszło?
Krótko mówiąc, mamy tutaj kompletnie nieintuicyjny sposób przekazywania opcjonalnych argumentów, którymi są rekurencyjne wywołania tej funkcji (albo i nie). Logika w jakiej to jest poukładane sprawia, że rozumieć tę funkcję będzie autor i to przez 20 minut po jej napisaniu, nie dłużej.
Da się tego uniknąć przez coś, co nazywam recursive schema parameter. Jeszcze sobie o tym napiszemy.