{"id":233975,"date":"2023-02-26T18:50:00","date_gmt":"2023-02-26T15:50:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233975"},"modified":"2023-02-26T18:50:27","modified_gmt":"2023-02-26T15:50:27","slug":"gutenberg-atualizando-withselect-e-withdispatch-em-react-hooks-useselect-e-usedispatch","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/gutenberg-atualizando-withselect-e-withdispatch-em-react-hooks-useselect-e-usedispatch\/","title":{"rendered":"Gutenberg: Atualizando withSelect e withDispatch em React Hooks (useSelect e useDispatch)"},"content":{"rendered":"\n<p>Este post \u00e9 uma introdu\u00e7\u00e3o r\u00e1pida sobre uma maneira de manter seu c\u00f3digo Gutenberg nos padr\u00f5es atuais usando ganchos React. Veremos como isso \u00e9 ben\u00e9fico, por que devemos faz\u00ea-lo e como.<\/p>\n<h2>Hein, ganchos?<\/h2>\n<p>Suponho que voc\u00ea j\u00e1 tenha alguma experi\u00eancia trabalhando com blocos ou plugins Gutenberg um pouco mais complexos que consultam postagens, ou buscam e atualizam o meta do post. E assim trabalhando com <code>[withSelect](https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-data\/#withSelect)<\/code>e\/ou <code>[withDispatch](https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-data\/#withDispatch)<\/code>. Estes s\u00e3o componentes de ordem superior no WordPress que permitem que voc\u00ea acesse as lojas do WordPress para buscar ou enviar informa\u00e7\u00f5es que est\u00e3o um pouco fora do bloco &quot;normal&quot; ou da edi\u00e7\u00e3o de posts. Voc\u00ea possivelmente tamb\u00e9m foi for\u00e7ado a usar <code>compose<\/code>para combinar seus componente com v\u00e1rios componentes de ordem superior. Se seu c\u00f3digo estiver usando esses padr\u00f5es, n\u00e3o se preocupe &#8211; eles funcionam perfeitamente bem e continuar\u00e3o a funcionar! Mas \u00e0 medida que a tecnologia avan\u00e7a, podemos fazer melhor.<\/p>\n<p>No in\u00edcio de 2019, o <a href=\"https:\/\/reactjs.org\/docs\/hooks-intro.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">React lan\u00e7ou hooks<\/a> (vers\u00e3o 16.8) \u2013 que permitem usar o estado sem usar uma classe e melhorar outros recursos que fornecem um c\u00f3digo mais leg\u00edvel e reutiliz\u00e1vel. Por exemplo, removendo a necessidade de envolver seu c\u00f3digo em componentes de ordem superior para acessar os registros. E no <a href=\"https:\/\/make.wordpress.org\/core\/2019\/06\/10\/introducing-usedispatch-and-useselect\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ver\u00e3o de 2019 o WordPress seguiu<\/a>, lan\u00e7ando ganchos personalizados: <code>[useDispatch](https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-data\/#useDispatch)<\/code>e <code>[useSelect](https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-data\/#useSelect)<\/code>.<\/p>\n<p>Os benef\u00edcios dos ganchos s\u00e3o muitos. O exemplo mais comum \u00e9 permitir usar o estado do componente sem ter que escrever uma classe Javascript (<code>useState<\/code>). Mas, na minha opini\u00e3o, o maior benef\u00edcio \u00e9 a reutiliza\u00e7\u00e3o. Ao remover a necessidade de usar padr\u00f5es como props de renderiza\u00e7\u00e3o e componentes de ordem superior, os componentes podem ser escritos em partes muito mais independentes. Outro benef\u00edcio dos ganchos \u00e9 que eles tornam seu c\u00f3digo mais f\u00e1cil de ler e entender!<\/p>\n<p>Vamos pular direto para alguns exemplos e ver como implementar <code>useSelect<\/code>e <code>useDispatch<\/code>ganchos em nosso c\u00f3digo!<\/p>\n<h2>Implementa\u00e7\u00e3o<code>useSelect<\/code><\/h2>\n<p>Vamos come\u00e7ar com <code>withSelect<\/code>e seu gancho correspondente <code>useSelect<\/code>. Eles s\u00e3o usados \u200b\u200bpara obter props derivadas de estado de seletores registrados. Exemplos comuns s\u00e3o acessar os seletores &#8216; <code>core<\/code>&#8216; ou &#8216; <code>core\/editor<\/code>&#8216; para realizar consultas de postagens (<code>getEntityRecords<\/code>), acessar o meta do post (<code>getEditedPostAttribute<\/code>) ou simplesmente obter o tipo de postagem atual ou outras informa\u00e7\u00f5es.<\/p>\n<p>Para fins de demonstra\u00e7\u00e3o, come\u00e7arei com um exemplo simples. Suponha que eu tenha um componente de bloco onde eu tenha um seletor de postagem em algum lugar. Para preencher as op\u00e7\u00f5es de postagem preciso acessar o registro &#8216; <code>core<\/code>&#8216; e realizar uma <code>GetEntityRecords()<\/code>chamada.<\/p>\n<h3>Maneira antiga usando<code>withSelect<\/code><\/h3>\n<p>Se eu quiser consultar postagens em um bloco, precisaria envolver meu componente em <code>withSelect<\/code>. Isso \u00e9 comumente feito na <code>export<\/code>declara\u00e7\u00e3o.<\/p>\n<p>Observe que este exemplo de c\u00f3digo n\u00e3o est\u00e1 completo como um bloco funcional real ou plug-in JS, ele foi removido apenas para mostrar os conceitos principais do <code>withSelect<\/code>. Se voc\u00ea estiver procurando por exemplos pr\u00e1ticos de c\u00f3digo, tenho outros artigos que abordam isso: por exemplo <a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/criar-bloco-personalizado-do-gutenberg-parte-10-buscando-postagens-e-componentes-de-ordem-superior\/\" title=\", como implementar blocos com um post select\">, como implementar blocos com um post select<\/a>, ou <a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/como-adicionar-campos-meta-de-postagem-a-barra-lateral-do-documento-gutenberg\/\" title=\"como adicionar post meta ao inspector\">como adicionar post meta ao inspector<\/a>. Esses s\u00e3o escritos com <code>withSelect<\/code>e <code>withDispatch<\/code>, assim como aqueles, e depois volte aqui para aprender como transform\u00e1-los em ganchos.<\/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>Como voc\u00ea pode ver na linha, <code>#12-16<\/code>eu envolvo meu componente com <code>withSelect<\/code>. Dentro da fun\u00e7\u00e3o withSelect posso acessar a loja que quero, e retorno uma consulta post na prop &#8221; <code>somePosts<\/code>&#8220;. Esta prop estar\u00e1 ent\u00e3o dispon\u00edvel dentro do meu <code>AWP_Example_Plugin<\/code>componente (como voc\u00ea pode ver, eu destruo <code>somePosts<\/code>as props em line <code>#3<\/code>).<\/p>\n<p>Como mencionado anteriormente, esse m\u00e9todo funciona muito bem \u2013 e continuar\u00e1 a faz\u00ea-lo. Mas h\u00e1 v\u00e1rias desvantagens com isso. Uma \u00e9 que isso n\u00e3o \u00e9 muito f\u00e1cil de entender. Claro, este foi um exemplo muito simples. \u00c0 primeira vista, no pr\u00f3prio componente, voc\u00ea n\u00e3o tem certeza de onde <code>somePosts<\/code>vem o suporte ou o que \u00e9. Voc\u00ea teria que saber para procurar a instru\u00e7\u00e3o de exporta\u00e7\u00e3o e ver se h\u00e1 algum wrapper. Tamb\u00e9m se sente um pouco desconexo. Voc\u00ea faz uma grande parte do trabalho importante fora do seu componente, para algo que voc\u00ea realmente deseja dispon\u00edvel dentro do seu componente.<\/p>\n<p>Vamos faz\u00ea-lo melhor usando ganchos.<\/p>\n<h3>Convertendo em<code>useSelect<\/code><\/h3>\n<p>Converter um <code>withSelect<\/code>em <code>useSelect<\/code>\u00e9 o mais simples poss\u00edvel. O primeiro passo \u00e9 que podemos definir a vari\u00e1vel <code>somePosts<\/code>dentro do nosso componente, ao inv\u00e9s de fora pela <code>export<\/code>declara\u00e7\u00e3o. O segundo passo \u00e9 mover toda a fun\u00e7\u00e3o que t\u00ednhamos <code>withSelect<\/code>para o <code>useSelect<\/code>. E \u00e9 isso.<\/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>O c\u00f3digo acima fornece exatamente o mesmo resultado que aquele com <code>withSelect<\/code>. A diferen\u00e7a \u00e9 que o c\u00f3digo agora \u00e9 muito mais compreens\u00edvel! Agora podemos ver muito facilmente que a vari\u00e1vel <code>somePosts<\/code>est\u00e1 armazenando o resultado de uma consulta post, bem dentro do nosso componente.<\/p>\n<p><strong>Nota importante<\/strong>: <code>useSelect<\/code>aceita um segundo par\u00e2metro; uma s\u00e9rie de depend\u00eancias. As depend\u00eancias s\u00e3o vari\u00e1veis \u200b\u200bque garantem a execu\u00e7\u00e3o apenas <code>useSelect<\/code>quando uma das depend\u00eancias (valores de vari\u00e1vel) for alterada. Este bit \u00e9 mais importante do <code>useDispatch<\/code>que aqui, ent\u00e3o vou explicar este bit mais na <code>useDispatch<\/code>se\u00e7\u00e3o abaixo.<\/p>\n<h2>Implementa\u00e7\u00e3o<code>useDispatch<\/code><\/h2>\n<p>Agora vamos ver <code>withDispatch<\/code>e seu gancho correspondente <code>useDispatch<\/code>. Eles s\u00e3o usados \u200b\u200bpara enviar adere\u00e7os para registros. Por exemplo, dizendo ao Gutenberg para atualizar uma meta de postagem via &#8216; <code>core\/editor<\/code>&#8216;.<\/p>\n<p>Novamente, para fins de demonstra\u00e7\u00e3o, meus exemplos de c\u00f3digo n\u00e3o s\u00e3o partes funcionais completas de c\u00f3digo \u2013 eles ilustram apenas as partes relacionadas a esses padr\u00f5es. Neste exemplo, suponho que tenho um campo de texto mostrando uma meta de postagem &#8211; e desejo atualizar o valor meta da postagem na altera\u00e7\u00e3o.<\/p>\n<h3>Maneira antiga usando<code>withDispatch<\/code><\/h3>\n<p>Como <code>withDispatch<\/code>\u00e9 um componente de ordem superior, eu precisaria envolver meu componente dentro disso. Isso \u00e9 comumente feito na <code>export<\/code>declara\u00e7\u00e3o. Para fazer o campo de texto para o nosso meta-trabalho,<\/p>\n<p>Por exemplo:<\/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>Na linha <code>#20-26<\/code>envolvemos o componente dentro <code>withDispatch<\/code>de, no qual retornamos uma fun\u00e7\u00e3o &#8221; <code>setPostMeta<\/code>&quot; que despacha o post meta (para atualiz\u00e1-lo). Na linha <code>#6<\/code>n\u00f3s desestruturamos a prop para que possamos us\u00e1-la no <code>onChange<\/code>evento do campo de texto na linha <code>#13<\/code>. (Observe que o exemplo acima n\u00e3o seria funcional porque definimos o valor do campo de texto como uma string vazia. Isso \u00e9 apenas para demonstrar como usar\u00edamos o dispatch).<\/p>\n<p>Novamente, podemos ver que o c\u00f3digo n\u00e3o \u00e9 t\u00e3o simples de entender. Voc\u00ea teria que saber procurar o wrapper para descobrir o que o prop &#8221; <code>setPostMeta<\/code>&#8221; \u00e9 ou de onde vem. Vamos fazer melhor usando ganchos!<\/p>\n<h3>Convertendo em<code>useDispatch<\/code><\/h3>\n<p>Mudar <code>withDispatch<\/code>para <code>useDispatch<\/code>n\u00e3o \u00e9 t\u00e3o simples quanto converter <code>withSelect<\/code>para <code>useSelect<\/code>. Ainda \u00e9 muito f\u00e1cil embora. H\u00e1 duas coisas para manter em mente. Uma \u00e9 que <code>useDispatch<\/code>leva um nome de loja como primeiro par\u00e2metro. N\u00f3s ent\u00e3o acessar\u00edamos a loja e chamar\u00edamos suas fun\u00e7\u00f5es dispon\u00edveis quando a usarmos (por exemplo, em um <code>onChange<\/code>evento de campo de texto). Em segundo lugar, a matriz de depend\u00eancias do <code>useDispatch<\/code>segundo par\u00e2metro de \u00e9 mais importante do que com <code>useSelect<\/code>. Voc\u00ea pode arriscar que seu c\u00f3digo acabe em um loop eterno se n\u00e3o gerenciar as depend\u00eancias corretamente. Somente quando as vari\u00e1veis \u200b\u200bde depend\u00eancia forem alteradas, o script ser\u00e1 executado novamente <code>useDispatch<\/code>.<\/p>\n<p>Por exemplo:<\/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>Na linha <code>#8<\/code>desestruturamos o que precisamos da loja&#8217; <code>core\/editor<\/code>&#8216;. Estamos interessados \u200b\u200bapenas na <code>editPost<\/code>fun\u00e7\u00e3o que podemos usar para atualizar o post meta. Como segundo par\u00e2metro para <code>useDispatch<\/code>fornecermos depend\u00eancias. Quanto a um exemplo de atualiza\u00e7\u00e3o do post meta, usar o valor do post meta (usando <code>useSelect<\/code>) seria perfeito como depend\u00eancia. Neste exemplo, acabei de defini-lo como uma vari\u00e1vel fict\u00edcia. Olhe mais para baixo para um exemplo mais completo e realista. E ent\u00e3o na linha <code>#16<\/code>do evento do campo de texto <code>onChange<\/code>, chamamos <code>editPost<\/code>para atualizar o meta. Observe a diferen\u00e7a nesta linha com o uso <code>withDispatch<\/code>acima! Como usamos <code>editPost<\/code>diretamente em vez de retornar uma fun\u00e7\u00e3o para atualizar post meta para n\u00f3s (<code>setPostMeta<\/code>), precisamos fornecer um objeto com<code>meta<\/code>como chave e depois um objeto com a meta do post que queremos atualizar. N\u00f3s meio que dividimos o <code>withDispatch<\/code>c\u00f3digo em peda\u00e7os.<\/p>\n<p>Ainda assim, o uso <code>useDispatch<\/code>torna o c\u00f3digo muito mais leg\u00edvel e compreens\u00edvel. N\u00e3o h\u00e1 mais c\u00f3digo adicionado fora do nosso componente que precisamos usar dentro.<\/p>\n<h2>Um exemplo mais completo e eliminando a necessidade de<code>compose<\/code><\/h2>\n<p>Provavelmente, se voc\u00ea estiver usando <code>withDispatch<\/code>, precisar\u00e1 <code>withSelect<\/code>desse componente tamb\u00e9m. Nos exemplos para convers\u00e3o <code>useDispatch<\/code>acima, estamos atualizando um valor meta post. Mas para que o campo de texto funcione corretamente (e tamb\u00e9m mostre o valor atual), tamb\u00e9m precisar\u00edamos buscar o valor meta do post.<\/p>\n<p>Se voc\u00ea precisar usar v\u00e1rios componentes de ordem superior agrupados em seu componente, provavelmente usar\u00e1 outra fun\u00e7\u00e3o do Gutenberg; <code>[compose](https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-compose\/)<\/code>. \u00c9 uma fun\u00e7\u00e3o \u00fatil para combinar v\u00e1rios componentes de ordem superior em um componente de ordem superior que voc\u00ea pode envolver seu componente.<\/p>\n<p>Vejamos um exemplo mais completo de um componente que busca um meta valor de postagem em um campo de texto e atualiza quando seu valor \u00e9 alterado. Come\u00e7amos com como ter\u00edamos que fazer isso usando <code>withSelect<\/code>e <code>withDispatch<\/code>(e, portanto, tamb\u00e9m <code>compose<\/code>).<\/p>\n<h3>Usando <code>withSelect<\/code>, <code>withDispatch<\/code>e<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>Na linha <code>#21-34<\/code>, compomos <code>withSelect<\/code>e <code>withDispatch<\/code>os envolvemos em torno de nosso componente. <code>postMeta<\/code>from <code>withSelect<\/code>e <code>setPostMeta<\/code>from <code>withDispatch<\/code>est\u00e3o agora dispon\u00edveis em nosso componente como adere\u00e7os. N\u00f3s os desestruturamos na linha <code>#7<\/code>e os usamos em <code>#13<\/code>e <code>#14<\/code>.<\/p>\n<p>Como voc\u00ea pode ver, o c\u00f3digo necess\u00e1rio fora do nosso componente \u00e9 maior que o pr\u00f3prio componente. N\u00e3o sei quanto a voc\u00ea, mas para mim parece um pouco desconexo. Os desenvolvedores podem come\u00e7ar a ler esse c\u00f3digo de cima, sem ver a parte de baixo, e come\u00e7ar a se perguntar de onde <code>postMeta<\/code>e de onde <code>setPostMeta<\/code>v\u00eam \u2013 eles parecem estar magicamente dispon\u00edveis. Para mim isso \u00e9 muito pouco intuitivo.<\/p>\n<p>Vejamos como converter\u00edamos o exemplo acima em ganchos.<\/p>\n<h3>Usando <code>useSelect<\/code>e<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>Qu\u00e3o bonito e leg\u00edvel \u00e9 isso?! Podemos ver imediatamente em nosso componente <code>postMeta<\/code>de onde \u00e9 obtido e como obtemos acesso ao <code>editPost<\/code>. Nosso componente tamb\u00e9m ficou muito mais f\u00e1cil de reutilizar.<\/p>\n<p>Observe que na <code>useDispatch<\/code>linha at <code>#12<\/code>adicionamos o postmeta que estamos atualizando como depend\u00eancia (<code>postMeta.example_post_meta<\/code>). Se voc\u00ea mantivesse v\u00e1rias vari\u00e1veis \u200b\u200bmeta do post atualizadas neste componente, voc\u00ea teria que adicionar cada uma como uma depend\u00eancia para garantir que o dispatch seja executado (na verdade salvando o meta do post) quando o valor de uma delas for alterado.<\/p>\n<p>Espero que isso tenha sido informativo e \u00fatil para algu\u00e9m l\u00e1 fora. Ainda n\u00e3o estou familiarizado com os ganchos, mas vendo os benef\u00edcios de us\u00e1-los n\u00e3o vou voltar atr\u00e1s!<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uma introdu\u00e7\u00e3o ao uso dos hooks do React useSelect e useDispatch. Veremos como isso \u00e9 ben\u00e9fico, por que devemos faz\u00ea-lo e exatamente como.<\/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":[941,941,1110,816,816,846,846,867,867],"tags":[1170],"class_list":["post-233975","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gutenberg-8","category-n-a","category-plug-ins","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233975","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=233975"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233975\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/151604"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=233975"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=233975"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=233975"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}