{"id":233984,"date":"2023-02-26T18:46:00","date_gmt":"2023-02-26T15:46:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233984"},"modified":"2023-02-26T18:47:22","modified_gmt":"2023-02-26T15:47:22","slug":"gutenberg-paeivitys-select-ja-withdispatchilla-react-hooksiin-useselect-and-usedispatch","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/gutenberg-paeivitys-select-ja-withdispatchilla-react-hooksiin-useselect-and-usedispatch\/","title":{"rendered":"Gutenberg: P\u00e4ivitys Select- ja withDispatchilla React Hooksiin (useSelect and useDispatch)"},"content":{"rendered":"\n<p>T\u00e4m\u00e4 viesti on nopea johdatus tapaan pit\u00e4\u00e4 Gutenberg-koodisi nykyisten standardien tasolla React-koukkujen avulla. Katsotaan, kuinka t\u00e4st\u00e4 on hy\u00f6ty\u00e4, miksi meid\u00e4n pit\u00e4isi tehd\u00e4 se ja miten.<\/p>\n<h2>Huh, koukut?<\/h2>\n<p>Oletan, ett\u00e4 sinulla on jo kokemusta ty\u00f6skentelyst\u00e4 hieman monimutkaisempien Gutenberg-lohkojen tai -laajennusten kanssa, jotka kyselev\u00e4t viestej\u00e4 tai hakevat ja p\u00e4ivitt\u00e4v\u00e4t postin metaa. Ja n\u00e4in ollen ty\u00f6skennellyt <code>[withSelect](https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-data\/#withSelect)<\/code>ja\/tai <code>[withDispatch](https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-data\/#withDispatch)<\/code>. N\u00e4m\u00e4 ovat korkeamman asteen komponentteja WordPressiss\u00e4, joiden avulla voit k\u00e4ytt\u00e4\u00e4 WordPressin kauppoja hakeaksesi tai ty\u00f6nt\u00e4\u00e4ksesi tietoja, jotka ovat hieman &quot;normaalin&quot; lohkon tai j\u00e4lkeisen muokkauksen ulkopuolella. Olet ehk\u00e4 joutunut k\u00e4ytt\u00e4m\u00e4\u00e4n <code>compose<\/code>sit\u00e4 my\u00f6s yhdist\u00e4\u00e4ksesi komponentti, jossa on useita korkeamman asteen komponentteja. Jos koodisi k\u00e4ytt\u00e4\u00e4 n\u00e4it\u00e4 malleja, \u00e4l\u00e4 huoli \u2013 ne toimivat t\u00e4ydellisesti ja toimivat edelleen! Mutta tekniikan kehittyess\u00e4 voimme tehd\u00e4 paremmin.<\/p>\n<p>Alkuvuodesta 2019 <a href=\"https:\/\/reactjs.org\/docs\/hooks-intro.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">React julkaisi koukut<\/a> (versio 16.8) \u2013 joiden avulla voit k\u00e4ytt\u00e4\u00e4 tilaa ilman luokkaa ja parantaa muita ominaisuuksia, jotka tekev\u00e4t koodista luettavamman ja uudelleenk\u00e4ytett\u00e4v\u00e4n. Esimerkiksi poistamalla tarve k\u00e4\u00e4ri\u00e4 koodi korkeamman asteen osiin p\u00e4\u00e4st\u00e4ksesi rekistereihin. Ja <a href=\"https:\/\/make.wordpress.org\/core\/2019\/06\/10\/introducing-usedispatch-and-useselect\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kes\u00e4ll\u00e4 2019 seurasi WordPress<\/a> lanseeraten mukautettuja koukkuja: <code>[useDispatch](https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-data\/#useDispatch)<\/code>ja <code>[useSelect](https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-data\/#useSelect)<\/code>.<\/p>\n<p>Koukuilla on monia etuja. Yleisin esimerkki on komponenttitilan k\u00e4yt\u00f6n salliminen ilman Javascript-luokan (<code>useState<\/code>) kirjoittamista. Mutta mielest\u00e4ni suurin hy\u00f6ty on uudelleenk\u00e4ytett\u00e4vyys. Poistamalla tarve k\u00e4ytt\u00e4\u00e4 kuvioita, kuten render\u00f6intirekvisiittaa ja korkeamman asteen komponentteja, komponentit voidaan kirjoittaa paljon itsen\u00e4isemmiksi osiksi. Toinen koukkujen etu on, ett\u00e4 se tekee koodistasi helpompi lukea ja ymm\u00e4rt\u00e4\u00e4!<\/p>\n<p>Siirryt\u00e4\u00e4np\u00e4 suoraan esimerkkeihin ja katsotaan, kuinka koodimme toteutetaan <code>useSelect<\/code>ja <code>useDispatch<\/code>kiinnitet\u00e4\u00e4n!<\/p>\n<h2>Toteutus<code>useSelect<\/code><\/h2>\n<p>Aloitetaan <code>withSelect<\/code>ja sit\u00e4 vastaava koukku <code>useSelect<\/code>. N\u00e4it\u00e4 k\u00e4ytet\u00e4\u00e4n hankkimaan tilasta per\u00e4isin olevia rekvisiitta rekister\u00f6idyilt\u00e4 valitsijoilta. Yleisi\u00e4 esimerkkej\u00e4 ovat valitsimien &#8217; <code>core<\/code>&#8217; tai &#8217; <code>core\/editor<\/code>&#8217; k\u00e4ytt\u00e4minen kyselyjen tekemiseksi viesteille (<code>getEntityRecords<\/code>), viestin metasis\u00e4ll\u00f6n k\u00e4ytt\u00e4minen (<code>getEditedPostAttribute<\/code>) tai yksinkertaisesti nykyisen viestityypin tai muiden tietojen hankkiminen.<\/p>\n<p>Esittelytarkoituksessa aloitan yksinkertaisella esimerkill\u00e4. Oletetaan, ett\u00e4 minulla on lohkokomponentti, jossa minulla on jossain viestien valitsin. Viestivaihtoehtojen t\u00e4ytt\u00e4miseksi minun on k\u00e4ytett\u00e4v\u00e4 rekisteri\u00e4 <code>core<\/code>ja suoritettava <code>GetEntityRecords()<\/code>puhelu.<\/p>\n<h3>Vanha tapa k\u00e4ytt\u00e4\u00e4<code>withSelect<\/code><\/h3>\n<p>Jos haluan kysell\u00e4 lohkon viesteist\u00e4, minun on k\u00e4\u00e4ritt\u00e4v\u00e4 komponentti <code>withSelect<\/code>. T\u00e4m\u00e4 tehd\u00e4\u00e4n yleens\u00e4 <code>export<\/code>lausunnossa.<\/p>\n<p>Huomaa, ett\u00e4 t\u00e4m\u00e4 koodiesimerkki ei ole t\u00e4ydellinen varsinaisena toiminnallisena lohkona tai JS-laajennuksena, vaan se on poistettu, jotta se n\u00e4ytt\u00e4\u00e4 vain sovelluksen ydink\u00e4sitteet <code>withSelect<\/code>. Jos etsit k\u00e4yt\u00e4nn\u00f6n koodiesimerkkej\u00e4, minulla on muita artikkeleita, jotka kattavat t\u00e4m\u00e4n: esim <a href=\"https:\/\/wordpress.mediadoma.com\/fi\/luo-mukautettu-gutenberg-lohko-osa-10-viestien-ja-korkeamman-jaerjestyksen-komponenttien-hakeminen\/\" title=\". kuinka toteuttaa lohkoja post select -toiminnolla\">. kuinka toteuttaa lohkoja post select -toiminnolla<\/a> tai <a href=\"https:\/\/wordpress.mediadoma.com\/fi\/viestin-sisaelloenkuvauskenttien-lisaeaeminen-gutenbergin-asiakirjan-sivupalkkiin\/\" title=\"kuinka lis\u00e4t\u00e4 post-meta tarkastajaan\">kuinka lis\u00e4t\u00e4 post-meta tarkastajaan<\/a>. Ne on kirjoitettu merkinn\u00f6ill\u00e4 <code>withSelect<\/code>ja <code>withDispatch<\/code>, niin tee nekin, ja palaa sitten t\u00e4nne oppimaan, kuinka ne muunnetaan koukkuiksi.<\/p>\n<pre><code>const { withSelect } = wp.data;\n\u00a0\nconst AWP_Example_Plugin = ({ somePosts }) =&gt; {\n    console.log(\"Posts from withSelect = \", somePosts);\n    return(\n        &lt;div&gt;\n            ...\n        &lt;\/div&gt;\n    );\n}\n\u00a0\nexport default withSelect( (select) =&gt; {      \n    return {\n        somePosts: select( 'core' ).getEntityRecords( 'postType', 'page' ),\n    };\n}) (AWP_Example_Plugin );<\/code><\/pre>\n<p>Kuten rivist\u00e4 n\u00e4kyy, <code>#12-16<\/code>k\u00e4\u00e4nn\u00e4n komponenttini <code>withSelect<\/code>. WithSelect-toiminnon sis\u00e4ll\u00e4 p\u00e4\u00e4sen haluamaani kauppaan ja palautan viestikyselyn &quot; <code>somePosts<\/code>&quot;. T\u00e4m\u00e4 rekvisiitta on sitten saatavilla <code>AWP_Example_Plugin<\/code>komponentissani (kuten n\u00e4ette, ett\u00e4 destructure <code>somePosts<\/code>from rekvisiitta linjalla <code>#3<\/code>).<\/p>\n<p>Kuten aiemmin mainittiin, t\u00e4m\u00e4 menetelm\u00e4 toimii hienosti \u2013 ja toimii jatkossakin. Mutta t\u00e4ss\u00e4 on useita huonoja puolia. Yksi on, ett\u00e4 t\u00e4t\u00e4 ei ole kovin helppo ymm\u00e4rt\u00e4\u00e4. Toki t\u00e4m\u00e4 oli hyvin yksinkertainen esimerkki. Ensi silm\u00e4yksell\u00e4 itse komponentista et ole varma, mist\u00e4 potkuri <code>somePosts<\/code>tulee tai mik\u00e4 se on. Sinun pit\u00e4isi osata etsi\u00e4 vientilausuntoa ja katsoa, \u200b\u200bonko siin\u00e4 k\u00e4\u00e4reit\u00e4. Se tuntuu my\u00f6s hieman hajaantuneelta. Teet melkoisen osan t\u00e4rke\u00e4st\u00e4 ty\u00f6st\u00e4 komponentin ulkopuolella, johonkin, jonka haluat todella saatavan komponentin sis\u00e4ll\u00e4.<\/p>\n<p>Tehd\u00e4\u00e4n se paremmin koukkujen avulla.<\/p>\n<h3>Muunnetaan muotoon<code>useSelect<\/code><\/h3>\n<p>Muuntaminen <code>withSelect<\/code>osaksi <code>useSelect<\/code>on niin yksinkertaista kuin se voi olla. Ensimm\u00e4inen askel on, ett\u00e4 voimme m\u00e4\u00e4ritt\u00e4\u00e4 muuttujan <code>somePosts<\/code>komponenttimme sis\u00e4ll\u00e4 sen sijaan, ett\u00e4 se olisi <code>export<\/code>lauseen ulkopuolella. Toinen vaihe on siirt\u00e4\u00e4 koko toiminto, joka meill\u00e4 <code>withSelect<\/code>oli <code>useSelect<\/code>. Ja siin\u00e4 se.<\/p>\n<pre><code>const { useSelect } = wp.data;\n\u00a0\nconst AWP_Example_Plugin =() =&gt; {\n    const { somePosts } = useSelect( (select) =&gt; {        \n        return {\n            somePosts: select( 'core' ).getEntityRecords( 'postType', 'page' ),\n        };\n    } );\n    console.log(\"Posts from useSelect = \", somePosts);\n    return(\n        &lt;div&gt;\n            ...\n        &lt;\/div&gt;\n    );\n}\n\u00a0\nexport default AWP_Example_Plugin;<\/code><\/pre>\n<p>Yll\u00e4 oleva koodi tarjoaa t\u00e4sm\u00e4lleen saman tuloksen kuin koodi, jossa on <code>withSelect<\/code>. Erona on, ett\u00e4 koodi on nyt paljon ymm\u00e4rrett\u00e4v\u00e4mpi! Voimme nyt hyvin helposti n\u00e4hd\u00e4, ett\u00e4 muuttuja <code>somePosts<\/code>tallentaa viestikyselyn tuloksen suoraan komponenttiimme.<\/p>\n<p><strong>T\u00e4rke\u00e4 huomautus<\/strong>: <code>useSelect<\/code>hyv\u00e4ksyy toisen parametrin; joukko riippuvuuksia. Riippuvuudet ovat muuttujia, jotka varmistavat, ett\u00e4 suoritamme vain, <code>useSelect<\/code>kun jokin riippuvuuksista (muuttujien arvoista) on muuttunut. T\u00e4m\u00e4 osa on t\u00e4rke\u00e4mpi <code>useDispatch<\/code>kuin t\u00e4\u00e4ll\u00e4, joten selit\u00e4n t\u00e4t\u00e4 hieman tarkemmin alla olevassa <code>useDispatch<\/code>osiossa.<\/p>\n<h2>Toteutus<code>useDispatch<\/code><\/h2>\n<p>Katsotaanpa nyt <code>withDispatch<\/code>ja sit\u00e4 vastaavaa koukkua <code>useDispatch<\/code>. Niit\u00e4 k\u00e4ytet\u00e4\u00e4n rekvisiitin l\u00e4hett\u00e4miseen rekistereihin. Esimerkiksi k\u00e4skem\u00e4ll\u00e4 Gutenbergi\u00e4 p\u00e4ivitt\u00e4m\u00e4\u00e4n viestimeta &quot; <code>core\/editor<\/code>&quot; kautta.<\/p>\n<p>J\u00e4lleen esittelytarkoituksessa koodiesimerkit eiv\u00e4t ole t\u00e4ydellisi\u00e4 toiminnallisia koodinp\u00e4tki\u00e4 \u2013 ne kuvaavat vain n\u00e4it\u00e4 malleja koskevia osia. T\u00e4ss\u00e4 esimerkiss\u00e4 oletetaan, ett\u00e4 minulla on tekstikentt\u00e4, joka n\u00e4ytt\u00e4\u00e4 post-meta &#8211; ja haluan p\u00e4ivitt\u00e4\u00e4 post meta -arvon muutoksen yhteydess\u00e4.<\/p>\n<h3>Vanha tapa k\u00e4ytt\u00e4\u00e4<code>withDispatch<\/code><\/h3>\n<p>Kuten <code>withDispatch<\/code>korkeamman asteen komponentti, minun on k\u00e4\u00e4ritt\u00e4v\u00e4 komponentti t\u00e4m\u00e4n sis\u00e4\u00e4n. T\u00e4m\u00e4 tehd\u00e4\u00e4n yleens\u00e4 <code>export<\/code>lausunnossa. Saadaksemme tekstikent\u00e4n metallemme toimimaan me<\/p>\n<p>Esimerkiksi:<\/p>\n<pre><code>const { withDispatch } = wp.data;\nconst { __ } = wp.i18n;\nconst { PluginDocumentSettingPanel } = wp.editPost;\nconst { TextControl, PanelRow } = wp.components;\nconst AWP_Example_Plugin = ({ setPostMeta }) =&gt; { \n    return(\n        &lt;PluginDocumentSettingPanel title={ __( 'withDispatch Example', 'txtdomain') }&gt;\n            &lt;PanelRow&gt;\n                &lt;TextControl\n                    label={ __( 'Example post meta', 'txtdomain') }\n                    value=\"\"\n                    onChange={ (value) =&gt; setPostMeta( { example_post_meta: value }) }\n                \/&gt;\n            &lt;\/PanelRow&gt;\n        &lt;\/PluginDocumentSettingPanel&gt;\n    );\n}\n\u00a0\nexport default withDispatch( (dispatch) =&gt; {\n    return {\n        setPostMeta( newMeta) {\n            dispatch( 'core\/editor' ).editPost( { meta: newMeta } );\n        }\n    };\n} )( AWP_Example_Plugin );<\/code><\/pre>\n<p>Rivill\u00e4 <code>#20-26<\/code>k\u00e4\u00e4rimme komponentin sis\u00e4lle <code>withDispatch<\/code>, jossa palautetaan funktio &quot; <code>setPostMeta<\/code>&quot;, joka l\u00e4hett\u00e4\u00e4 post metan (p\u00e4ivitt\u00e4\u00e4ksesi sen). Rivill\u00e4 <code>#6<\/code>puretaan prop, jotta voimme k\u00e4ytt\u00e4\u00e4 sit\u00e4 tekstikent\u00e4n <code>onChange<\/code>tapahtumassa rivill\u00e4 <code>#13<\/code>. (Huomaa, ett\u00e4 yll\u00e4 oleva esimerkki ei toimi, koska asetamme tekstikent\u00e4n arvon tyhj\u00e4ksi merkkijonoksi. T\u00e4m\u00e4 on vain havainnollistaaksesi, kuinka k\u00e4ytt\u00e4isimme l\u00e4hetyst\u00e4).<\/p>\n<p>J\u00e4lleen voimme n\u00e4hd\u00e4, ett\u00e4 koodi ei ole niin yksinkertaista ymm\u00e4rt\u00e4\u00e4. Sinun pit\u00e4isi osata etsi\u00e4 k\u00e4\u00e4rett\u00e4 selvitt\u00e4\u00e4ksesi, mik\u00e4 rekvisiitta &quot; <code>setPostMeta<\/code>&quot; on tai mist\u00e4 se tulee. Tehd\u00e4\u00e4n se paremmin koukkujen avulla!<\/p>\n<h3>Muunnetaan muotoon<code>useDispatch<\/code><\/h3>\n<p>Muuttaminen muotoon ei ole aivan yht\u00e4 yksinkertaista kuin <code>withDispatch<\/code>muuntaminen muotoon. Se on silti melko helppoa. On kaksi asiaa, jotka on pidett\u00e4v\u00e4 mieless\u00e4. Yksi on se, ett\u00e4 ensimm\u00e4isen\u00e4 parametrina k\u00e4ytet\u00e4\u00e4n kaupan nime\u00e4. T\u00e4m\u00e4n j\u00e4lkeen p\u00e4\u00e4sisimme kauppaan ja kutsuisimme sen k\u00e4ytett\u00e4viss\u00e4 olevia toimintoja, kun k\u00e4yt\u00e4mme sit\u00e4 (esim. tekstikent\u00e4n tapahtumassa). Toiseksi riippuvuuksien joukko toiseen parametriin on t\u00e4rke\u00e4mpi kuin. Voit vaarantaa koodisi p\u00e4\u00e4tyv\u00e4n ikuiseen silmukkaan, jos et hallitse riippuvuuksia oikein. Vain kun riippuvuusmuuttujia muutetaan, komentosarja suoritetaan uudelleen .<code>useDispatch``withSelect``useSelect``useDispatch``onChange``useDispatch``useSelect``useDispatch<\/code><\/p>\n<p>Esimerkiksi:<\/p>\n<pre><code>const { useDispatch } = wp.data;\nconst { __ } = wp.i18n;\nconst { PluginDocumentSettingPanel } = wp.editPost;\nconst { TextControl, PanelRow } = wp.components;\nconst AWP_Example_Plugin =() =&gt; {  \n    const tmpMetaValue = \"\";\n    const { editPost } = useDispatch( 'core\/editor', [ tmpMetaValue ] );\n\u00a0\n    return(\n        &lt;PluginDocumentSettingPanel title={ __( 'useDispatch Example', 'txtdomain') }&gt;\n            &lt;PanelRow&gt;\n                &lt;TextControl\n                    label={ __( 'Example post meta', 'txtdomain') }\n                    value={ tmpMetaValue }\n                    onChange={ (value) =&gt; editPost( { meta: { example_post_meta: value } }) }\n                \/&gt;\n            &lt;\/PanelRow&gt;\n        &lt;\/PluginDocumentSettingPanel&gt;\n    );\n}\n\u00a0\nexport default AWP_Example_Plugin;<\/code><\/pre>\n<p>Linjalla <code>#8<\/code>tuhoamme sen, mit\u00e4 tarvitsemme kaupasta &#8217; <code>core\/editor<\/code>&#8217;. Meit\u00e4 kiinnostaa vain <code>editPost<\/code>toiminto, jolla voimme p\u00e4ivitt\u00e4\u00e4 post metan. Toisena parametrina <code>useDispatch<\/code>tarjoamme riippuvuudet. Mit\u00e4 tulee esimerkkiin post metan p\u00e4ivitt\u00e4misest\u00e4, post-meta-arvon k\u00e4ytt\u00e4minen (k\u00e4ytt\u00e4m\u00e4ll\u00e4 <code>useSelect<\/code>) olisi t\u00e4ydellinen riippuvuutena. T\u00e4ss\u00e4 esimerkiss\u00e4 olen vain asettanut sen valemuuttujaksi. Katso alempana kattavampi ja realistisempi esimerkki. Ja sitten <code>#16<\/code>tekstikent\u00e4n <code>onChange<\/code>tapahtuman rivill\u00e4 soitamme <code>editPost<\/code>p\u00e4ivitt\u00e4\u00e4ksemme metan. Huomaa ero t\u00e4ss\u00e4 riviss\u00e4 <code>withDispatch<\/code>yll\u00e4 olevan k\u00e4yt\u00f6n kanssa! Koska k\u00e4yt\u00e4mme <code>editPost<\/code>suoraan funktion palauttamisen sijaan p\u00e4ivitt\u00e4\u00e4ksemme post-meta meille (<code>setPostMeta<\/code>), meid\u00e4n on annettava objekti<code>meta<\/code>avaimena ja sitten objekti, jonka post-meta haluamme p\u00e4ivitt\u00e4\u00e4. Olemme tavallaan jakaneet <code>withDispatch<\/code>koodin osiin.<\/p>\n<p>Silti k\u00e4ytt\u00f6 <code>useDispatch<\/code>tekee koodista paljon luettavamman ja ymm\u00e4rrett\u00e4v\u00e4mm\u00e4n. Komponenttimme ulkopuolelle ei en\u00e4\u00e4 lis\u00e4t\u00e4 koodia, jota meid\u00e4n tarvitsee k\u00e4ytt\u00e4\u00e4 sis\u00e4ll\u00e4.<\/p>\n<h2>T\u00e4ydellisempi esimerkki ja poistava tarve<code>compose<\/code><\/h2>\n<p>On mahdollista, ett\u00e4 jos k\u00e4yt\u00e4t <code>withDispatch<\/code>, tarvitset <code>withSelect<\/code>my\u00f6s kyseisess\u00e4 komponentissa. Yll\u00e4 olevissa esimerkeiss\u00e4 <code>useDispatch<\/code>p\u00e4ivit\u00e4mme post-meta-arvon. Mutta jotta tekstikentt\u00e4 toimisi oikein (ja n\u00e4ytt\u00e4\u00e4 my\u00f6s nykyisen arvon), meid\u00e4n on my\u00f6s noudettava post-meta-arvo.<\/p>\n<p>Jos sinun on k\u00e4ytett\u00e4v\u00e4 useita korkeamman asteen komponentteja komponentin ymp\u00e4rille, k\u00e4ytt\u00e4isit todenn\u00e4k\u00f6isesti viel\u00e4 toista Gutenberg-toimintoa; <code>[compose](https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-compose\/)<\/code>. Se on k\u00e4tev\u00e4 toiminto yhdist\u00e4\u00e4 useita korkeamman asteen komponentteja yhdeksi korkeamman asteen komponentiksi, jonka ymp\u00e4rille voit k\u00e4\u00e4ri\u00e4 komponentin.<\/p>\n<p>Katsotaanpa t\u00e4ydellisemp\u00e4\u00e4 esimerkki\u00e4 komponentista, joka hakee post-meta-arvon tekstikentt\u00e4\u00e4n ja p\u00e4ivitt\u00e4\u00e4, kun sen arvoa muutetaan. Aloitamme siit\u00e4, kuinka meid\u00e4n pit\u00e4isi tehd\u00e4 se k\u00e4ytt\u00e4m\u00e4ll\u00e4 <code>withSelect<\/code>ja <code>withDispatch<\/code>(ja siten my\u00f6s <code>compose<\/code>).<\/p>\n<h3>K\u00e4ytt\u00e4m\u00e4ll\u00e4 <code>withSelect<\/code>, <code>withDispatch<\/code>ja<code>compose<\/code><\/h3>\n<pre><code>const { __ } = wp.i18n;\nconst { compose } = wp.compose;\nconst { withSelect, withDispatch } = wp.data;\nconst { PluginDocumentSettingPanel } = wp.editPost;\nconst { TextControl, PanelRow } = wp.components;\n\u00a0\nconst AWP_Example_Plugin = ({ postMeta, setPostMeta }) =&gt; {\n    return(\n        &lt;PluginDocumentSettingPanel title={ __( 'withSelect and withDispatch Example', 'txtdomain') }&gt;\n            &lt;PanelRow&gt;\n                &lt;TextControl\n                    label={ __( 'Example post meta', 'txtdomain') }\n                    value={ postMeta.example_post_meta }\n                    onChange={ (value) =&gt; setPostMeta( { example_post_meta: value }) }\n                \/&gt;\n            &lt;\/PanelRow&gt;\n        &lt;\/PluginDocumentSettingPanel&gt;\n    );\n}\n\u00a0\nexport default compose( [\n    withSelect( (select) =&gt; {     \n        return {\n            postMeta: select( 'core\/editor' ).getEditedPostAttribute( 'meta' ),\n        };\n    } ),\n    withDispatch( (dispatch) =&gt; {\n        return {\n            setPostMeta( newMeta) {\n                dispatch( 'core\/editor' ).editPost( { meta: newMeta } );\n            }\n        };\n    }) ] )( AWP_Example_Plugin );<\/code><\/pre>\n<p>Linjalla <code>#21-34<\/code>laadimme <code>withSelect<\/code>ja <code>withDispatch<\/code>k\u00e4\u00e4rimme ne komponenttimme ymp\u00e4rille. <code>postMeta<\/code>alkaen <code>withSelect<\/code>ja <code>setPostMeta<\/code>alkaen <code>withDispatch<\/code>ovat nyt saatavilla komponentissamme rekvisiittana. Puramme ne linjalla <code>#7<\/code>ja k\u00e4yt\u00e4mme niit\u00e4 <code>#13<\/code>ja <code>#14<\/code>.<\/p>\n<p>Kuten n\u00e4ette, komponenttimme ulkopuolella tarvittava koodi on pidempi kuin itse komponentti. En tied\u00e4 teist\u00e4, mutta minusta se tuntuu hieman hajaantuneelta. Kehitt\u00e4j\u00e4t voivat alkaa lukea t\u00e4t\u00e4 koodia ylh\u00e4\u00e4lt\u00e4 n\u00e4kem\u00e4tt\u00e4 alaosaa ja alkaa ihmetell\u00e4, mist\u00e4 <code>postMeta<\/code>ja <code>setPostMeta<\/code>mist\u00e4 ne tulevat \u2013 ne n\u00e4ytt\u00e4v\u00e4t olevan taianomaisesti saatavilla. Minulle t\u00e4m\u00e4 on hyvin ep\u00e4intuitiivista.<\/p>\n<p>Katsotaanpa, kuinka muuttaisimme yll\u00e4 olevan esimerkin koukkuiksi.<\/p>\n<h3>K\u00e4ytt\u00e4m\u00e4ll\u00e4 <code>useSelect<\/code>ja<code>useDispatch<\/code><\/h3>\n<pre><code>const { __ } = wp.i18n;\nconst { useSelect, useDispatch } = wp.data;\nconst { PluginDocumentSettingPanel } = wp.editPost;\nconst { TextControl, PanelRow } = wp.components;\n\u00a0\nconst AWP_Example_Plugin = () =&gt; {\n    const { postMeta } = useSelect( (select) =&gt; {     \n        return {\n            postMeta: select( 'core\/editor' ).getEditedPostAttribute( 'meta' ),\n        };\n    } );\n    const { editPost } = useDispatch( 'core\/editor', [ postMeta.example_post_meta ] );\n\u00a0\n    return(\n        &lt;PluginDocumentSettingPanel title={ __( 'useSelect and useDispatch Example', 'txtdomain') }&gt;\n            &lt;PanelRow&gt;\n                &lt;TextControl\n                    label={ __( 'Example post meta', 'txtdomain') }\n                    value={ postMeta.example_post_meta }\n                    onChange={ (value) =&gt; editPost( { meta: { example_post_meta: value } }) }\n                \/&gt;\n            &lt;\/PanelRow&gt;\n        &lt;\/PluginDocumentSettingPanel&gt;\n    );\n}\n\u00a0\nexport default AWP_Example_Plugin;<\/code><\/pre>\n<p>Kuinka kaunista ja luettavaa se on?! N\u00e4emme komponentistamme heti, mist\u00e4 <code>postMeta<\/code>se haetaan ja miten p\u00e4\u00e4semme k\u00e4ytt\u00e4m\u00e4\u00e4n <code>editPost<\/code>. Komponenttimme on my\u00f6s paljon helpompi k\u00e4ytt\u00e4\u00e4 uudelleen.<\/p>\n<p>Huomaa, ett\u00e4 <code>useDispatch<\/code>riville <code>#12<\/code>lis\u00e4\u00e4mme p\u00e4ivitett\u00e4v\u00e4n postmeta-tiedoston riippuvuudeksi (<code>postMeta.example_post_meta<\/code>). Jos haluat pit\u00e4\u00e4 useita post-metamuuttujia ajan tasalla t\u00e4ss\u00e4 komponentissa, sinun on lis\u00e4tt\u00e4v\u00e4 jokainen riippuvuutena varmistaaksesi, ett\u00e4 l\u00e4hetys suoritetaan (todellisuudessa tallentaa post-meta), kun yhden niist\u00e4 arvo muuttuu.<\/p>\n<p>Toivottavasti t\u00e4m\u00e4 on ollut informatiivinen ja hy\u00f6dyllinen jollekin siell\u00e4 olevalle. Koukut ovat minulle viel\u00e4 v\u00e4h\u00e4n tuntemattomia, mutta n\u00e4hdess\u00e4ni niiden k\u00e4yt\u00f6n edut en k\u00e4\u00e4nny takaisin!<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Johdatus React-koukkujen k\u00e4ytt\u00f6\u00f6n useSelect and useDispatch. Katsotaan, kuinka t\u00e4st\u00e4 on hy\u00f6ty\u00e4, miksi meid\u00e4n pit\u00e4isi tehd\u00e4 se ja miten tarkalleen.<\/p>\n","protected":false},"author":1,"featured_media":151604,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[938,938,813,1110,843,813,843,864,864],"tags":[1166],"class_list":["post-233984","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gutenberg-5","category-laajennuksia","category-n-a","category-opetusohjelmia","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/233984","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=233984"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/233984\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/151604"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=233984"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=233984"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=233984"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}