{"id":228524,"date":"2022-10-12T10:49:00","date_gmt":"2022-10-12T07:49:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228524"},"modified":"2022-11-09T02:51:18","modified_gmt":"2022-11-08T23:51:18","slug":"componente-react-createclass-quebrado-vamos-corrigi-lo","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/componente-react-createclass-quebrado-vamos-corrigi-lo\/","title":{"rendered":"Componente React.createClass quebrado? Vamos corrigi-lo!"},"content":{"rendered":"\n<p>Se voc\u00ea est\u00e1 construindo WordPress Gutenberg Blocks (ou mesmo se n\u00e3o estiver), voc\u00ea pode estar tentando <a href=\"https:\/\/wholesomecode.ltd\/blog\/add-select2-as-an-inspectorcontrol-in-wordpress-gutenberg\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">fazer com que um componente React de terceiros funcione em seu build<\/a>. Mas se for um elemento mais antigo, especificamente um que usa o <code>React.createClass<\/code>m\u00e9todo obsoleto, voc\u00ea pode ficar preso.<\/p>\n<p>Os arquivos que acompanham este tutorial est\u00e3o nas pastas originais e corrigidas na pasta de componentes da solu\u00e7\u00e3o GitHub.<\/p>\n<p><a href=\"https:\/\/github.com\/mattwatsoncodes\/Tutorial-Convert-React-createClass-to-React-Component\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Obter arquivos de tutorial do GitHub<\/a><\/p>\n<p>Eu estava procurando por uma lista de caixas de sele\u00e7\u00e3o que me permitisse passar uma variedade de op\u00e7\u00f5es (semelhante a como voc\u00ea pode passar v\u00e1rias op\u00e7\u00f5es para o <code>&lt;SelectControl\/&gt;<\/code>WordPress Gutenberg). O built-in <code>&lt;CheckboxControl\/&gt;<\/code>n\u00e3o tinha uma op\u00e7\u00e3o, mas depois de algumas pesquisas na web eu encontrei <code>[react-checkbox-list](https:\/\/github.com\/sonyan\/react-checkbox-list)<\/code> <a href=\"https:\/\/github.com\/sonyan\/react-checkbox-list\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pela Sony An<\/a> (dispon\u00edvel como <a href=\"https:\/\/www.npmjs.com\/package\/react-checkbox-list\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\"><code>react-checkbox-list<\/code>em npm<\/a> ).<\/p>\n<p>Isso fez tudo o que eu queria, mas depois de instal\u00e1-lo via npm (<code>npm install react-checkbox-list --save<\/code>) n\u00e3o funcionou. Eu sabia que teria que fazer um fork e corrigir o plugin.<\/p>\n<p>Observe que este tutorial abrange a corre\u00e7\u00e3o dos m\u00e9todos <code>React.createClass<\/code>e existentes <code>React.propTypes<\/code>. <a href=\"https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Se voc\u00ea estiver interessado em aprender como corrigi-los com o m\u00e9todo preferido de uso<\/a> <code>[React.Component](https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/)<\/code> <a href=\"https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">, veja o post sobre esse t\u00f3pico<\/a>.<\/p>\n<h2>Corrigindo o componente React<\/h2>\n<p>O primeiro problema que voc\u00ea encontrar\u00e1 \u00e9 que o componente nem ser\u00e1 carregado e voc\u00ea receber\u00e1 um <code>Uncaught TypeError: Cannot read property 'array' of undefined<\/code>erro bastante desagrad\u00e1vel.<\/p>\n<p>TypeError n\u00e3o capturado, n\u00e3o \u00e9 poss\u00edvel ler a propriedade &#8216;array&#8217; de indefinido<\/p>\n<p>Isso ocorre porque o Component cont\u00e9m a linha a seguir <code>defaultData: React.PropTypes.array,<\/code>e \u00e9 porque <code>React.PropTypes<\/code>ela \u00e9 indefinida.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169379-61e80e28d135c.png\" alt=\"Componente React.createClass quebrado? Vamos corrigi-lo!\" \/>React.PropTypes \u00e9 indefinido<\/p>\n<p>Um pouco de investiga\u00e7\u00e3o na <a href=\"https:\/\/reactjs.org\/docs\/typechecking-with-proptypes.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">documenta\u00e7\u00e3o do React mostra que<\/a> <code>[React.PropTypes](https:\/\/reactjs.org\/docs\/typechecking-with-proptypes.html)<\/code> <a href=\"https:\/\/reactjs.org\/docs\/typechecking-with-proptypes.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">foi movido para um pacote diferente no React vers\u00e3o 15.5<\/a>. Ele nos aconselha a usar a biblioteca prop-types.<\/p>\n<p>Ele ainda fornece um link para o <a href=\"https:\/\/www.npmjs.com\/package\/prop-types\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">reposit\u00f3rio npm para a biblioteca prop-types<\/a>. Ent\u00e3o vamos em frente e instale a biblioteca prop-types.<\/p>\n<pre><code>npm install --save prop-types\n<\/code><\/pre>\n<p>Na parte superior do nosso documento, vamos importar a <code>prop-types<\/code>biblioteca. <a href=\"https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">A maneira moderna disso nos faria usar a<\/a> <code>[import](https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/)<\/code> <a href=\"https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sintaxe<\/a>, mas por enquanto, vamos manter a mesma sintaxe adicionada <code>var PropTypes = require('prop-types');<\/code>ao documento abaixo onde declaramos <code>React<\/code>. A declara\u00e7\u00e3o de abertura agora deve ser algo assim:<\/p>\n<pre><code>'use strict';\nvar React     = require('react');\nvar PropTypes = require('prop-types');\n\nmodule.exports = React.createClass({\n    displayName: 'CheckBoxList',\n\n    propTypes: {\n        defaultData: React.PropTypes.array,\n        onChange: React.PropTypes.func\n    },\n...\n<\/code><\/pre>\n<p>Coisas boas! No entanto, ainda recebemos a <code>'array' of undefined<\/code>mensagem de erro. Bem, isso \u00e9 porque a sintaxe que est\u00e1 sendo usada \u00e9 <code>React.PropTypes.array<\/code>e acabamos de declarar nossos PropTypes para usar a vari\u00e1vel <code>PropTypes<\/code>. Portanto, a corre\u00e7\u00e3o simples \u00e9 localizar e substituir todas as inst\u00e2ncias de <code>React.PropTypes<\/code>por <code>PropTypes<\/code>.<\/p>\n<p>Nosso bloco de c\u00f3digo de abertura agora deve ficar assim:<\/p>\n<pre><code>'use strict';\nvar React     = require('react');\nvar PropTypes = require('prop-types');\n\nmodule.exports = React.createClass({\n    displayName: 'CheckBoxList',\n\n    propTypes: {\n        defaultData: PropTypes.array,\n        onChange: PropTypes.func\n    },\n...\n<\/code><\/pre>\n<p>Pronto, nosso problema de PropTypes est\u00e1 resolvido! Vamos atualizar nosso componente e ver se funciona.<\/p>\n<p>N\u00e3o, agora temos o erro<code>Uncaught TypeError: React.createClass is not a function.<\/code><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169379-61e80e28d135c.png\" alt=\"Componente React.createClass quebrado? Vamos corrigi-lo!\" \/><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169379-61e80e29cc727.png\" alt=\"Componente React.createClass quebrado? Vamos corrigi-lo!\" \/>TypeError n\u00e3o capturado: React.createClass n\u00e3o \u00e9 uma fun\u00e7\u00e3o.\ufeff<\/p>\n<p>Novamente, uma pequena pesquisa em torno da <a href=\"https:\/\/reactjs.org\/blog\/2017\/04\/07\/react-v15.5.0.html#new-deprecation-warnings\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">documenta\u00e7\u00e3o do React e notas de lan\u00e7amento para v15.5.0<\/a> nos mostra que <code>React.createClass<\/code>foi depreciado na vers\u00e3o 15.5.0.<\/p>\n<p>Junto com <code>React.PropTypes<\/code>, <code>React.createClass<\/code>foi refatorado em seu pr\u00f3prio pacote, j\u00e1 que <a href=\"https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o m\u00e9todo preferido de cria\u00e7\u00e3o de componentes React usa<\/a> <code>[React.Component](https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/)<\/code>.<\/p>\n<p>A substitui\u00e7\u00e3o para React.createClass agora est\u00e1 em seu pr\u00f3prio <a href=\"https:\/\/www.npmjs.com\/package\/create-react-class\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">reposit\u00f3rio npm como create-react-class<\/a>. Ent\u00e3o vamos em frente e instalar isso em nosso build.<\/p>\n<pre><code>npm install --save create-react-class\n<\/code><\/pre>\n<p>Precisamos importar o pacote para nossa compila\u00e7\u00e3o, novamente mantendo a sintaxe no formato cl\u00e1ssico, adicione a linha <code>var CreateReactClass = require('create-react-class');<\/code>no topo do documento, assim:<\/p>\n<pre><code>'use strict';\nvar React            = require('react');\nvar PropTypes        = require('prop-types');\nvar CreateReactClass = require('create-react-class');\n\nmodule.exports = React.createClass({\n    displayName: 'CheckBoxList',\n\n    propTypes: {\n        defaultData: PropTypes.array,\n        onChange: PropTypes.func\n    },\n...\n<\/code><\/pre>\n<p>Novamente, nosso erro n\u00e3o desaparecer\u00e1, porque precisamos substituir todas as inst\u00e2ncias de <code>React.createClass<\/code>pelo nosso novo objeto importado <code>CreateReactClass<\/code>. Isso deve se parecer um pouco com isso:<\/p>\n<pre><code>'use strict';\nvar React            = require('react');\nvar PropTypes        = require('prop-types');\nvar CreateReactClass = require('create-react-class');\n\nmodule.exports = CreateReactClass({\n    displayName: 'CheckBoxList',\n\n    propTypes: {\n        defaultData: PropTypes.array,\n        onChange: PropTypes.func\n    },\n...\n<\/code><\/pre>\n<p>E \u00e9 isso! O componente n\u00e3o apresenta mais erros e nosso console JavaScript \u00e9 agrad\u00e1vel e limpo.<\/p>\n<p>A solu\u00e7\u00e3o finalizada se parece um pouco com isso:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169379-61e80e2b09ef2.gif\" alt=\"Componente React.createClass quebrado? Vamos corrigi-lo!\" \/>O componente Patched React Multiple Checklist no WordPress Gutenberg<\/p>\n<h2>C\u00f3digo-fonte do tutorial<\/h2>\n<p>Voc\u00ea pode <a href=\"https:\/\/github.com\/wholesomecode\/Tutorial-Convert-React-createClass-to-React-Component\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">baixar o c\u00f3digo-fonte da vers\u00e3o original e corrigida do componente no GitHub<\/a>. O plugin cont\u00e9m um bloco WordPress Gutenberg que voc\u00ea pode usar para brincar com o c\u00f3digo, com tr\u00eas arquivos que voc\u00ea pode excluir conforme aplic\u00e1vel:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169379-61e80e2cbb1fa.png\" alt=\"Componente React.createClass quebrado? Vamos corrigi-lo!\" \/>Os arquivos de tutorial do GitHub para o patch React.createClass<\/p>\n<h2>Enviando uma solicita\u00e7\u00e3o pull para o reposit\u00f3rio original<\/h2>\n<p>O melhor da comunidade de c\u00f3digo aberto \u00e9 que somos livres para contribuir e melhorar o c\u00f3digo. Aqui est\u00e1 o <a href=\"https:\/\/github.com\/sonyan\/react-checkbox-list\/pull\/7\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Pull Request com o patch que acabei de criar e<\/a> que enviei para a Sony An.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/wholesomecode.ltd\" class=\"external external_icon\">wholesomecode.ltd<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Se voc\u00ea est\u00e1 construindo WordPress Gutenberg Blocks (ou mesmo se n\u00e3o estiver), voc\u00ea pode estar tentando fazer com que um componente React de terceiros funcione em sua compila\u00e7\u00e3o. Mas se for um elemento mais antigo, &#8230;<\/p>\n","protected":false},"author":1,"featured_media":224207,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,920,846],"tags":[1170],"class_list":["post-228524","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-outro","category-tutoriais","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/228524","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=228524"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/228524\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/224207"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=228524"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=228524"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=228524"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}