{"id":3563,"date":"2018-05-06T22:44:55","date_gmt":"2018-05-06T22:44:55","guid":{"rendered":"http:\/\/pensemosweb.com.mx\/index.php\/2018\/05\/06\/react-metodos-ciclo-vida-componente\/"},"modified":"2024-04-14T16:42:27","modified_gmt":"2024-04-14T22:42:27","slug":"react-metodos-ciclo-vida-componente","status":"publish","type":"post","link":"https:\/\/pensemosweb.com\/en\/react-metodos-ciclo-vida-componente\/","title":{"rendered":"React: M\u00e9todos del ciclo de vida de un componente"},"content":{"rendered":"<h2 class=\"wp-block-heading\">Introducci\u00f3n y diagrama<\/h2>\n\n\n\n<p>Antes de todo, estoy en el proceso de aprendizaje de React y en esta publicaci\u00f3n voy a explicar, seg\u00fan mi entendimiento, los m\u00e9todos del ciclo de vida de un componente con React.<\/p>\n\n\n\n<p>A partir de la versi\u00f3n 16.3 de React se agregaron nuevos m\u00e9todos del ciclo de vida de un componente para mejorar el rendimiento, buenas practicas y as\u00ed obtener una mejor calidad de los componentes creados.<\/p>\n\n\n\n<p>Principalmente este cambio es debido a componentes con funcionalidad as\u00edncrona, esto es muy importante porque normalmente el mundo real es as\u00edncrono y los componentes que creamos son utilizados en el mundo real por personas.<\/p>\n\n\n\n<p>Por esta raz\u00f3n tambi\u00e9n se empiezan a dejar de utilizar los siguientes m\u00e9todos, esto suceder\u00e1 a partir de la versi\u00f3n 17 de React:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>componentWillMount()<\/code><\/li>\n\n\n\n<li><code>componentWillRecieveProps(nextProps)<\/code><\/li>\n\n\n\n<li><code>componentWillUpdate(nextProps, nextState)<\/code><\/li>\n<\/ul>\n\n\n\n<p>Dado que los anteriores m\u00e9todos se dejaran de usar en la version 17, los siguientes m\u00e9todos son los recomendados a utilizar en un componente:<\/p>\n\n\n\n<p><strong>Montado:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>constructor()<\/code><\/li>\n\n\n\n<li><code>static getDerivedStateFromProps(nextProps, prevState)<\/code><\/li>\n\n\n\n<li><code>render()<\/code><\/li>\n\n\n\n<li><code>componentDidMount()<\/code><\/li>\n<\/ul>\n\n\n\n<p><strong>Actualizaci\u00f3n:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>static getDerivedStateFromProps(nextProps, prevState)<\/code><\/li>\n\n\n\n<li><code>shouldComponentUpdate(nextProps, nextState)<\/code><\/li>\n\n\n\n<li><code>getSnapshotBeforeUpdate(prevProps, prevState)<\/code><\/li>\n\n\n\n<li><code>render()<\/code><\/li>\n\n\n\n<li><code>componentDidUpdate(prevProps, prevState, snapshot)<\/code><\/li>\n<\/ul>\n\n\n\n<p><strong>Desmontado:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>componentWillUnmount()<\/code><\/li>\n<\/ul>\n\n\n\n<p><strong>Si ordenamos los m\u00e9todos de manera secuencial:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>constructor()<\/code><\/li>\n\n\n\n<li><code>static getDerivedStateFromProps(nextProps, prevState)<\/code><\/li>\n\n\n\n<li><code>render()<\/code><\/li>\n\n\n\n<li><code>shouldComponentUpdate(nextProps, nextState)<\/code><\/li>\n\n\n\n<li><code>getSnapshotBeforeUpdate(prevProps, prevState)<\/code><\/li>\n\n\n\n<li><code>render()<\/code><\/li>\n\n\n\n<li><code>componentDidUpdate(prevProps, prevState, snapshot)<\/code><\/li>\n\n\n\n<li><code>componentWillUnmount()<\/code><\/li>\n<\/ul>\n\n\n\n<p>Y para visualizar su relaci\u00f3n, aqu\u00ed est\u00e1 un diagrama de flujo:<\/p>\n\n\n\n<figure class=\"wp-block-image alignwide\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2018\/05\/react-lifecycle-methods.png\" alt=\"Diagrama de los m\u00e9todos del ciclo de vida de un componente en React\" class=\"wp-image-294\"\/><figcaption class=\"wp-element-caption\">Diagrama de los m\u00e9todos del ciclo de vida de un componente en React<\/figcaption><\/figure>\n\n\n\n<p>Si observamos el diagrama, el m\u00e9todo <code><strong>static getDerivedStateFromProps(nextProps, prevState)<\/strong><\/code> sustituye al m\u00e9todo deprecado <code><strong>componentWillReceiveProps(nextProps)<\/strong><\/code>, tambi\u00e9n parece ser que el m\u00e9todo  <code><strong>getSnapshotBeforeUpdate(prevProps, prevState)<\/strong><\/code> sustituye al m\u00e9todo deprecado <code><strong>componentWillUpdate(nextProps, nextState)<\/strong><\/code>.<\/p>\n\n\n\n<p>Para fines de demostraci\u00f3n vamos a crear un componente <code>Padre<\/code> y otro componente <code>Animal<\/code> (componente hijo), lo ideal es que el componente <code>Padre<\/code> maneje todo el <code>state<\/code>, pero para demostrar el funcionamiento de los m\u00e9todos ocuparemos algo de <code>state<\/code> en nuestro componente <code>Animal<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"constructorprops\">constructor(props)<\/h2>\n\n\n\n<p>El constructor es un m\u00e9todo de la mayor\u00eda de los lenguajes de programaci\u00f3n orientada a objetos, y se utiliza para crear la instancia de una clase. En react el constructor se usa para crear la instancia de nuestro componente. <\/p>\n\n\n\n<p>Cabe mencionar que despu\u00e9s de la ejecuci\u00f3n de este m\u00e9todo, nuestro componente a\u00fan no se pinta en nuestro navegador, al proceso de pintado, es decir, insertarlo en el DOM, se le llama <strong>Montar&nbsp;<\/strong>either <strong>Mount&nbsp;<\/strong>en ingles.<\/p>\n\n\n\n<p>Como buena practica de programaci\u00f3n es importante ejecutar <code>super()<\/code> dentro de un constructor para que realice cualquier llamada a constructores padres. <\/p>\n\n\n\n<p>En el caso de react se debe llamar con las <code>props<\/code> recibidas en el constructor, o sea, <code>super(props)<\/code>, esto nos permite poder acceder a las props a trav\u00e9s de <code>this.props<\/code> dentro del constructor. <\/p>\n\n\n\n<p>El constructor se usa normalmente para las siguietes dos cosas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Definir el estado local con un componente a trav\u00e9s de <code>this.state<\/code>.<\/li>\n\n\n\n<li>Para enlazar el objeto <code>this<\/code>(la instancia de nuestro componente) a los m\u00e9todos que son utilizados en el m\u00e9todo <code>render()<\/code>. Estos m\u00e9todos son usados como manejadores de eventos<\/li>\n<\/ul>\n\n\n\n<p> El estado de nuestro componente en el constructor se define as\u00ed:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"constructor (props) {    super(props);    this.state = {        propiedad: 'Alg\u00fan valor'    }}\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #82AAFF\">constructor<\/span><span style=\"color: #BABED8\"> (props) <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #BABED8\">super<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">props<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF\">this.<\/span><span style=\"color: #BABED8\">state<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        propiedad<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Alg\u00fan valor<\/span><span style=\"color: #89DDFF\">&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Si no defines ning\u00fan estado en el constructor, entonces no lo necesitas.<\/p>\n\n\n\n<p>Si se te ocurre definir el <code>state<\/code> usando las <code>props<\/code> pasados como par\u00e1metros probablemente es mejor definir el <code>state<\/code> en un componente padre o en la ra\u00edz de todos los componentes porque el estado no estar\u00e1 sincronizado con los cambios de las propiedades.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"constructor (props) {    super(props);    this.state = {        propieda: props.nombrePropiedad    }}\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #82AAFF\">constructor<\/span><span style=\"color: #BABED8\"> (props) <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #BABED8\">super<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">props<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF\">this.<\/span><span style=\"color: #BABED8\">state<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        propieda<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">props<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">nombrePropiedad<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Para enlazar la referencia de la instancia de nuestro componente a los m\u00e9todos que son utilizados en el m\u00e9todo <code>render()<\/code> y que normalmente son los manejadores de eventos:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"class Padre extends React.Component {    constructor (props) {        super(props);        this.state = { src: '' }        this.cambiarAnimal = this.cambiarAnimal.bind(this);    }    cambiarAnimal () {        this.setState({            src: 'Alg\u00fana url que apunte a una imagen de un animal'        });    }    render() {        return (          <div&gt;            <Animal src={this.state.src}\/&gt;            <button onClick={this.cambiarAnimal}&gt;Cambiar animal<\/button&gt;          <\/div&gt;        );    }}\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">class<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Padre<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">extends<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">react<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #FFCB6B\">Component<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #C792EA\">constructor<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8; font-style: italic\">props<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        <\/span><span style=\"color: #BABED8\">super<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">props<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        <\/span><span style=\"color: #89DDFF\">this.<\/span><span style=\"color: #BABED8\">state<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #F07178\"> src<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">&#39;&#39;<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        <\/span><span style=\"color: #89DDFF\">this.<\/span><span style=\"color: #BABED8\">cambiarAnimal<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">this.<\/span><span style=\"color: #BABED8\">cambiarAnimal<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">bind<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">this<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #F07178\">cambiarAnimal<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        <\/span><span style=\"color: #89DDFF\">this.<\/span><span style=\"color: #82AAFF\">setState<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">            src<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Alg\u00fana url que apunte a una imagen de un animal<\/span><span style=\"color: #89DDFF\">&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #F07178\">render<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #F07178\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">          <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">div<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">            <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #FFCB6B\">Animal<\/span><span style=\"color: #89DDFF\"> <\/span><span style=\"color: #C792EA\">src<\/span><span style=\"color: #89DDFF\">={this.<\/span><span style=\"color: #BABED8\">state<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">src<\/span><span style=\"color: #89DDFF\">}\/&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">            <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">button<\/span><span style=\"color: #89DDFF\"> <\/span><span style=\"color: #C792EA\">onClick<\/span><span style=\"color: #89DDFF\">={this.<\/span><span style=\"color: #BABED8\">cambiarAnimal<\/span><span style=\"color: #89DDFF\">}&gt;<\/span><span style=\"color: #BABED8\">Cambiar animal<\/span><span style=\"color: #89DDFF\">&lt;\/<\/span><span style=\"color: #F07178\">button<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">          <\/span><span style=\"color: #89DDFF\">&lt;\/<\/span><span style=\"color: #F07178\">div<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        )<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Ahora el m\u00e9todo <code>this.cambiarAnimal<\/code> podr\u00e1 acceder a la instancia de nuestro componente a trav\u00e9s de <code>this<\/code> y as\u00ed utilizar <code>this.setState()<\/code> para cambiar el estado. <\/p>\n\n\n\n<p>Existe otra opci\u00f3n para utilizar m\u00e9todos de nuestra clase como manejadores de eventos, con el uso de <strong>funciones flecha&nbsp;<\/strong>(arrow functions).<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"class Padre extends React.Component {    constructor (props) {        super(props);        this.state = { src: '' }    }    cambiarAnimal = () =&gt; {        this.setState({            src: 'Alg\u00fana url que apunte a una imagen de un animal'        });    }    render() {        return (          <div&gt;            <Animal src={this.state.src}\/&gt;            <button onClick={this.cambiarAnimal}&gt;Cambiar animal<\/button&gt;          <\/div&gt;        );    }}\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">class<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Padre<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">extends<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">react<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #FFCB6B\">Component<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #C792EA\">constructor<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8; font-style: italic\">props<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        <\/span><span style=\"color: #BABED8\">super<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">props<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        <\/span><span style=\"color: #89DDFF\">this.<\/span><span style=\"color: #BABED8\">state<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #F07178\"> src<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">&#39;&#39;<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #F07178\">cambiarAnimal<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">=&gt;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        <\/span><span style=\"color: #89DDFF\">this.<\/span><span style=\"color: #F07178\">setState(<\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">            src<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Alg\u00fana url que apunte a una imagen de un animal<\/span><span style=\"color: #89DDFF\">&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #F07178\">render<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #F07178\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">          <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">div<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">            <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #FFCB6B\">Animal<\/span><span style=\"color: #89DDFF\"> <\/span><span style=\"color: #C792EA\">src<\/span><span style=\"color: #89DDFF\">={this.<\/span><span style=\"color: #BABED8\">state<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">src<\/span><span style=\"color: #89DDFF\">}\/&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">            <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">button<\/span><span style=\"color: #89DDFF\"> <\/span><span style=\"color: #C792EA\">onClick<\/span><span style=\"color: #89DDFF\">={this.<\/span><span style=\"color: #BABED8\">cambiarAnimal<\/span><span style=\"color: #89DDFF\">}&gt;<\/span><span style=\"color: #BABED8\">Cambiar animal<\/span><span style=\"color: #89DDFF\">&lt;\/<\/span><span style=\"color: #F07178\">button<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">          <\/span><span style=\"color: #89DDFF\">&lt;\/<\/span><span style=\"color: #F07178\">div<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        )<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"staticgetderivedstatefrompropsnextpropsprevstate\">static getDerivedStateFromProps(nextProps, prevState)<\/h2>\n\n\n\n<p>Este m\u00e9todo es est\u00e1tico, s\u00ed, debe tener el modificador <code>static<\/code> que indica que este m\u00e9todo no est\u00e1 enlazado a alguna instancia del componente, sino m\u00e1s bien a su clase. Se invoca despu\u00e9s de instanciar un componente y tambi\u00e9n cuando el componente recibe cambios en las propiedades.<\/p>\n\n\n\n<p>Debe tener siempre un valor de retorno, ya sea un objeto para actualizar el <code>state<\/code> either <code>null<\/code> si no se quiere actualizar el <code>state<\/code> en relaci\u00f3n con los nuevos valores de las <code>props<\/code> recibidas. Es importante saber que este m\u00e9todo se ejecuta tambi\u00e9n cuando un componente padre provoca que el componente hijo sea de nuevo renderizado, por esta raz\u00f3n debes comparar valores anteriores con los nuevos para evitar mandar a actualizar el <code>state<\/code> cuando no hubo realmente un cambio.<\/p>\n\n\n\n<p>Podemos razonar que este m\u00e9todo nos puede servir para mantener sincronizado nuestro <code>state<\/code> (o solo una parte) con las <code>props<\/code> pasadas desde un componente padre.<\/p>\n\n\n\n<p>Por el momento en nuestro ejemplo del componente <code>Animal<\/code> solo visualizaremos los datos y regresaremos <code>null<\/code> porque no queremos actualizar el estado, adem\u00e1s el atributo <code>src<\/code> de nuestra imagen se actualiza cuando la propiedad <code>src<\/code> del componente cambia.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"...static getDerivedStateFromProps (nextProps, prevState) {    console.log('nextProps: ', nextProps);    console.log('prevState: ', prevState);    return null;}render() {    return (        <img className=&quot;cat__img&quot;          src={this.props.src}          \/&gt;     );}...\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #89DDFF\">...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">static <\/span><span style=\"color: #82AAFF\">getDerivedStateFromProps<\/span><span style=\"color: #BABED8\"> (nextProps<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> prevState) <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #BABED8\">console<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">log<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">nextProps: <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">nextProps<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #BABED8\">console<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">log<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">prevState: <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">prevState<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">null;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">render<\/span><span style=\"color: #BABED8\">() <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #F07178\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">img<\/span><span style=\"color: #89DDFF\"> <\/span><span style=\"color: #C792EA\">className<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">cat__img<\/span><span style=\"color: #89DDFF\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">          <\/span><span style=\"color: #C792EA\">src<\/span><span style=\"color: #89DDFF\">={this.<\/span><span style=\"color: #BABED8\">props<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">src<\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">          \/&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">     )<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">...<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Lo siguiente realmente no es necesario, pero para visualizar la ejecuci\u00f3n de este m\u00e9todo supongamos que dentro de nuestro componente <code>Animal<\/code> vamos a manejar la url(src) de la imagen del animal en <code>this.state.src<\/code>, as\u00ed:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"constructor (props) {    this.state = {        src: props.src    };}static getDerivedStateFromProps (nextProps, prevState) {    if (prevState.src !== nextProps.src) {      \/\/ necesario para actualizar la imagen cada vez que cambie this.props.src      return { src: nextProps.src };    }    return null;}render() {    return (        <img className=&quot;cat__img&quot;          src={this.state.src}          \/&gt;     );}...\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #82AAFF\">constructor<\/span><span style=\"color: #BABED8\"> (props) <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF\">this.<\/span><span style=\"color: #BABED8\">state<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        src<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">props<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">src<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF\">};<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">static <\/span><span style=\"color: #82AAFF\">getDerivedStateFromProps<\/span><span style=\"color: #BABED8\"> (nextProps<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> prevState) <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #F07178\"> (<\/span><span style=\"color: #BABED8\">prevState<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">src<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">!==<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">nextProps<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">src<\/span><span style=\"color: #F07178\">) <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">      <\/span><span style=\"color: #464B5D; font-style: italic\">\/\/ necesario para actualizar la imagen cada vez que cambie this.props.src<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">      <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #F07178\"> src<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #BABED8\">nextProps<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">src<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">};<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #89DDFF\">null;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">render<\/span><span style=\"color: #BABED8\">() <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #F07178\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">img<\/span><span style=\"color: #89DDFF\"> <\/span><span style=\"color: #C792EA\">className<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">cat__img<\/span><span style=\"color: #89DDFF\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">          <\/span><span style=\"color: #C792EA\">src<\/span><span style=\"color: #89DDFF\">={this.<\/span><span style=\"color: #BABED8\">state<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">src<\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">          \/&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">     )<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">...<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Ahora prueba el c\u00f3digo aqu\u00ed, y revisa los mensajes de la consola, por el momento solo nos estamos enfocando en el <code>constructor(props)<\/code> and <code>static getDerivedStateFromProps(nextProps, prevState)<\/code>:<\/p>\n\n\n\n<figure><iframe src=\"\/\/codepen.io\/jaime_cervantes_ve\/embed\/qYayKq\/?height=265&#038;theme-id=0&#038;default-tab=js,result&#038;embed-version=2#full\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"render\">render()<\/h2>\n\n\n\n<p>Este m\u00e9todo es obligatorio en cualquier componente, pues como su nombre lo dice, se utiliza para obtener los elementos finales a visualizar o pintar en el navegador. Debe ser una funci\u00f3n pura, es decir, no debe modificar las <code>props<\/code>, no debe modificar el <code>state<\/code> ni realizar operaciones del DOM.<\/p>\n\n\n\n<p>Seg\u00fan mi entendimiento, el resultado de este m\u00e9todo es utilizado por <code>ReactDOM.render()<\/code> para insertarlo en el DOM del navegador. Si el componente en cuesti\u00f3n ha sido insertado previamente, solo se muta el DOM lo necesario para reflejar los nuevos cambios, esto quiere decir que<strong> <code>render()<\/code> regresa los objetos necesarios para que en otro lugar sean insertados en el DOM<\/strong>. <\/p>\n\n\n\n<p>Esto se puede comprobar si observas la consola del anterior ejemplo y luego das clic sobre el bot\u00f3n <em>\u201cCambiar animal\u201d<\/em> entonces ver\u00e1s que el m\u00e9todo <code>render()<\/code> es ejecutado antes de <code>getSnapshotBeforeUpdate()<\/code> and <code>componentDidUpdate()<\/code>.<\/p>\n\n\n\n<p>Con esto tengo una duda, \u00bfEn qu\u00e9 momento se modifica el DOM?, yo creo que se modifica el DOM <strong>despu\u00e9s de<\/strong> <code><strong>ReactDOM.render()<\/strong><\/code> <strong>y antes de que<\/strong> <code><strong>componentDidUpdate()<\/strong><\/code>.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"...render() {    return (        <img className=&quot;cat__img&quot;          src={this.state.src}          \/&gt;     );}...\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #89DDFF\">...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">render<\/span><span style=\"color: #BABED8\">() <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #F07178\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">        <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #F07178\">img<\/span><span style=\"color: #89DDFF\"> <\/span><span style=\"color: #C792EA\">className<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">cat__img<\/span><span style=\"color: #89DDFF\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">          <\/span><span style=\"color: #C792EA\">src<\/span><span style=\"color: #89DDFF\">={this.<\/span><span style=\"color: #BABED8\">state<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">src<\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">          \/&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">     )<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">...<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"componentdidmount\">componentDidMount()<\/h2>\n\n\n\n<p>Este m\u00e9todo se ejecuta cuando nuestro componente est\u00e1 listo en el DOM, siguiendo el razonamiento explicado en el m\u00e9todo <code>render()<\/code>, se ejecuta despu\u00e9s de que React inserte el DOM, y antes del m\u00e9todo <strong>`render()`<\/strong>. Por eso es \u00fatil para realizar llamadas ajax y operaciones con el DOM como agregar eventos y\/o modificar elementos internos.<\/p>\n\n\n\n<p>Dentro de este m\u00e9todo es seguro cambiar el <code>state<\/code>, pero si ejecutamos <code>this.setState()<\/code> provocara que nuestro componente se vuelva a renderizar. <\/p>\n\n\n\n<p>La documentaci\u00f3n oficial de React nos advierte tener cuidado con esto, pues puede causar problemas de rendimiento por renderizar nuestro componente varias veces. Sin embargo es necesario para los casos de tomar medidas y posiciones de algunos elementos antes de renderizar, por ejemplo el tama\u00f1o y posici\u00f3n de modales y tooltips.<\/p>\n\n\n\n<p>Para ver el uso de este m\u00e9todo veamos el siguiente ejemplo, si revisamos la consola veremos que <code>render()<\/code> se ejecuta dos veces, tambi\u00e9n si damos clic en el bot\u00f3n <em>Cambiar animal<\/em>, se nota que de nuevo <code>render()<\/code> se ejecuta dos veces. <\/p>\n\n\n\n<p>\u00bfPor qu\u00e9 sucede esto?, sucede porque dentro del m\u00e9todo <code>componentDidMount()<\/code> agregamos un escuchador de eventos para la carga de la imagen del animal, al ejecutarse <code>this.onImgLoad()<\/code>.<\/p>\n\n\n\n<p>`this.onImgLoad()` invoca a <code>this.setState()<\/code> y esta funci\u00f3n provoca que el componente se vuelva a renderizar para mostrar las medidas exactas de la imagen cuando se termina de cargar.<\/p>\n\n\n\n<figure><iframe src=\"\/\/codepen.io\/jaime_cervantes_ve\/embed\/WJxVXr\/?height=265&#038;theme-id=0&#038;default-tab=js,result&#038;embed-version=2#full\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"shouldcomponentupdatenextpropsnextstate\">shouldComponentUpdate(nextProps, nextState)<\/h2>\n\n\n\n<p>En versiones actuales de React, este m\u00e9todo se ejecuta para decidir si los cambios en las <code>props<\/code> o el <code>state<\/code> merecen que se vuelva a renderizar el componente con estos nuevos datos.<\/p>\n\n\n\n<p>El valor de retorno de esta funci\u00f3n es <code>true<\/code> either <code>false<\/code>. Si el resultado de este m\u00e9todo es <code>true<\/code>, los m\u00e9todos <code>render()<\/code>, <code>getSnapshotBeforeUpdate()<\/code> and <code>componentDidMount()<\/code>no se ejecutan.<\/p>\n\n\n\n<p>Recibe como par\u00e1metros las nuevos valores <code>pros<\/code> y del <code>state<\/code>, con estos valores y los valores actuales de nuestro componente podemos condicionar si es necesario volver a renderizar o no, de esta manera podemos mejorar el rendimiento manualmente.<\/p>\n\n\n\n<p>Si no implementamos este m\u00e9todo en nuestro componente, React toma como resultado el valor <code>true<\/code>, por lo que siempre se volver\u00e1 a renderizar. El resultado no influye en los componentes hijos, si en un componente padre el resultado es <code>false<\/code>, esto no impide que componentes hijos necesiten volver a ser renderizados.<\/p>\n\n\n\n<p>Es importante mencionar que en la documentaci\u00f3n indica que <strong>tal vez en futuras versiones de React, este m\u00e9todo no impida un renderizado del componente<\/strong>, o sea, que en un futuro si este m\u00e9todo regresa <code>false<\/code>aun as\u00ed se ejecutaran los m\u00e9todos <code>render()<\/code>, <code>getSnapshotBeforeUpdate()<\/code> and <code>componentDidUpdate()<\/code>.<\/p>\n\n\n\n<p>Esto \u00faltimo me deja con un sabor amargo, actualmente este m\u00e9todo es un buen lugar para mejorar el rendimiento de nuestro componente porque evitamos el re-renderizado en situaciones que no sean necesarias, pero despu\u00e9s en futuras versiones cabe la posibilidad de perder esta habilidad, entonces quiero pensar que deben existir otras maneras de mejorar este caso de rendimiento, \u00bfAlguien tiene alguna idea?.<\/p>\n\n\n\n<p>Veamos un ejemplo, en el anterior m\u00e9todo <code>componentDidMount()<\/code> mencionamos que agregamos un escuchador de eventos al finalizar la carga de la imagen para poder obtener sus medidas, est\u00e1s medidas las mostramos en nuestro componente, pero esta el caso de dos im\u00e1genes de perros que tiene la misma medida, <code>128px - 128px<\/code>, entonces el ancho y el alto de la imagen no cambia, por lo que no es necesario volver a renderizar nuestro componente.<\/p>\n\n\n\n<figure><iframe src=\"\/\/codepen.io\/jaime_cervantes_ve\/embed\/vjXwmB\/?height=265&#038;theme-id=0&#038;default-tab=js,result&#038;embed-version=2#full\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/figure>\n\n\n\n<p>Si cambiamos de entre el perro de raza chihuahua y el perro ladrando, podemos ver en la consola que el \u00faltimo m\u00e9todo ejecutado es el <code>shouldComponentUpdate()<\/code>, como el resultado fue <code>false<\/code>, no se ejecutaron de nuevo los m\u00e9todos <code>render()<\/code>, <code>getSnapshotBeforeUpdate()<\/code> and <code>componentDidUpdate()<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"getsnapshotbeforeupdateprevpropsprevstate\">getSnapshotBeforeUpdate(prevProps, prevState)<\/h2>\n\n\n\n<p>Este m\u00e9todo se ejecuta despu\u00e9s de <code>render()<\/code> y antes de <code>componentDidUpdate()<\/code>, el valor que regresa la ejecuci\u00f3n de este m\u00e9todo se convierte en el tercer par\u00e1metro llamado <strong>snapshot <\/strong>of <code>componentDidUpdate(prevProps, prevState, snapshot)<\/code>, este m\u00e9todo debe regresar alg\u00fan valor o <code>null<\/code>, si no es as\u00ed, React nos advertir\u00e1 con algo parecido al siguiente <strong>warning <\/strong>en la consola:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"Warning:Animal.getSnapshotBeforeUpdate(): A snapshot value (or null) must be returned. You have returned undefined.\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #FFCB6B\">Warning<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">Animal<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">getSnapshotBeforeUpdate<\/span><span style=\"color: #BABED8\">(): A snapshot <\/span><span style=\"color: #82AAFF\">value<\/span><span style=\"color: #BABED8\"> (or <\/span><span style=\"color: #89DDFF\">null<\/span><span style=\"color: #BABED8\">) must be returned<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\"> You have returned undefined<\/span><span style=\"color: #89DDFF\">.<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Adem\u00e1s recibe las <code>props<\/code> y el <code>state<\/code> antes de la actualizaci\u00f3n por lo que es f\u00e1cil hacer comparaciones con las <code>props<\/code> y el <code>state<\/code> actuales a trav\u00e9s de <code>this.props<\/code> and <code>this.state<\/code>.<\/p>\n\n\n\n<p>Este m\u00e9todo puede regresar cualquier tipo de valor, por ejemplo puede regresar datos del DOM como cuantos elementos existen en una determinada lista de elementos o la posici\u00f3n del scroll antes de que el componente sea actualizado a trav\u00e9s de <code>ReactDOM.render()<\/code>(si nuestra hip\u00f3tesis explicada en el m\u00e9todo <code>render()<\/code> es correcta).<\/p>\n\n\n\n<figure><iframe src=\"\/\/codepen.io\/jaime_cervantes_ve\/embed\/PeJXEP\/?height=265&#038;theme-id=0&#038;default-tab=js,result&#038;embed-version=2#full\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/figure>\n\n\n\n<p>Si revisamos el c\u00f3digo de <code>getSnapshotBeforeUpdate()<\/code> and <code>componentDidUpdate()<\/code> y adem\u00e1s revisamos la consola, notaremos que <code>getSnapshotBeforeUpdate()<\/code> le env\u00eda a <code>componentDidUpdate<\/code> el numero de elementos del DOM que contiene el componente en cuesti\u00f3n, que son <code>2<\/code>, el p\u00e1rrafo con las medidas de la imagen y la imagen del animal.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"componentdidupdateprevpropsprevstatesnapshot\">componentDidUpdate(prevProps, prevState, snapshot)<\/h2>\n\n\n\n<p>Este m\u00e9todo se ejecuta cuando el componente ha sido actualizado totalmente, y es reflejado en el DOM de nuestra aplicaci\u00f3n, recibe las <code>props<\/code> y el <code>state<\/code> antes de la actualizaci\u00f3n por lo que es f\u00e1cil hacer comparaciones con las <code>props<\/code> y el <code>state<\/code> actuales a trav\u00e9s de <code>this.props<\/code> and <code>this.state<\/code>.<\/p>\n\n\n\n<p>Aqu\u00ed se puede trabajar con el DOM del componente dado que este mismo ha sido actualizado, adem\u00e1s se puede realizar operaciones como obtener datos remotos seg\u00fan los cambios de las <code>props<\/code> either <code>state<\/code>.<\/p>\n\n\n\n<p>No se ejecuta la primera vez que se usa el m\u00e9todo <code>render()<\/code>, es decir, cuando se monta el componente.<\/p>\n\n\n\n<figure><iframe src=\"\/\/codepen.io\/jaime_cervantes_ve\/embed\/BxwMyR\/?height=265&#038;theme-id=0&#038;default-tab=js,result&#038;embed-version=2#full\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/figure>\n\n\n\n<p>En la consola podemos ver los datos, <code>prevProps<\/code>, <code>preState<\/code>, y <code>snapshot<\/code>, este \u00faltimo tiene el valor <code>2<\/code>. Tambi\u00e9n vemos <code>this.props<\/code> and <code>this.state<\/code><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"componentwillunmount\">componentWillUnmount()<\/h2>\n\n\n\n<p>Este m\u00e9todo se ejecuta justo antes del que el componente sea desmontado del DOM, es un buen lugar para liberar recursos y memoria. Un ejemplo claro es la eliminaci\u00f3n de escuchadores de eventos que ya no se van a necesitar, tambi\u00e9n se pueden cancelar peticiones remotas que se est\u00e9n ejecutando actualmente dado que estas seguir\u00e1n su proceso a\u00fan desmontando el componente.<\/p>\n\n\n\n<p>En el ejemplo de abajo se ilustra como se elimina un escuchador de evento <code>load<\/code> para la carga de la imagen del animal.<\/p>\n\n\n\n<figure><iframe src=\"\/\/codepen.io\/jaime_cervantes_ve\/embed\/GdMegx\/?height=265&#038;theme-id=0&#038;default-tab=js,result&#038;embed-version=2#full\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/figure>","protected":false},"excerpt":{"rendered":"<p>        A partir de la versi\u00f3n 16.3 de React se agregaron nuevos m\u00e9todos del ciclo de vida de un componente para mejorar el rendimiento, buenas practicas y as\u00ed obtener una mejor calidad de los componentes creados, principalmente en componentes con funcionalidad as\u00edncrona.<\/p>","protected":false},"author":2,"featured_media":3739,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[35],"tags":[53,54,73],"class_list":["post-3563","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-react","tag-html","tag-javascript","tag-react"],"_links":{"self":[{"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/posts\/3563","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/comments?post=3563"}],"version-history":[{"count":4,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/posts\/3563\/revisions"}],"predecessor-version":[{"id":3916,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/posts\/3563\/revisions\/3916"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/media\/3739"}],"wp:attachment":[{"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/media?parent=3563"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/categories?post=3563"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/tags?post=3563"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}