{"id":230080,"date":"2022-11-17T11:47:00","date_gmt":"2022-11-17T08:47:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230080"},"modified":"2022-11-17T11:48:33","modified_gmt":"2022-11-17T08:48:33","slug":"jquery-komponenttien-luominen-wordpressissae","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/jquery-komponenttien-luominen-wordpressissae\/","title":{"rendered":"jQuery-komponenttien luominen WordPressiss\u00e4"},"content":{"rendered":"\n<p>Etup\u00e4\u00e4n kehitys on ottanut suuria harppauksia parin viime vuoden aikana (ja tekee niin edelleen) <a href=\"http:\/\/sass-lang.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">CSS-esiprosessorien<\/a> ja erilaisten JavaScript-pohjaisten tekniikoiden k\u00e4yt\u00f6n ansiosta.<\/p>\n<p>Hienoa on, ett\u00e4 kaikkia n\u00e4it\u00e4 voidaan edelleen k\u00e4ytt\u00e4\u00e4 WordPress-kehityksen yhteydess\u00e4; Koska WordPress kuitenkin sis\u00e4lt\u00e4\u00e4 jQueryn, ei ole harvinaista jatkaa jQuery-pohjaisen JavaScriptin kirjoittamista.<\/p>\n<p>Huolimatta kaikista erilaisista teknologioista (kuten <a href=\"https:\/\/angular.io\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Angular<\/a>, <a href=\"https:\/\/vuejs.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Vue<\/a>, <a href=\"https:\/\/reactjs.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">React<\/a> jne.), huomaan silti k\u00e4ytt\u00e4v\u00e4ni <a href=\"https:\/\/jquery.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">jQuery\u00e4<\/a> ja <a href=\"https:\/\/es6.io\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ES6<\/a> :ta enemm\u00e4n kuin muita kirjastoja ja ty\u00f6kaluja.<\/p>\n<p>Yksinkertaisissa teht\u00e4viss\u00e4 se ei ole ongelma, mutta kun on esimerkiksi rakennettava edistyneempi\u00e4 komponentteja API-kutsun vastauksen perusteella, jQueryn k\u00e4ytt\u00f6 voi olla hieman raskasta.<\/p>\n<p>T\u00e4m\u00e4 ei tarkoita, ettei sit\u00e4 voisi k\u00e4ytt\u00e4\u00e4 \u2013 ja k\u00e4yn l\u00e4pi, kuinka sit\u00e4 k\u00e4ytet\u00e4\u00e4n komponenttien rakentamiseen hetkellisesti dynaamisesti \u2013 mutta mielest\u00e4ni se on esimerkki siit\u00e4, milloin muut vaihtoehdot ovat vaihtelevampia.<\/p>\n<p>Mutta siit\u00e4 lis\u00e4\u00e4 postauksen lopussa.<\/p>\n<h2>jQuery-komponenttien luominen WordPressiss\u00e4<\/h2>\n<p>Aina kun viittaan komponentin ideaan, ajattelen elementtien yhdistelm\u00e4\u00e4, joka toimii yhdess\u00e4 luodakseen monimutkaisemman elementin.<\/p>\n<p>Oletetaan esimerkiksi, ett\u00e4 soitat API-kutsun ja sitten vastauksen avulla sinun on luotava komponentti, joka koostuu muista elementeist\u00e4.<\/p>\n<h3>Komponentin m\u00e4\u00e4ritt\u00e4minen ja piirt\u00e4minen<\/h3>\n<p>Joten aluksi, mielest\u00e4ni t\u00e4m\u00e4 on hyv\u00e4 tapa m\u00e4\u00e4ritell\u00e4 komponentti: elementti, joka koostuu elementtien yhdistelm\u00e4st\u00e4.<\/p>\n<p>Ainakin sit\u00e4 aion k\u00e4ytt\u00e4\u00e4 t\u00e4ss\u00e4 postauksessa.<\/p>\n<p>Seuraavaksi, kuinka voisimme visualisoida t\u00e4m\u00e4n termein ennen sen kodifiointia? Ehk\u00e4 jotain t\u00e4m\u00e4n kaltaista:<\/p>\n<p>J\u00e4lleen kaikki t\u00e4m\u00e4 perustuu ajatukseen API-pyynn\u00f6n tekemisest\u00e4 ja tietojen k\u00e4sittelyst\u00e4.<\/p>\n<h3>API-puhelun tekeminen<\/h3>\n<p>Olen k\u00e4sitellyt joissakin viesteiss\u00e4 API-kutsun soittamista WordPress-sovellusliittym\u00e4n avulla (ja jos etsit turvallisinta tapaa tehd\u00e4 se, suosittelen <a href=\"https:\/\/wordpress.mediadoma.com\/fi\/suojattujen-ajax-pyyntoejen-laehettaeminen-wordpressissae-noncesilla\/\" title=\"t\u00e4m\u00e4n viestin\">t\u00e4m\u00e4n viestin<\/a> lukemista ).<\/p>\n<p>Mutta ohjausvirta n\u00e4ytt\u00e4isi suunnilleen t\u00e4lt\u00e4:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-165318-61e77cd5dc522.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-165318-61e77cd5dc522.png\" alt=\"jQuery-komponenttien luominen WordPressiss\u00e4\"><\/a><\/p>\n<p>Ja koodi sen tekemiseen n\u00e4ytt\u00e4isi suunnilleen <a href=\"https:\/\/gist.github.com\/tommcfarlin\/3d708d486ef8cbcbdb5c6cf932b6e9c7#file-00-request-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4lt\u00e4<\/a> :<\/p>\n<pre><code>$.get(acme_ajax_object.ajax_url, {\n\n  action:   'get_data',\n  security: acme_ajax_object.security\n\n}, function(response) {\n\n  \/\/ More to come...\n\n});<\/code><\/pre>\n<p>Mutta se ei silti johda meit\u00e4 siihen pisteeseen, ett\u00e4 rakennetaan komponentti vastauksesta.<\/p>\n<h3>Ty\u00f6skentely Responsen kanssa<\/h3>\n<p>T\u00e4m\u00e4 seuraava bitti on kaikki, miten p\u00e4\u00e4t\u00e4t kirjoittaa JavaScriptin. En v\u00e4it\u00e4, ett\u00e4 tapa, jolla teen, on tapa tehd\u00e4 se, mutta se on tapa tehd\u00e4 se.<\/p>\n<p>Joka tapauksessa t\u00e4ss\u00e4 viestiss\u00e4 oletetaan, ett\u00e4 saamme joitain tietoja takaisin API:lta ja ett\u00e4 meill\u00e4 on taatusti ne (t\u00e4m\u00e4 est\u00e4\u00e4 meit\u00e4 kirjoittamasta suojalausekkeita).<\/p>\n<p>Lis\u00e4ksi sen avulla voimme t\u00e4ytt\u00e4\u00e4 tarvittavat muuttujat komponenttimme rakentamiseksi. N\u00e4in ollen pid\u00e4n koodin <a href=\"https:\/\/gist.github.com\/tommcfarlin\/3d708d486ef8cbcbdb5c6cf932b6e9c7#file-01-response-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">mahdollisimman ohuena<\/a>.<\/p>\n<pre><code>var $container = $('#component-container'),\n    i, l       = 0;\n\n$.get(acme_ajax_object.ajax_url, {\n\n  action:   'get_data',\n  security: acme_ajax_object.security\n\n}, function( response) {\n\n  for( i = 0, l = response.data.length; i &lt; l; i++) {\n    $container.append(\n      _createComponent(response.data[i])\n    );\n  }\n\n});<\/code><\/pre>\n<p>T\u00e4st\u00e4 eteenp\u00e4in voimme nyt m\u00e4\u00e4ritt\u00e4\u00e4 menetelm\u00e4n, joka luo komponentin ja palauttaa tuloksen, jonka avulla voimme liitt\u00e4\u00e4 sen DOM:iin.<\/p>\n<h3>Laittamalla kaikki yhteen<\/h3>\n<p>Yll\u00e4 olevan koodin perusteella pit\u00e4isi olla suhteellisen selv\u00e4\u00e4, mit\u00e4 sinun tulee tehd\u00e4 komponentin luomiseksi.<\/p>\n<p>Silti kaiken yhdist\u00e4minen on prosessi, joka vaatii seuraavaa:<\/p>\n<ol>\n<li>pyynn\u00f6n esitt\u00e4minen,<\/li>\n<li>lukea vastausta,<\/li>\n<li>komponentin rakentaminen vastauksen perusteella<\/li>\n<\/ol>\n<pre><code>\/**\n * Creates a component to be added from the DOM based on the incoming data.\n *\n * For the purposes of this function, we're assuming there are several properties\n * on data of which we're already aware.\n *\n * @param data  The object containing the properties we need for the component.\n *\n * @return      The component created from the incoming data.\n *\/\nfunction _createComponent(data) {\n\n  var title       = data.title,\n      imageUrl    = data.imageUrl,\n      description = data.description,\n      $component  = $('&lt;div &gt;&lt;\/div&gt;');\n\n  $component\n    .append(\n      $('&lt;p &gt;&lt;\/p&gt;').text(title)) .append(\n      $('&lt;img \/&gt;').attr('src', imageUrl)) .append(\n      $('&lt;p &gt;&lt;\/p&gt;').text(description)\n    );\n\n  return $component;\n}<\/code><\/pre>\n<p>Yll\u00e4 olevan koodin pit\u00e4isi olla itsest\u00e4\u00e4n selv\u00e4, mutta jos ei, se toimii <a href=\"https:\/\/gist.github.com\/tommcfarlin\/3d708d486ef8cbcbdb5c6cf932b6e9c7#file-02-create-component-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">seuraavasti<\/a> :<\/p>\n<ol>\n<li>Otetaan vastauksesta tietoja, kuten otsikko, kuvan URL-osoite ja kuvaus,<\/li>\n<li>luoda elementtej\u00e4 jokaisesta niist\u00e4,<\/li>\n<li>lis\u00e4\u00e4m\u00e4ll\u00e4 ne <strong>div<\/strong> &#8211; elementtiin<\/li>\n<li><strong>div<\/strong> -elementin palauttaminen sen j\u00e4lkeen, kun siihen on liitetty eri palaset.<\/li>\n<\/ol>\n<p>Sielt\u00e4 voit sitten ottaa elementin \u2013 komponentin \u2013 ja liitt\u00e4\u00e4 sen s\u00e4il\u00f6\u00f6n (kuten koodissa aiemmin on esitetty) ja jatkaa sitten niin muiden vastauksen tietojen kanssa.<\/p>\n<h2>K\u00e4yt\u00e4tk\u00f6 muita JavaScript-tekniikoita?<\/h2>\n<p>Kuten viestin alussa mainittiin, t\u00e4m\u00e4 on paljon ty\u00f6t\u00e4 jQueryn suhteen DOM:iin lis\u00e4tt\u00e4v\u00e4n komponentin luomiseksi.<\/p>\n<p>Yhdist\u00e4 t\u00e4m\u00e4 reagoivaan luonteeseen (ei responsiivinen mobiilisuunnittelun kannalta, vaan n\u00e4yt\u00f6n osien suhteen, jotka vastaavat esityskerroksen muutokseen), ja sinulla on melko hyv\u00e4 syy k\u00e4ytt\u00e4\u00e4 erilaista tekniikkaa tehd\u00e4ksesi jotain t\u00e4llaista.<\/p>\n<p>Mutta silti on niit\u00e4 projekteja, jotka vaativat tietty\u00e4 pinoa, ja jos jQuery on osa t\u00e4t\u00e4 pinoa, t\u00e4m\u00e4 on yksi tapa edet\u00e4 ja tehd\u00e4 juuri niin.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vaikka muut tekniikat saattavat soveltua t\u00e4h\u00e4n paremmin, n\u00e4in voit luoda jQuery-komponentteja WordPressiss\u00e4 k\u00e4ytett\u00e4v\u00e4ksi Ajaxin kanssa.<\/p>\n","protected":false},"author":1,"featured_media":224394,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[730,719,917,843],"tags":[1166],"class_list":["post-230080","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript-5","category-kehittaejae","category-muut","category-opetusohjelmia","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230080","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=230080"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230080\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/224394"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=230080"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=230080"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=230080"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}