<div id=“prihlaseni“>
<button>Obnov</button>
<table>
<thead>
<tr>
<th>ID</th>
<th>Nick</th>
<th>Meno</th>
<th>Priezvisko</th>
<th>Email</th>
</tr>
<thead>
<tbody></tbody>
</table>
<div>
<script src=“jquery.min.js“></script>
<script>
function nacitajAvykresli() {
function vykresli (uzivatelia) {
var riadky = “
uzivatelia.forEach(function (riadok) {
riadky += ‚<tr>‘
Object.keys(riadok).forEach(function (stlpec) {
riadky += ‚<td>‘ + riadok[stlpec] + ‚</td>‘
})
riadky += ‚</tr>‘
})
$(‚#prihlaseni tbody‘).html(riadky) //–> JEDNA
}
$.getJSON(‚url_zdroja_dat‘).then(vykresli) //–> DVA
}
// Aktualne prihlasenych hned nacitaj a vykresli
nacitajAvykresli()
// A na kliknutie na „Obnov“ ich znovu nacitaj a vykresli
$(‚#prihlaseni button‘).click(nacitajAvykresli) //–> TRI
<script>
Z pohľadu na takýto kód je na okamžite jasné v čom jQuery pomôže – registrácia udalosti, načítanie údajov a manipulácia s obsahom značky na miestach JEDNA, DVA a TRI. A funkciu vykresli() – čiže kedy, kde a ako získané údaje vykreslíme, v tom nám necháva slobodu. Avšak, prax ukázala, že nám tým necháva nie len slobodu, ale aj zodpovednosť za efektivitu. A tá tu pokrivkáva, keďže obsah tabuľky si zo získaných údajov akurát tak ručne vyskladávame do string premennej, ktorou následne nahrádzame TBODY.
Kde je problém? Prečo tvrdím, že tu efektivita pokrivkáva? Za prvé, samotné skladanie obsahu tej string premennej. To, že k nej v cykle pripíname ďalší a ďalší obsah je neefektívne. Treba si uvedomiť, že v konečnom dôsledku nič nepripíname, keďže v JS sú stringy immutable. A druhý problém je samotné vykreslenie – riešime to len prostým vymazaním obsahu TBODY a následným nahradením obsahom tej textovej premenej. Čo v tomto prípade nie je až tak zlé, ale v inom prípade sa môžete ľahko dopustiť layout trashingu a tým pádom v niektorých prehliadačoch spomaliť vykreslenie aj o 90%. A teraz si ešte predstavte, že by ste chceli mať tú tabuľku zoraditeľnú podľa jednotlivých stĺpcov. Čiže aby TH značky boli klikateľné a po kliknutí aby sa pole užívateľov zoradilo podľa kľúča daného stĺpca. Po tom zoradení budeme musieť túto tabuľku znovu prekresliť. Čo znamená zasa tým nevhodným spôsobom vyskladávať obsah do textovej premennej a znovu vymazať a nahradiť obsah TBODY. Plus neefektivita z iného pohľadu – čo ak klikneme obnoviť, ale nikto nový sa neprihlásil / neodhlásil? Čiže sa nám vrátia tie isté dáta, ktoré už máme zobrazené? Napriek tomu budeme znovu skladať, mazať, vykreslovať. A znovupoužiteľnosť? Čo ak na stránke budem potrebovať takéto dynamické tabuľky tri? To mám pre každú zvlášť písať takmer ten istý kód? Nemusíte, ale tak ako vykreslenie, aj znovupoužiteľnosť si musíte vymyslieť a naprogramovať sami.
Takto to proste funguje s jQuery. Máte slobodu, ale tým pádom aj zodpovednosť za tie najdôležitejšie úlohy. Žiaľ, tak to potom aj vyzerá. Kopec vývojárov si neuvedomuje, že s každým volaním funkcie $(selektor) sa prehľadáva celý DOM model. Nevedia, že počúvanie na udalosť, napríklad nad nejakým zoznamom, je efektívnejšie zaregistrovať jedenkrát nad nadradeným elementom a z event targetu si načítať, ktorá položka zoznamu udalosť vyvolala, namiesto toho, aby zaregistrovali počúvanie na udalosť pre každú položku zvlášť. A o niečom takom ako layout trashing ani netušia čo je, nieto ešte aby vedeli ako sa mu vyhnúť. Prax proste ukázala, že sloboda je skôr na škodu ako výhodou a tak efektivita riešení s jQuery býva často mizerná…
Pozrime sa teraz na ten istý príklad s použitím Vue:
<div id="prihlaseni">
<button @click="obnov">Obnov</button>
<table>
<thead>
<tr>
<th>ID</th>
<th>Nick</th>
<th>Meno</th>
<th>Priezvisko</th>
<th>Email</th>
</tr>
<thead>
<tbody>
<tr v-for="riadok in uzivatelia">
<td v-for="stlpec in riadok">{{ stlpec }}</td>
</tr>
</tbody>
</table>
<div>
<script src="vue.min.js"></script>
<script src="axios.min.js"></script>
<script>
new Vue({
el: '#prihlaseni',
data: {
uzivatelia: []
},
methods: {
obnov: function () {
axios.get('url_zdroja_dat')
.then(resp => this.uzivatelia = resp.data)
}
},
created: function () {
this.obnov()
}
})
<script>