{"componentChunkName":"component---src-templates-content-template-js","path":"/es/part5/react_router_librerias_de_ui","result":{"data":{"markdownRemark":{"html":"<div class=\"content\">\n<p>La interfaz de usuario de nuestra aplicación es actualmente bastante básica:</p>\n<picture><img src=\"/static/53f508c86f1c63f33ff66bc095dd84c9/5a190/u1.png\" srcset=\"/static/53f508c86f1c63f33ff66bc095dd84c9/772e8/u1.png 200w,\n/static/53f508c86f1c63f33ff66bc095dd84c9/e17e5/u1.png 400w,\n/static/53f508c86f1c63f33ff66bc095dd84c9/5a190/u1.png 800w,\n/static/53f508c86f1c63f33ff66bc095dd84c9/c1b63/u1.png 1200w,\n/static/53f508c86f1c63f33ff66bc095dd84c9/e405b/u1.png 1566w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<p>Queremos cambiar eso. Comencemos con la estructura de navegación de la aplicación.</p>\n<p>Es muy común que las aplicaciones web tengan una barra de navegación que permite a los usuarios cambiar entre diferentes vistas dentro de la aplicación. Nuestra aplicación para tomar notas podría incluir una página de inicio:</p>\n<picture><img src=\"/static/49d29e31757f3495aec34c7c934154ef/5a190/u6.png\" srcset=\"/static/49d29e31757f3495aec34c7c934154ef/772e8/u6.png 200w,\n/static/49d29e31757f3495aec34c7c934154ef/e17e5/u6.png 400w,\n/static/49d29e31757f3495aec34c7c934154ef/5a190/u6.png 800w,\n/static/49d29e31757f3495aec34c7c934154ef/c1b63/u6.png 1200w,\n/static/49d29e31757f3495aec34c7c934154ef/b1001/u6.png 1380w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<p>y una página separada para ver notas:</p>\n<picture><img src=\"/static/37befe2014a595517dbff8088cd3d4f5/5a190/u7.png\" srcset=\"/static/37befe2014a595517dbff8088cd3d4f5/772e8/u7.png 200w,\n/static/37befe2014a595517dbff8088cd3d4f5/e17e5/u7.png 400w,\n/static/37befe2014a595517dbff8088cd3d4f5/5a190/u7.png 800w,\n/static/37befe2014a595517dbff8088cd3d4f5/c1b63/u7.png 1200w,\n/static/37befe2014a595517dbff8088cd3d4f5/93582/u7.png 1524w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<p>así como una página para crear notas:</p>\n<picture><img src=\"/static/413aba82076132e28bf917dadba437e2/5a190/u8.png\" srcset=\"/static/413aba82076132e28bf917dadba437e2/772e8/u8.png 200w,\n/static/413aba82076132e28bf917dadba437e2/e17e5/u8.png 400w,\n/static/413aba82076132e28bf917dadba437e2/5a190/u8.png 800w,\n/static/413aba82076132e28bf917dadba437e2/c1b63/u8.png 1200w,\n/static/413aba82076132e28bf917dadba437e2/b1001/u8.png 1380w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<p><a href=\"/es/part0/fundamentos_de_las_aplicaciones_web#aplicaciones-web-tradicionales\">En una aplicación web tradicional</a>, cambiar entre las páginas mostradas por la aplicación implicaba que el navegador enviara una nueva solicitud HTTP GET al servidor y luego renderizara el código HTML devuelto por el servidor, que correspondía a la nueva vista.</p>\n<p>Sin embargo, en las aplicaciones de una sola página, en realidad estás en la misma página todo el tiempo y el código JavaScript ejecutado en el navegador crea la ilusión de diferentes \"páginas\". Si se realizan solicitudes HTTP al cambiar de vista, se utilizan únicamente para recuperar datos con formato JSON que pueden ser necesarios para mostrar la nueva vista.</p>\n<p>Una aplicación con una barra de navegación y múltiples vistas sería fácil de implementar con React, por ejemplo, haciendo que el estado de la aplicación <i>page</i> recuerde en qué página se encuentra el usuario y muestre la vista correcta en función de esto:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">App</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>page<span class=\"token punctuation\">,</span> setPage<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token string\">'home'</span><span class=\"token punctuation\">)</span>\n\n <span class=\"token keyword\">const</span>  <span class=\"token function-variable function\">toPage</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">page</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    event<span class=\"token punctuation\">.</span><span class=\"token function\">preventDefault</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">setPage</span><span class=\"token punctuation\">(</span>page<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">content</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>page <span class=\"token operator\">===</span> <span class=\"token string\">'home'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>Home <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>page <span class=\"token operator\">===</span> <span class=\"token string\">'notes'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>Notes <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>page <span class=\"token operator\">===</span> <span class=\"token string\">'users'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>Users <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>a href<span class=\"token operator\">=</span><span class=\"token string\">\"\"</span> onClick<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token function\">toPage</span><span class=\"token punctuation\">(</span><span class=\"token string\">'home'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span> <span class=\"token operator\">></span>\n          home\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>a<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>a href<span class=\"token operator\">=</span><span class=\"token string\">\"\"</span> onClick<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token function\">toPage</span><span class=\"token punctuation\">(</span><span class=\"token string\">'notes'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n          notes\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>a<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>a href<span class=\"token operator\">=</span><span class=\"token string\">\"\"</span> onClick<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token function\">toPage</span><span class=\"token punctuation\">(</span><span class=\"token string\">'users'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span> <span class=\"token operator\">></span>\n          users\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>a<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n\n      <span class=\"token punctuation\">{</span><span class=\"token function\">content</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Sin embargo, este método no es óptimo: la URL del sitio web sigue siendo la misma incluso cuando estás en una vista diferente. Sin embargo, cada vista debe tener su propia URL para que los usuarios puedan, por ejemplo, marcar páginas como favoritas. Además, el botón Atrás del navegador no funciona lógicamente si las páginas no tienen direcciones propias; es decir, hacer clic en el botón Atrás no lo llevará a la vista de la aplicación vista anteriormente, sino a otro lugar completamente diferente.</p>\n<h3>React Router</h3>\n<p>Afortunadamente, la librería <a href=\"https://reactrouter.com/\">React Router</a> ofrece una excelente solución para gestionar la navegación en una aplicación React.</p>\n<p>Instalemos React Router:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> react-router-dom</code></pre></div>\n<p>Creemos un nuevo componente que sirva como página principal de la aplicación.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">Home</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\n      Lorem ipsum dolor sit amet<span class=\"token punctuation\">,</span> consectetur adipiscing elit<span class=\"token punctuation\">,</span> sed <span class=\"token keyword\">do</span> eiusmod tempor incididunt ut labore et dolore magna aliqua<span class=\"token punctuation\">.</span> Ut enim ad minim veniam<span class=\"token punctuation\">,</span> quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat<span class=\"token punctuation\">.</span> Duis aute irure dolor <span class=\"token keyword\">in</span> reprehenderit <span class=\"token keyword\">in</span> voluptate velit esse cillum dolore eu fugiat nulla pariatur<span class=\"token punctuation\">.</span> Excepteur sint occaecat cupidatat non proident<span class=\"token punctuation\">,</span> sunt <span class=\"token keyword\">in</span> culpa qui officia deserunt mollit anim id est laborum<span class=\"token punctuation\">.</span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> Home</code></pre></div>\n<p>Extraeremos la vista principal anterior de la aplicación (que estaba en el componente <i>App</i>) a su propio componente, pero moveremos el manejo del estado de las notas fuera del componente:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// list of notes passed as a parameter</span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">NoteList</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> notes <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span></span>  <span class=\"token comment\">// content mostly the same as in the App component</span>\n  <span class=\"token comment\">// reference to NoteForm is removed</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>El componente <i>App</i> ahora cambia de la siguiente manera</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useState<span class=\"token punctuation\">,</span> useEffect <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span>\n<span class=\"token keyword\">import</span> noteService <span class=\"token keyword\">from</span> <span class=\"token string\">'./services/notes'</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span>\n  BrowserRouter <span class=\"token keyword\">as</span> Router<span class=\"token punctuation\">,</span>\n  Routes<span class=\"token punctuation\">,</span> Route<span class=\"token punctuation\">,</span> Link\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-router-dom'</span>\n<span class=\"token keyword\">import</span> NoteList <span class=\"token keyword\">from</span> <span class=\"token string\">'./components/NoteList'</span>\n<span class=\"token keyword\">import</span> Home <span class=\"token keyword\">from</span> <span class=\"token string\">'./components/Home'</span>\n<span class=\"token keyword\">import</span> Footer <span class=\"token keyword\">from</span> <span class=\"token string\">'./components/Footer'</span>\n<span class=\"token keyword\">import</span> NoteForm <span class=\"token keyword\">from</span> <span class=\"token string\">'./components/NoteForm'</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">App</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>notes<span class=\"token punctuation\">,</span> setNotes<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token function\">useEffect</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    noteService<span class=\"token punctuation\">.</span><span class=\"token function\">getAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">initialNotes</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">setNotes</span><span class=\"token punctuation\">(</span>initialNotes<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">addNote</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">noteObject</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    noteService<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>noteObject<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">returnedNote</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">setNotes</span><span class=\"token punctuation\">(</span>notes<span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>returnedNote<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">const</span> padding <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">padding</span><span class=\"token operator\">:</span> <span class=\"token number\">5</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n<span class=\"gatsby-highlight-code-line\">    <span class=\"token operator\">&lt;</span>Router<span class=\"token operator\">></span></span><span class=\"gatsby-highlight-code-line\">      <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span></span><span class=\"gatsby-highlight-code-line\">        <span class=\"token operator\">&lt;</span>Link style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>padding<span class=\"token punctuation\">}</span> to<span class=\"token operator\">=</span><span class=\"token string\">\"/\"</span><span class=\"token operator\">></span>home<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span></span><span class=\"gatsby-highlight-code-line\">        <span class=\"token operator\">&lt;</span>Link style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>padding<span class=\"token punctuation\">}</span> to<span class=\"token operator\">=</span><span class=\"token string\">\"/notes\"</span><span class=\"token operator\">></span>notes<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span></span><span class=\"gatsby-highlight-code-line\">        <span class=\"token operator\">&lt;</span>Link style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>padding<span class=\"token punctuation\">}</span> to<span class=\"token operator\">=</span><span class=\"token string\">\"/create\"</span><span class=\"token operator\">></span><span class=\"token keyword\">new</span> <span class=\"token class-name\">note</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span></span><span class=\"gatsby-highlight-code-line\">      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span></span>\n<span class=\"gatsby-highlight-code-line\">      <span class=\"token operator\">&lt;</span>Routes<span class=\"token operator\">></span></span><span class=\"gatsby-highlight-code-line\">        <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/notes\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span></span><span class=\"gatsby-highlight-code-line\">          <span class=\"token operator\">&lt;</span>NoteList notes<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>notes<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span></span><span class=\"gatsby-highlight-code-line\">        <span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span></span><span class=\"gatsby-highlight-code-line\">        <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/create\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span></span><span class=\"gatsby-highlight-code-line\">          <span class=\"token operator\">&lt;</span>NoteForm createNote<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>addNote<span class=\"token punctuation\">}</span><span class=\"token operator\">/</span><span class=\"token operator\">></span></span><span class=\"gatsby-highlight-code-line\">        <span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span></span><span class=\"gatsby-highlight-code-line\">        <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token operator\">&lt;</span>Home <span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span></span><span class=\"gatsby-highlight-code-line\">      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Routes<span class=\"token operator\">></span></span><span class=\"gatsby-highlight-code-line\"></span><span class=\"gatsby-highlight-code-line\">      <span class=\"token operator\">&lt;</span>Footer <span class=\"token operator\">/</span><span class=\"token operator\">></span></span><span class=\"gatsby-highlight-code-line\">    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Router<span class=\"token operator\">></span></span>  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> App</code></pre></div>\n<p>El enrutamiento —es decir, el renderizado condicional de componentes según la <i>URL</i> del navegador— se habilita colocando los componentes como hijos de <a href=\"https://reactrouter.com/api/declarative-routers/Router\">Router</a>, dentro de sus etiquetas.</p>\n<p>Primero, la barra de navegación de la aplicación se define utilizando el componente <a href=\"https://reactrouter.com/api/components/Link\">Link</a>. El atributo <i>to</i> especifica cómo se cambia la URL del navegador cuando se hace clic en el enlace:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\n  <span class=\"token operator\">&lt;</span>Link style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>padding<span class=\"token punctuation\">}</span> to<span class=\"token operator\">=</span><span class=\"token string\">\"/\"</span><span class=\"token operator\">></span>home<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span>\n  <span class=\"token operator\">&lt;</span>Link style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>padding<span class=\"token punctuation\">}</span> to<span class=\"token operator\">=</span><span class=\"token string\">\"/notes\"</span><span class=\"token operator\">></span>notes<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span>\n  <span class=\"token operator\">&lt;</span>Link style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>padding<span class=\"token punctuation\">}</span> to<span class=\"token operator\">=</span><span class=\"token string\">\"/create\"</span><span class=\"token operator\">></span><span class=\"token keyword\">new</span> <span class=\"token class-name\">note</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span>\n<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span></code></pre></div>\n<p>A continuación, el enrutamiento de la aplicación se define utilizando el componente <a href=\"https://reactrouter.com/api/components/Routes\">Routes</a>. Dentro del componente usamos <a href=\"https://reactrouter.com/api/components/Route\">Route</a> para definir un conjunto de reglas y los componentes que se renderizarán para cada una:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token operator\">&lt;</span>Routes<span class=\"token operator\">></span>\n  <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/notes\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>\n    <span class=\"token operator\">&lt;</span>NoteList notes<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>notes<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n  <span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n  <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/create\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>\n    <span class=\"token operator\">&lt;</span>NoteForm createNote<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>addNote<span class=\"token punctuation\">}</span><span class=\"token operator\">/</span><span class=\"token operator\">></span>\n  <span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n  <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token operator\">&lt;</span>Home <span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Routes<span class=\"token operator\">></span></code></pre></div>\n<p>En la URL raíz de la aplicación se renderiza el componente <i>Home</i>:</p>\n<picture><img src=\"/static/5a4bd7a10bf814e9d65dd8ee53f0a6e6/5a190/u2.png\" srcset=\"/static/5a4bd7a10bf814e9d65dd8ee53f0a6e6/772e8/u2.png 200w,\n/static/5a4bd7a10bf814e9d65dd8ee53f0a6e6/e17e5/u2.png 400w,\n/static/5a4bd7a10bf814e9d65dd8ee53f0a6e6/5a190/u2.png 800w,\n/static/5a4bd7a10bf814e9d65dd8ee53f0a6e6/c1b63/u2.png 1200w,\n/static/5a4bd7a10bf814e9d65dd8ee53f0a6e6/f3abf/u2.png 1474w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<p>Al hacer clic en \"notas\" en la barra de navegación, la dirección del navegador cambia a <i>notes</i> y se renderiza el componente <i>NoteList</i>:</p>\n<picture><img src=\"/static/82572aeff3dbdf8266c0926a58db75ec/5a190/u3.png\" srcset=\"/static/82572aeff3dbdf8266c0926a58db75ec/772e8/u3.png 200w,\n/static/82572aeff3dbdf8266c0926a58db75ec/e17e5/u3.png 400w,\n/static/82572aeff3dbdf8266c0926a58db75ec/5a190/u3.png 800w,\n/static/82572aeff3dbdf8266c0926a58db75ec/c1b63/u3.png 1200w,\n/static/82572aeff3dbdf8266c0926a58db75ec/93582/u3.png 1524w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<p>De manera similar, al hacer clic en \"nueva nota\", la URL pasa a ser <i>create</i> y se renderiza el componente <i>NoteForm</i>.</p>\n<p>En una página web normal, cambiar la dirección en la barra de direcciones del navegador hace que la página se vuelva a cargar. Sin embargo, cuando se usa React Router, esto no sucede; en cambio, el enrutamiento se maneja completamente a través de JavaScript en la interfaz.</p>\n<p>El componente del enrutador que utilizamos es <a href=\"https://reactrouter.com/en/main/router-components/browser-router\">BrowserRouter</a>:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span>\n<span class=\"gatsby-highlight-code-line\">  BrowserRouter <span class=\"token keyword\">as</span> Router<span class=\"token punctuation\">,</span></span>  Routes<span class=\"token punctuation\">,</span> Route<span class=\"token punctuation\">,</span> Link\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-router-dom'</span></code></pre></div>\n<p>Según la <a href=\"https://reactrouter.com/en/main/router-components/browser-router\">documentación</a></p>\n<blockquote>\n<p><i>BrowserRouter</i> es un <i>Router</i> que utiliza la API de historial HTML5 (pushState, replaceState y el evento popstate) para mantener su interfaz de usuario sincronizada con la URL.</p>\n</blockquote>\n<p><i>BrowserRouter</i> utiliza la <a href=\"https://css-tricks.com/using-the-html5-history-api/\">API de historial HTML5</a> para permitir que la URL en la barra de direcciones del navegador se use para el \"enrutamiento\" interno dentro de una aplicación React, lo que significa que incluso si la URL en la barra de direcciones cambia, el contenido de la página se manipula únicamente a través de JavaScript y el navegador no carga contenido nuevo desde el servidor. Sin embargo, el comportamiento del navegador con respecto a las funciones de avance y retroceso y los marcadores es intuitivo: funciona igual que en los sitios web tradicionales.</p>\n<p>El código actual de la aplicación está disponible en su totalidad en <a href=\"https://github.com/fullstack-hy2020/part2-notes-frontend/tree/part5-10\">GitHub</a>, en la rama <i>part5-10</i>.</p>\n<h3>Ruta parametrizada</h3>\n<p>Movamos los detalles de una sola nota a su propia vista, a la que se puede acceder haciendo clic en el nombre de la nota:</p>\n<picture><img src=\"/static/72e0e37474156b5d025228afd9ab9da1/5a190/u4.png\" srcset=\"/static/72e0e37474156b5d025228afd9ab9da1/772e8/u4.png 200w,\n/static/72e0e37474156b5d025228afd9ab9da1/e17e5/u4.png 400w,\n/static/72e0e37474156b5d025228afd9ab9da1/5a190/u4.png 800w,\n/static/72e0e37474156b5d025228afd9ab9da1/c1b63/u4.png 1200w,\n/static/72e0e37474156b5d025228afd9ab9da1/aa440/u4.png 1500w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<p>La capacidad de hacer clic en el nombre se ha implementado en el componente <i>NoteList</i> de la siguiente manera:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"gatsby-highlight-code-line\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Link <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-router-dom'</span></span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">NoteList</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> notes <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>h1<span class=\"token operator\">></span>Notes<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>h1<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>Notification message<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>errorMessage<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n\n      <span class=\"token punctuation\">{</span><span class=\"token operator\">!</span>user <span class=\"token operator\">&amp;&amp;</span> <span class=\"token function\">loginForm</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n\n      <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>button onClick<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">setShowAll</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>showAll<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n          show <span class=\"token punctuation\">{</span>showAll <span class=\"token operator\">?</span> <span class=\"token string\">'important'</span> <span class=\"token operator\">:</span> <span class=\"token string\">'all'</span><span class=\"token punctuation\">}</span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>button<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>ul<span class=\"token operator\">></span>\n        <span class=\"token punctuation\">{</span>notesToShow<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">note</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span>\n          <span class=\"token operator\">&lt;</span>li key<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>note<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n<span class=\"gatsby-highlight-code-line\">            <span class=\"token operator\">&lt;</span>Link to<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">/notes/</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>note<span class=\"token punctuation\">.</span>id<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">}</span><span class=\"token operator\">></span><span class=\"token punctuation\">{</span>note<span class=\"token punctuation\">.</span>content<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span></span>          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>li<span class=\"token operator\">></span>\n        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>ul<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> NoteList</code></pre></div>\n<p>Así volvemos a utilizar <a href=\"https://reactrouter.com/api/components/Link\">Link</a>. Por ejemplo, al hacer clic en el nombre de una nota cuyo <i>id</i> es 12345, la URL del navegador se actualiza a <i>notes/12345</i>.</p>\n<p>La URL parametrizada se define en el enrutamiento dentro del componente <i>App</i> de la siguiente manera:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token operator\">&lt;</span>Router<span class=\"token operator\">></span>\n  <span class=\"token comment\">// ...</span>\n\n  <span class=\"token operator\">&lt;</span>Routes<span class=\"token operator\">></span>\n<span class=\"gatsby-highlight-code-line\">    <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/notes/:id\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span></span><span class=\"gatsby-highlight-code-line\">      <span class=\"token operator\">&lt;</span>Note notes<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>notes<span class=\"token punctuation\">}</span> toggleImportanceOf<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>toggleImportanceOf<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span></span><span class=\"gatsby-highlight-code-line\">     <span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span></span>    <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/notes\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token operator\">&lt;</span>Notes notes<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>notes<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>   \n    <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/users\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>user <span class=\"token operator\">?</span> <span class=\"token operator\">&lt;</span>Users <span class=\"token operator\">/</span><span class=\"token operator\">></span> <span class=\"token operator\">:</span> <span class=\"token operator\">&lt;</span>Navigate replace to<span class=\"token operator\">=</span><span class=\"token string\">\"/login\"</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/login\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token operator\">&lt;</span>Login onLogin<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>login<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token operator\">&lt;</span>Home <span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>      \n  <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Routes<span class=\"token operator\">></span>\n<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Router<span class=\"token operator\">></span></code></pre></div>\n<p>La ruta que representa la vista para una sola nota se define en el \"estilo Express\" marcando el parámetro de ruta con la notación <i>:id</i> de la siguiente manera:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/notes/:id\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token operator\">&lt;</span>Note notes<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>notes<span class=\"token punctuation\">}</span> <span class=\"token operator\">...</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span></code></pre></div>\n<p>Cuando el navegador navega a la URL única de una nota, por ejemplo, <i>/notes/12345</i>, se representa el componente <i>Note</i>, que ahora hemos tenido que modificar ligeramente:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"gatsby-highlight-code-line\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useParams <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-router-dom'</span></span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">Note</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> notes<span class=\"token punctuation\">,</span> toggleImportance <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">const</span> id <span class=\"token operator\">=</span> <span class=\"token function\">useParams</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>id</span><span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">const</span> note <span class=\"token operator\">=</span> notes<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">n</span> <span class=\"token operator\">=></span> n<span class=\"token punctuation\">.</span>id <span class=\"token operator\">===</span> id<span class=\"token punctuation\">)</span></span>\n  <span class=\"token keyword\">const</span> label <span class=\"token operator\">=</span> note<span class=\"token punctuation\">.</span>important <span class=\"token operator\">?</span> <span class=\"token string\">'make not important'</span> <span class=\"token operator\">:</span> <span class=\"token string\">'make important'</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>li className<span class=\"token operator\">=</span><span class=\"token string\">\"note\"</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>span<span class=\"token operator\">></span><span class=\"token punctuation\">{</span>note<span class=\"token punctuation\">.</span>content<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>span<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>button onClick<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">toggleImportance</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token operator\">></span><span class=\"token punctuation\">{</span>label<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>button<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>li<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> Note</code></pre></div>\n<p>A diferencia de antes, el componente <i>Note</i> ahora recibe todas las notas mediante la prop <i>notes</i> y puede acceder a la parte variable de la URL —en concreto, el <i>id</i> de la nota que se mostrará— mediante el hook <a href=\"https://reactrouter.com/api/hooks/useParams\">useParams</a> de React Router.</p>\n<h3>useNavigate</h3>\n<p>El backend ya admite la eliminación de notas. Para implementar esto, agreguemos un botón a la página de notas individuales en la aplicación:</p>\n<picture><img src=\"/static/586bb96506b433fa9e5a87ee666df2d7/5a190/u5.png\" srcset=\"/static/586bb96506b433fa9e5a87ee666df2d7/772e8/u5.png 200w,\n/static/586bb96506b433fa9e5a87ee666df2d7/e17e5/u5.png 400w,\n/static/586bb96506b433fa9e5a87ee666df2d7/5a190/u5.png 800w,\n/static/586bb96506b433fa9e5a87ee666df2d7/c1b63/u5.png 1200w,\n/static/586bb96506b433fa9e5a87ee666df2d7/b79a5/u5.png 1372w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<p>Agreguemos un controlador al componente <i>App</i> que realiza la eliminación y pasémoslo al componente <i>Note</i>:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">App</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">deleteNote</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">id</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span></span><span class=\"gatsby-highlight-code-line\">    noteService<span class=\"token punctuation\">.</span><span class=\"token function\">remove</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span></span><span class=\"gatsby-highlight-code-line\">      <span class=\"token function\">setNotes</span><span class=\"token punctuation\">(</span>notes<span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">n</span> <span class=\"token operator\">=></span> n<span class=\"token punctuation\">.</span>id <span class=\"token operator\">!==</span> id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></span><span class=\"gatsby-highlight-code-line\">    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></span><span class=\"gatsby-highlight-code-line\">  <span class=\"token punctuation\">}</span></span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token comment\">// ...</span>\n\n      <span class=\"token operator\">&lt;</span>Routes<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/notes/:id\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>\n          <span class=\"token operator\">&lt;</span>Note \n            notes<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>notes<span class=\"token punctuation\">}</span>\n            toggleImportanceOf<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>toggleImportanceOf<span class=\"token punctuation\">}</span>\n<span class=\"gatsby-highlight-code-line\">            deleteNote<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>deleteNote<span class=\"token punctuation\">}</span></span>          <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/notes\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>\n          <span class=\"token operator\">&lt;</span>NoteList notes<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>notes<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/create\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>\n          <span class=\"token operator\">&lt;</span>NoteForm createNote<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>addNote<span class=\"token punctuation\">}</span><span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token operator\">&lt;</span>Home <span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Routes<span class=\"token operator\">></span>\n\n      <span class=\"token operator\">&lt;</span>Footer <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Router<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>  </code></pre></div>\n<p>El componente <i>Note</i> cambia de la siguiente manera:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useParams<span class=\"token punctuation\">,</span> useNavigate <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-router-dom'</span>\n\n<span class=\"gatsby-highlight-code-line\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">Note</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> notes<span class=\"token punctuation\">,</span> toggleImportanceOf<span class=\"token punctuation\">,</span> deleteNote <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span></span>  <span class=\"token keyword\">const</span> id <span class=\"token operator\">=</span> <span class=\"token function\">useParams</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>id\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">const</span> navigate <span class=\"token operator\">=</span> <span class=\"token function\">useNavigate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></span>  <span class=\"token keyword\">const</span> note <span class=\"token operator\">=</span> notes<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">n</span> <span class=\"token operator\">=></span> n<span class=\"token punctuation\">.</span>id <span class=\"token operator\">===</span> id<span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">const</span> label <span class=\"token operator\">=</span> note<span class=\"token punctuation\">.</span>important <span class=\"token operator\">?</span> <span class=\"token string\">'make not important'</span> <span class=\"token operator\">:</span> <span class=\"token string\">'make important'</span>\n\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">handleDelete</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span></span><span class=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>window<span class=\"token punctuation\">.</span><span class=\"token function\">confirm</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Delete note \"</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>note<span class=\"token punctuation\">.</span>content<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">\"?</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></span><span class=\"gatsby-highlight-code-line\">      <span class=\"token function\">deleteNote</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span></span><span class=\"gatsby-highlight-code-line\">      <span class=\"token function\">navigate</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/notes'</span><span class=\"token punctuation\">)</span></span><span class=\"gatsby-highlight-code-line\">    <span class=\"token punctuation\">}</span></span><span class=\"gatsby-highlight-code-line\">  <span class=\"token punctuation\">}</span></span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>li className<span class=\"token operator\">=</span><span class=\"token string\">\"note\"</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>span<span class=\"token operator\">></span><span class=\"token punctuation\">{</span>note<span class=\"token punctuation\">.</span>content<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>span<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>button onClick<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">toggleImportanceOf</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token operator\">></span><span class=\"token punctuation\">{</span>label<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>button<span class=\"token operator\">></span>\n<span class=\"gatsby-highlight-code-line\">      <span class=\"token operator\">&lt;</span>button onClick<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>handleDelete<span class=\"token punctuation\">}</span><span class=\"token operator\">></span><span class=\"token keyword\">delete</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>button<span class=\"token operator\">></span></span>    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>li<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> Note</code></pre></div>\n<p>Cuando se elimina una nota, el usuario regresa a la página que enumera todas las notas. Esto se hace llamando a la función devuelta por <a href=\"https://reactrouter.com/api/components/Navigate\">useNavigate</a> de React Router con la URL deseada: <i>navigate('/notes')</i>.</p>\n<p>Las funciones <a href=\"https://reactrouter.com/api/hooks/useParams\">useParams</a> y <a href=\"https://reactrouter.com/api/components/Navigate\">useNavigate</a> de React Router son hooks, al igual que useState y useEffect, que ya hemos utilizado muchas veces. Como vimos en la parte 1, existen ciertas <a href=\"/es/part1/un_estado_mas_complejo_depurando_aplicaciones_react#reglas-de-los-hooks\">reglas</a> asociadas al uso de hooks.</p>\n<p>Modifiquemos también el componente <i>NoteForm</i> para que después de agregar una nueva nota, el usuario acceda a la página que contiene todas las notas:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span> \n<span class=\"gatsby-highlight-code-line\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useNavigate <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-router-dom'</span></span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">NoteForm</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> createNote <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>newNote<span class=\"token punctuation\">,</span> setNewNote<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span>\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">const</span> navigate <span class=\"token operator\">=</span> <span class=\"token function\">useNavigate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></span>\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">addNote</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">event</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    event<span class=\"token punctuation\">.</span><span class=\"token function\">preventDefault</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">createNote</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">content</span><span class=\"token operator\">:</span> newNote<span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">important</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"gatsby-highlight-code-line\">    <span class=\"token function\">navigate</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/notes'</span><span class=\"token punctuation\">)</span></span>    <span class=\"token function\">setNewNote</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>h2<span class=\"token operator\">></span>Create a <span class=\"token keyword\">new</span> <span class=\"token class-name\">note</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>h2<span class=\"token operator\">></span>\n\n      <span class=\"token operator\">&lt;</span>form onSubmit<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>addNote<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>input\n          value<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>newNote<span class=\"token punctuation\">}</span>\n          onChange<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token parameter\">event</span> <span class=\"token operator\">=></span> <span class=\"token function\">setNewNote</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n          placeholder<span class=\"token operator\">=</span><span class=\"token string\">\"write note content here\"</span>\n        <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>button type<span class=\"token operator\">=</span><span class=\"token string\">\"submit\"</span><span class=\"token operator\">></span>save<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>button<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>form<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3>Ruta parametrizada revisada</h3>\n<p>Hay un problema ligeramente molesto con la aplicación. El componente <em>Note</em> recibe <i>all notes</i> como props, aunque solo muestra aquella cuyo <i>id</i> coincide con la parte parametrizada de la URL:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">Note</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> notes<span class=\"token punctuation\">,</span> toggleImportance <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span> \n  <span class=\"token keyword\">const</span> id <span class=\"token operator\">=</span> <span class=\"token function\">useParams</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>id\n  <span class=\"token keyword\">const</span> note <span class=\"token operator\">=</span> notes<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">n</span> <span class=\"token operator\">=></span> n<span class=\"token punctuation\">.</span>id <span class=\"token operator\">===</span> <span class=\"token function\">Number</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>¿Sería posible modificar la aplicación para que <em>Note</em> reciba solo la nota que se mostrará como prop?</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useParams<span class=\"token punctuation\">,</span> useNavigate <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-router-dom'</span>\n\n<span class=\"gatsby-highlight-code-line\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">Note</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> note<span class=\"token punctuation\">,</span> id<span class=\"token punctuation\">,</span> toggleImportanceOf<span class=\"token punctuation\">,</span> deleteNote <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span></span>  <span class=\"token keyword\">const</span> id <span class=\"token operator\">=</span> <span class=\"token function\">useParams</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>id\n  <span class=\"token keyword\">const</span> navigate <span class=\"token operator\">=</span> <span class=\"token function\">useNavigate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token comment\">// ...</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>li className<span class=\"token operator\">=</span><span class=\"token string\">\"note\"</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>span<span class=\"token operator\">></span><span class=\"token punctuation\">{</span>note<span class=\"token punctuation\">.</span>content<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>span<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>button onClick<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">toggleImportanceOf</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token operator\">></span><span class=\"token punctuation\">{</span>label<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>button<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>button onClick<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>handleDelete<span class=\"token punctuation\">}</span><span class=\"token operator\">></span><span class=\"token keyword\">delete</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>button<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>li<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> Note</code></pre></div>\n<p>Una posibilidad es determinar dentro del componente el <i>id</i> de la nota que se mostrará mediante el hook <a href=\"https://reactrouter.com/en/main/hooks/use-match\">useMatch</a> de React Router.</p>\n<p>No es posible utilizar el hook <i>useMatch</i> en el mismo componente que define la parte enrutable de la aplicación. Movamos el componente <i>Router</i> fuera de <i>App</i>:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">ReactDOM<span class=\"token punctuation\">.</span><span class=\"token function\">createRoot</span><span class=\"token punctuation\">(</span>document<span class=\"token punctuation\">.</span><span class=\"token function\">getElementById</span><span class=\"token punctuation\">(</span><span class=\"token string\">'root'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">render</span><span class=\"token punctuation\">(</span>\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token operator\">&lt;</span>Router<span class=\"token operator\">></span></span>    <span class=\"token operator\">&lt;</span>App <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Router<span class=\"token operator\">></span></span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>El componente <i>App</i> se convierte en:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n<span class=\"gatsby-highlight-code-line\">  useMatch</span><span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-router-dom'</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">App</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">const</span> match <span class=\"token operator\">=</span> <span class=\"token function\">useMatch</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/notes/:id'</span><span class=\"token punctuation\">)</span></span><span class=\"gatsby-highlight-code-line\"></span><span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">const</span> note <span class=\"token operator\">=</span> match</span><span class=\"gatsby-highlight-code-line\">    <span class=\"token operator\">?</span> notes<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">note</span> <span class=\"token operator\">=></span> note<span class=\"token punctuation\">.</span>id <span class=\"token operator\">===</span> match<span class=\"token punctuation\">.</span>params<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">)</span></span><span class=\"gatsby-highlight-code-line\">    <span class=\"token operator\">:</span> <span class=\"token keyword\">null</span></span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Link style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>padding<span class=\"token punctuation\">}</span> to<span class=\"token operator\">=</span><span class=\"token string\">\"/\"</span><span class=\"token operator\">></span>home<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span>\n        <span class=\"token comment\">// ...</span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n\n      <span class=\"token operator\">&lt;</span>Routes<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/notes/:id\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>\n          <span class=\"token operator\">&lt;</span>Note\n<span class=\"gatsby-highlight-code-line\">            note<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>note<span class=\"token punctuation\">}</span></span>            toggleImportanceOf<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>toggleImportanceOf<span class=\"token punctuation\">}</span>\n            deleteNote<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>deleteNote<span class=\"token punctuation\">}</span>\n          <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/notes\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>\n          <span class=\"token operator\">&lt;</span>NoteList notes<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>notes<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/create\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>\n          <span class=\"token operator\">&lt;</span>NoteForm createNote<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>addNote<span class=\"token punctuation\">}</span><span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token operator\">&lt;</span>Home <span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Routes<span class=\"token operator\">></span>\n\n      <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>em<span class=\"token operator\">></span>Note app<span class=\"token punctuation\">,</span> Department <span class=\"token keyword\">of</span> Computer Science <span class=\"token number\">2026</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>em<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>    </code></pre></div>\n<p>Cada vez que se renderiza el componente <i>App</i> (lo que, en la práctica, ocurre cada vez que cambia la URL en la barra de direcciones del navegador) se ejecuta el siguiente comando</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> match <span class=\"token operator\">=</span> <span class=\"token function\">useMatch</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/notes/:id'</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Si la URL tiene el formato <em>/notes/:id</em>, es decir, corresponde a la URL de una sola nota, a la variable <i>match</i> se le asigna un objeto que puede usarse para determinar la parte parametrizada de la ruta, es decir, el <i>id</i> de la nota. Esto nos permite recuperar la nota a renderizar:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> note <span class=\"token operator\">=</span> match \n  <span class=\"token operator\">?</span> notes<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">note</span> <span class=\"token operator\">=></span> note<span class=\"token punctuation\">.</span>id <span class=\"token operator\">===</span> match<span class=\"token punctuation\">.</span>params<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">)</span>\n  <span class=\"token operator\">:</span> <span class=\"token keyword\">null</span></code></pre></div>\n<p>Todavía hay un pequeño error en nuestra aplicación. Si el navegador se recarga en una sola página de notas, se produce un error:</p>\n<picture><img src=\"/static/586bb96506b433fa9e5a87ee666df2d7/5a190/u5.png\" srcset=\"/static/586bb96506b433fa9e5a87ee666df2d7/772e8/u5.png 200w,\n/static/586bb96506b433fa9e5a87ee666df2d7/e17e5/u5.png 400w,\n/static/586bb96506b433fa9e5a87ee666df2d7/5a190/u5.png 800w,\n/static/586bb96506b433fa9e5a87ee666df2d7/c1b63/u5.png 1200w,\n/static/586bb96506b433fa9e5a87ee666df2d7/b79a5/u5.png 1372w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<p>El problema surge porque se intenta representar la página antes de que se hayan obtenido las notas del backend. Podemos resolver este problema con renderizado condicional:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">Note</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> note<span class=\"token punctuation\">,</span> toggleImportanceOf<span class=\"token punctuation\">,</span> deleteNote <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> id <span class=\"token operator\">=</span> <span class=\"token function\">useParams</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>id\n  <span class=\"token keyword\">const</span> navigate <span class=\"token operator\">=</span> <span class=\"token function\">useNavigate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>note<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></span><span class=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span></span><span class=\"gatsby-highlight-code-line\">  <span class=\"token punctuation\">}</span></span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token comment\">//...</span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>La aplicación tiene una característica más molesta: la lógica de inicio de sesión todavía está en la página que enumera las notas. Sin embargo, dejaremos la funcionalidad en este estado algo incompleto por ahora.</p>\n<p>El código actual de la aplicación está disponible en su totalidad en <a href=\"https://github.com/fullstack-hy2020/part2-notes-frontend/tree/part5-11\">GitHub</a>, en la rama <i>part5-11</i>.</p>\n</div>\n<div class=\"tasks\">\n<h3>Ejercicios 5.24–5.28.</h3>\n<h4>5.24: blogs enrutados, paso 1</h4>\n<p>Añade React Router a la aplicación de blogs para que los enlaces de la barra de navegación controlen qué vista se muestra.</p>\n<p>En la raíz de la aplicación, es decir, la ruta <em>/</em>, se muestra una lista de todos los blogs:</p>\n<picture><img src=\"/static/09c12c438413d9e05bfd9e4bee2c84b9/5a190/l1.png\" srcset=\"/static/09c12c438413d9e05bfd9e4bee2c84b9/772e8/l1.png 200w,\n/static/09c12c438413d9e05bfd9e4bee2c84b9/e17e5/l1.png 400w,\n/static/09c12c438413d9e05bfd9e4bee2c84b9/5a190/l1.png 800w,\n/static/09c12c438413d9e05bfd9e4bee2c84b9/c1b63/l1.png 1200w,\n/static/09c12c438413d9e05bfd9e4bee2c84b9/95e59/l1.png 1460w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<p>La ruta <em>/login</em> permite a los usuarios iniciar sesión</p>\n<picture><img src=\"/static/a9fabdd6738643b684137bb26348303d/5a190/l2.png\" srcset=\"/static/a9fabdd6738643b684137bb26348303d/772e8/l2.png 200w,\n/static/a9fabdd6738643b684137bb26348303d/e17e5/l2.png 400w,\n/static/a9fabdd6738643b684137bb26348303d/5a190/l2.png 800w,\n/static/a9fabdd6738643b684137bb26348303d/c1b63/l2.png 1200w,\n/static/a9fabdd6738643b684137bb26348303d/5faa8/l2.png 1444w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<p>Si el usuario ha iniciado sesión, aparece un botón de cierre de sesión en la barra de navegación:</p>\n<picture><img src=\"/static/47c6b7d5b0f63799b0373614965ae441/5a190/l3.png\" srcset=\"/static/47c6b7d5b0f63799b0373614965ae441/772e8/l3.png 200w,\n/static/47c6b7d5b0f63799b0373614965ae441/e17e5/l3.png 400w,\n/static/47c6b7d5b0f63799b0373614965ae441/5a190/l3.png 800w,\n/static/47c6b7d5b0f63799b0373614965ae441/c1b63/l3.png 1200w,\n/static/47c6b7d5b0f63799b0373614965ae441/b79a5/l3.png 1372w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<p>Después de iniciar y cerrar sesión, el usuario debe ser dirigido a la página que enumera todos los blogs.</p>\n<p>En esta etapa, todavía no necesita preocuparse por crear blogs.</p>\n<h4>5.25: blogs enrutados, paso 2</h4>\n<p>Implementa una vista que muestre la información de una única publicación del blog:</p>\n<picture><img src=\"/static/475e9e16df6f06a765d788613f64c042/5a190/l5.png\" srcset=\"/static/475e9e16df6f06a765d788613f64c042/772e8/l5.png 200w,\n/static/475e9e16df6f06a765d788613f64c042/e17e5/l5.png 400w,\n/static/475e9e16df6f06a765d788613f64c042/5a190/l5.png 800w,\n/static/475e9e16df6f06a765d788613f64c042/c1b63/l5.png 1200w,\n/static/475e9e16df6f06a765d788613f64c042/6bfbb/l5.png 1514w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<p>Los usuarios navegan a la vista de publicación de blog única desde la lista de blogs:</p>\n<picture><img src=\"/static/a9801a9bc4229b448fa3c08dea2486f6/5a190/l4.png\" srcset=\"/static/a9801a9bc4229b448fa3c08dea2486f6/772e8/l4.png 200w,\n/static/a9801a9bc4229b448fa3c08dea2486f6/e17e5/l4.png 400w,\n/static/a9801a9bc4229b448fa3c08dea2486f6/5a190/l4.png 800w,\n/static/a9801a9bc4229b448fa3c08dea2486f6/c1b63/l4.png 1200w,\n/static/a9801a9bc4229b448fa3c08dea2486f6/3ceac/l4.png 1456w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<p>¡Asegúrate de que la función \"Me gusta\" para blogs todavía funcione! También modifique la funcionalidad para que sólo los usuarios que hayan iniciado sesión puedan darle \"Me gusta\" a un blog.</p>\n<h4>5.26: blogs enrutados, paso 3</h4>\n<p>Crea una nueva vista para añadir blogs a la que puedan acceder desde la navegación los usuarios que hayan iniciado sesión:</p>\n<picture><img src=\"/static/e93ca3eba3730bca5e341905e1dd8fd1/5a190/l6.png\" srcset=\"/static/e93ca3eba3730bca5e341905e1dd8fd1/772e8/l6.png 200w,\n/static/e93ca3eba3730bca5e341905e1dd8fd1/e17e5/l6.png 400w,\n/static/e93ca3eba3730bca5e341905e1dd8fd1/5a190/l6.png 800w,\n/static/e93ca3eba3730bca5e341905e1dd8fd1/c1b63/l6.png 1200w,\n/static/e93ca3eba3730bca5e341905e1dd8fd1/a8a6f/l6.png 1516w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<p>Agregar un blog nuevo y eliminar un blog existente debería redirigir al usuario a la vista de todos los blogs.</p>\n<h4>5.27: blogs enrutados, paso 4</h4>\n<p>La usabilidad y apariencia de la aplicación ahora son mejores que antes. Desafortunadamente, algunas de las pruebas han fallado.</p>\n<p>Ahora modifique las pruebas para la vista de blog única creada en Vitest de la siguiente manera</p>\n<ul>\n<li>La información del blog y la cantidad de Me gusta se muestran a los usuarios no autenticados, los botones no se muestran</li>\n<li>A los usuarios autenticados que no son los creadores del blog se les muestra solo el botón Me gusta.</li>\n<li>Al creador del blog también se le muestra el botón de eliminar.</li>\n</ul>\n<h4>5.28: blogs enrutados, paso 5</h4>\n<p>El siguiente paso es arreglar las pruebas de un extremo a otro creadas con Playwright. Las pruebas que escribimos anteriormente no funcionan por completo y tendremos que realizarles cambios importantes.</p>\n<p>Crea pruebas para los siguientes escenarios:</p>\n<ul>\n<li>El inicio de sesión se realizó correctamente con la combinación correcta de nombre de usuario y contraseña.</li>\n<li>El inicio de sesión falla si el nombre de usuario/contraseña es incorrecto</li>\n<li>Un usuario que haya iniciado sesión puede crear un blog.</li>\n<li>A un usuario que haya iniciado sesión le pueden gustar los blogs.</li>\n<li>Un usuario que haya iniciado sesión puede eliminar un blog.</li>\n</ul>\n<p>Por lo tanto, la clasificación de blogs por Me gusta no se está probando en este momento.</p>\n</div>\n<div class=\"content\">\n<h3>Librerías de UI</h3>\n<p>En la parte 2 ya vimos dos formas de añadir estilos: mediante un <a href=\"/es/part2/agregar_estilos_a_la_aplicacion_react\">único archivo CSS</a> tradicional y mediante <a href=\"/es/part2/agregar_estilos_a_la_aplicacion_react#estilos-en-linea\">estilos en línea</a>. En esta sección veremos algunas formas más.</p>\n<p>Una forma de definir los estilos de una aplicación es utilizar un framework de UI, es decir, una librería de estilos para interfaces de usuario.</p>\n<p>El primer framework de UI que alcanzó una gran popularidad fue <a href=\"https://getbootstrap.com/\">Bootstrap</a>, desarrollado por Twitter. Durante los últimos años, los frameworks de UI han proliferado. La selección es tan amplia que ni siquiera merece la pena intentar enumerarlos todos aquí.</p>\n<p>Muchos marcos de UI incluyen temas predefinidos para aplicaciones web, así como \"componentes\", como botones, menús y tablas. El término \"componente\" está escrito entre comillas arriba porque no se refiere a lo mismo que un componente de React. La mayoría de las veces, los marcos de UI se utilizan incluyendo las hojas de estilo CSS del marco y el código JavaScript en la aplicación.</p>\n<p>Muchos marcos de UI se han adaptado a versiones compatibles con React, donde los \"componentes\" definidos por el marco de UI se han convertido en componentes de React. Por ejemplo, hay un par de versiones React de Bootstrap, la más popular de las cuales es <a href=\"https://react-bootstrap.github.io/\">React-Bootstrap</a>.</p>\n<p>En lugar de Bootstrap, veamos el que quizá sea actualmente el framework de UI más popular: la librería para React <a href=\"https://mui.com/\">Material UI</a>, que implementa el lenguaje de diseño <a href=\"https://material.io/\">Material Design</a> de Google.</p>\n<p>Instalemos la librería:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> @mui/material @emotion/react @emotion/styled</code></pre></div>\n<p>Cuando se utiliza Material UI, todo el contenido de la aplicación suele renderizarse dentro del componente <a href=\"https://mui.com/material-ui/react-container/\">Container</a>:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Container <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@mui/material'</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">App</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>Container<span class=\"token operator\">></span>\n      <span class=\"token comment\">// ...</span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Container<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h4>Tabla</h4>\n<p>Comencemos con el componente <i>NoteList</i> y rendericemos la lista de notas como una <a href=\"https://mui.com/material-ui/react-table/#simple-table\">tabla</a>, que también muestra el usuario que creó cada nota:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useState<span class=\"token punctuation\">,</span> useEffect <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Table<span class=\"token punctuation\">,</span> TableBody<span class=\"token punctuation\">,</span> TableCell<span class=\"token punctuation\">,</span> TableContainer<span class=\"token punctuation\">,</span> TableHead<span class=\"token punctuation\">,</span> TableRow<span class=\"token punctuation\">,</span> Paper <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@mui/material'</span>\n\n<span class=\"token comment\">//...</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">NoteList</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> notes <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n\n  <span class=\"token comment\">// ...</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\n      <span class=\"token comment\">// ...</span>\n      <span class=\"token operator\">&lt;</span>h2<span class=\"token operator\">></span>Notes<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>h2<span class=\"token operator\">></span>\n\n      <span class=\"token operator\">&lt;</span>TableContainer component<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>Paper<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Table<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>TableHead<span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>TableRow<span class=\"token operator\">></span>\n              <span class=\"token operator\">&lt;</span>TableCell<span class=\"token operator\">></span>content<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>TableCell<span class=\"token operator\">></span>\n              <span class=\"token operator\">&lt;</span>TableCell<span class=\"token operator\">></span>user<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>TableCell<span class=\"token operator\">></span>\n              <span class=\"token operator\">&lt;</span>TableCell<span class=\"token operator\">></span>important<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>TableCell<span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>TableRow<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>TableHead<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>TableBody<span class=\"token operator\">></span>\n            <span class=\"token punctuation\">{</span>notes<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">note</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span>\n              <span class=\"token operator\">&lt;</span>TableRow key<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>note<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span>TableCell<span class=\"token operator\">></span>\n                  <span class=\"token operator\">&lt;</span>Link to<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">/notes/</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>note<span class=\"token punctuation\">.</span>id<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n                    <span class=\"token punctuation\">{</span>note<span class=\"token punctuation\">.</span>content<span class=\"token punctuation\">}</span>\n                  <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>TableCell<span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span>TableCell<span class=\"token operator\">></span>\n                  <span class=\"token punctuation\">{</span>note<span class=\"token punctuation\">.</span>user<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">}</span>\n                <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>TableCell<span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span>TableCell<span class=\"token operator\">></span>\n                  <span class=\"token punctuation\">{</span>note<span class=\"token punctuation\">.</span>important <span class=\"token operator\">?</span> <span class=\"token string\">'yes'</span><span class=\"token operator\">:</span> <span class=\"token string\">''</span><span class=\"token punctuation\">}</span>\n                <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>TableCell<span class=\"token operator\">></span>\n              <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>TableRow<span class=\"token operator\">></span>\n            <span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>TableBody<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Table<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>TableContainer<span class=\"token operator\">></span>\n\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> NoteList</code></pre></div>\n<p>La tabla se ve así:</p>\n<picture><img src=\"/static/5bd45af3f94f9c913e86c071211bafe8/5a190/u10.png\" srcset=\"/static/5bd45af3f94f9c913e86c071211bafe8/772e8/u10.png 200w,\n/static/5bd45af3f94f9c913e86c071211bafe8/e17e5/u10.png 400w,\n/static/5bd45af3f94f9c913e86c071211bafe8/5a190/u10.png 800w,\n/static/5bd45af3f94f9c913e86c071211bafe8/c1b63/u10.png 1200w,\n/static/5bd45af3f94f9c913e86c071211bafe8/29007/u10.png 1600w,\n/static/5bd45af3f94f9c913e86c071211bafe8/b4904/u10.png 1768w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<h4>Formulario</h4>\n<p>A continuación, mejoremos la vista para crear una nueva nota <i>NoteForm</i> usando los componentes <a href=\"https://mui.com/components/text-fields/\">TextField</a> y <a href=\"https://mui.com/api/button/\">Button</a>:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> TextField<span class=\"token punctuation\">,</span> Button <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@mui/material'</span>\n\n<span class=\"token comment\">// ...</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">NoteForm</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> createNote <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>h2<span class=\"token operator\">></span>Create a <span class=\"token keyword\">new</span> <span class=\"token class-name\">note</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>h2<span class=\"token operator\">></span>\n\n      <span class=\"token operator\">&lt;</span>form onSubmit<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>addNote<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>TextField\n          label<span class=\"token operator\">=</span><span class=\"token string\">\"note content\"</span>\n          value<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>newNote<span class=\"token punctuation\">}</span>\n          onChange<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token parameter\">event</span> <span class=\"token operator\">=></span> <span class=\"token function\">setNewNote</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n        <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>Button type<span class=\"token operator\">=</span><span class=\"token string\">\"submit\"</span> variant<span class=\"token operator\">=</span><span class=\"token string\">\"contained\"</span> style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">marginTop</span><span class=\"token operator\">:</span> <span class=\"token number\">10</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n            save\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Button<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>form<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> NoteForm</code></pre></div>\n<p>El resultado es elegante:</p>\n<picture><img src=\"/static/bf49f791a37210df145fe952c6bf5d6b/5a190/u11.png\" srcset=\"/static/bf49f791a37210df145fe952c6bf5d6b/772e8/u11.png 200w,\n/static/bf49f791a37210df145fe952c6bf5d6b/e17e5/u11.png 400w,\n/static/bf49f791a37210df145fe952c6bf5d6b/5a190/u11.png 800w,\n/static/bf49f791a37210df145fe952c6bf5d6b/c1b63/u11.png 1200w,\n/static/bf49f791a37210df145fe952c6bf5d6b/6bfbb/u11.png 1514w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<h4>Notificaciones</h4>\n<p>Mejoremos el componente de notificación mediante el componente <a href=\"https://mui.com/material-ui/react-alert/\">Alert</a> de Material UI:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Alert <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@mui/material'</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">Notification</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> notification <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>notification <span class=\"token operator\">===</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>Alert style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">marginTop</span><span class=\"token operator\">:</span> <span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">marginBottom</span><span class=\"token operator\">:</span> <span class=\"token number\">10</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span> severity<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>notification<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n      <span class=\"token punctuation\">{</span>notification<span class=\"token punctuation\">.</span>text<span class=\"token punctuation\">}</span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Alert<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> Notification</code></pre></div>\n<p>Mueva el componente de notificación y su gestión de estado al componente <i>App</i>:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">App</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>notes<span class=\"token punctuation\">,</span> setNotes<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>notification<span class=\"token punctuation\">,</span> setNotification<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span></span>\n  <span class=\"token comment\">// ...</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">addNote</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">noteObject</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    noteService<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>noteObject<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">returnedNote</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">setNotes</span><span class=\"token punctuation\">(</span>notes<span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>returnedNote<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"gatsby-highlight-code-line\">      <span class=\"token function\">setNotification</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">text</span><span class=\"token operator\">:</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Note '</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>returnedNote<span class=\"token punctuation\">.</span>content<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">' added!</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">type</span><span class=\"token operator\">:</span> <span class=\"token string\">'success'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></span>      <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">setNotification</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5000</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>Container<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Link style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>padding<span class=\"token punctuation\">}</span> to<span class=\"token operator\">=</span><span class=\"token string\">\"/\"</span><span class=\"token operator\">></span>home<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Link style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>padding<span class=\"token punctuation\">}</span> to<span class=\"token operator\">=</span><span class=\"token string\">\"/notes\"</span><span class=\"token operator\">></span>notes<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Link style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>padding<span class=\"token punctuation\">}</span> to<span class=\"token operator\">=</span><span class=\"token string\">\"/create\"</span><span class=\"token operator\">></span><span class=\"token keyword\">new</span> <span class=\"token class-name\">note</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n\n<span class=\"gatsby-highlight-code-line\">      <span class=\"token operator\">&lt;</span>Notification notification<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>notification<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span></span>\n      <span class=\"token operator\">&lt;</span>Routes<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/notes/:id\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>\n          <span class=\"token operator\">&lt;</span>Note\n            note<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>note<span class=\"token punctuation\">}</span>\n            toggleImportanceOf<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>toggleImportanceOf<span class=\"token punctuation\">}</span>\n            deleteNote<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>deleteNote<span class=\"token punctuation\">}</span>\n          <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/notes\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>\n          <span class=\"token operator\">&lt;</span>NoteList notes<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>notes<span class=\"token punctuation\">}</span> setNotification<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>setNotification<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/create\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>\n          <span class=\"token operator\">&lt;</span>NoteForm createNote<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>addNote<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token operator\">&lt;</span>Home <span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Routes<span class=\"token operator\">></span>\n\n      <span class=\"token operator\">&lt;</span>Footer <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Container<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Alert tiene un diseño elegante:</p>\n<picture><img src=\"/static/993765434743dbe084555f59c001eda1/5a190/u12.png\" srcset=\"/static/993765434743dbe084555f59c001eda1/772e8/u12.png 200w,\n/static/993765434743dbe084555f59c001eda1/e17e5/u12.png 400w,\n/static/993765434743dbe084555f59c001eda1/5a190/u12.png 800w,\n/static/993765434743dbe084555f59c001eda1/c1b63/u12.png 1200w,\n/static/993765434743dbe084555f59c001eda1/29007/u12.png 1600w,\n/static/993765434743dbe084555f59c001eda1/74e37/u12.png 1732w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<h4>Menú de navegación</h4>\n<p>El menú de navegación se implementa utilizando el componente <a href=\"https://mui.com/components/app-bar/\">AppBar</a>.</p>\n<p>Si aplicamos el ejemplo de la documentación directamente</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token operator\">&lt;</span>AppBar position<span class=\"token operator\">=</span><span class=\"token string\">\"static\"</span><span class=\"token operator\">></span>\n  <span class=\"token operator\">&lt;</span>Toolbar<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>Button color<span class=\"token operator\">=</span><span class=\"token string\">\"inherit\"</span><span class=\"token operator\">></span><span class=\"token operator\">&lt;</span>Link to<span class=\"token operator\">=</span><span class=\"token string\">\"/\"</span><span class=\"token operator\">></span>home<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Button<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>Button color<span class=\"token operator\">=</span><span class=\"token string\">\"inherit\"</span><span class=\"token operator\">></span><span class=\"token operator\">&lt;</span>Link to<span class=\"token operator\">=</span><span class=\"token string\">\"/notes\"</span><span class=\"token operator\">></span>notes<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Button<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>Button color<span class=\"token operator\">=</span><span class=\"token string\">\"inherit\"</span><span class=\"token operator\">></span><span class=\"token operator\">&lt;</span>Link to<span class=\"token operator\">=</span><span class=\"token string\">\"/create\"</span><span class=\"token operator\">></span><span class=\"token keyword\">new</span> <span class=\"token class-name\">note</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Button<span class=\"token operator\">></span>\n  <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Toolbar<span class=\"token operator\">></span>\n<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>AppBar<span class=\"token operator\">></span></code></pre></div>\n<p>Esto proporciona una solución funcional, pero su apariencia no es la mejor posible:</p>\n<picture><img src=\"/static/2979158deece16be23796cedd29287d2/5a190/u15.png\" srcset=\"/static/2979158deece16be23796cedd29287d2/772e8/u15.png 200w,\n/static/2979158deece16be23796cedd29287d2/e17e5/u15.png 400w,\n/static/2979158deece16be23796cedd29287d2/5a190/u15.png 800w,\n/static/2979158deece16be23796cedd29287d2/c1b63/u15.png 1200w,\n/static/2979158deece16be23796cedd29287d2/29007/u15.png 1600w,\n/static/2979158deece16be23796cedd29287d2/bf8c1/u15.png 1722w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<p>En la <a href=\"https://mui.com/material-ui/guides/composition/#routing-libraries\">documentación</a> encontramos una alternativa mejor: la <a href=\"https://mui.com/material-ui/guides/composition/#component-prop\">prop component</a>, que permite cambiar cómo se renderiza el elemento raíz de un componente de Material UI.</p>\n<p>Al definir</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token operator\">&lt;</span>Button color<span class=\"token operator\">=</span><span class=\"token string\">\"inherit\"</span> component<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>Link<span class=\"token punctuation\">}</span> to<span class=\"token operator\">=</span><span class=\"token string\">\"/\"</span><span class=\"token operator\">></span>\n  home\n<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Button<span class=\"token operator\">></span></code></pre></div>\n<p>El componente <i>Button</i> se renderiza usando como raíz el componente <i>Link</i> de <i>react-router-dom</i>, al que se pasa la prop <i>to</i> que especifica la ruta.</p>\n<p>El código completo para la barra de navegación es el siguiente</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token operator\">&lt;</span>AppBar position<span class=\"token operator\">=</span><span class=\"token string\">\"static\"</span><span class=\"token operator\">></span>\n  <span class=\"token operator\">&lt;</span>Toolbar<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>Button color<span class=\"token operator\">=</span><span class=\"token string\">\"inherit\"</span> component<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>Link<span class=\"token punctuation\">}</span> to<span class=\"token operator\">=</span><span class=\"token string\">\"/\"</span><span class=\"token operator\">></span>home<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Button<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>Button color<span class=\"token operator\">=</span><span class=\"token string\">\"inherit\"</span> component<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>Link<span class=\"token punctuation\">}</span> to<span class=\"token operator\">=</span><span class=\"token string\">\"/notes\"</span><span class=\"token operator\">></span>notes<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Button<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>Button color<span class=\"token operator\">=</span><span class=\"token string\">\"inherit\"</span> component<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>Link<span class=\"token punctuation\">}</span> to<span class=\"token operator\">=</span><span class=\"token string\">\"/create\"</span><span class=\"token operator\">></span><span class=\"token keyword\">new</span> <span class=\"token class-name\">note</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Button<span class=\"token operator\">></span>\n  <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Toolbar<span class=\"token operator\">></span>\n<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>AppBar<span class=\"token operator\">></span></code></pre></div>\n<p>y el resultado se ve tal como queremos:</p>\n<picture><img src=\"/static/d463048fbbf7c51f804519bfcb186ccb/5a190/u16.png\" srcset=\"/static/d463048fbbf7c51f804519bfcb186ccb/772e8/u16.png 200w,\n/static/d463048fbbf7c51f804519bfcb186ccb/e17e5/u16.png 400w,\n/static/d463048fbbf7c51f804519bfcb186ccb/5a190/u16.png 800w,\n/static/d463048fbbf7c51f804519bfcb186ccb/c1b63/u16.png 1200w,\n/static/d463048fbbf7c51f804519bfcb186ccb/29007/u16.png 1600w,\n/static/d463048fbbf7c51f804519bfcb186ccb/6c86f/u16.png 1720w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<p>Sin embargo, notamos que cuando se mueve el mouse sobre la barra de navegación, el indicador de desplazamiento es demasiado sutil. Arreglemos esto definiendo un color de fondo ligeramente mejor para estas situaciones:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> style <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">'&amp;:hover'</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">bgcolor</span><span class=\"token operator\">:</span> <span class=\"token string\">'rgba(255,255,255,0.3)'</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n  <span class=\"token operator\">&lt;</span>Container<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>AppBar position<span class=\"token operator\">=</span><span class=\"token string\">\"static\"</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>Toolbar<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Button color<span class=\"token operator\">=</span><span class=\"token string\">\"inherit\"</span> component<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>Link<span class=\"token punctuation\">}</span> to<span class=\"token operator\">=</span><span class=\"token string\">\"/\"</span> sx<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>style<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n          home\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Button<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Button color<span class=\"token operator\">=</span><span class=\"token string\">\"inherit\"</span> component<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>Link<span class=\"token punctuation\">}</span> to<span class=\"token operator\">=</span><span class=\"token string\">\"/notes\"</span> sx<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>style<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n          notes\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Button<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Button color<span class=\"token operator\">=</span><span class=\"token string\">\"inherit\"</span> component<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>Link<span class=\"token punctuation\">}</span> to<span class=\"token operator\">=</span><span class=\"token string\">\"/create\"</span> sx<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>style<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n          <span class=\"token keyword\">new</span> <span class=\"token class-name\">note</span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Button<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Toolbar<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>AppBar<span class=\"token operator\">></span>\n\n    <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">)</span></code></pre></div>\n<p>Finalmente estamos satisfechos:</p>\n<picture><img src=\"/static/dee38980eebccdb6f3bb5bf841a7cf50/5a190/u17.png\" srcset=\"/static/dee38980eebccdb6f3bb5bf841a7cf50/772e8/u17.png 200w,\n/static/dee38980eebccdb6f3bb5bf841a7cf50/e17e5/u17.png 400w,\n/static/dee38980eebccdb6f3bb5bf841a7cf50/5a190/u17.png 800w,\n/static/dee38980eebccdb6f3bb5bf841a7cf50/c1b63/u17.png 1200w,\n/static/dee38980eebccdb6f3bb5bf841a7cf50/29007/u17.png 1600w,\n/static/dee38980eebccdb6f3bb5bf841a7cf50/9c1e6/u17.png 1734w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<p>El código actual de la aplicación está disponible en su totalidad en <a href=\"https://github.com/fullstack-hy2020/part2-notes-frontend/tree/part5-12\">GitHub</a>, en la rama <i>part5-12</i>.</p>\n<h3>Styled Components</h3>\n<p>Además de lo que ya hemos visto, existen <a href=\"https://blog.bitsrc.io/5-ways-to-style-react-components-in-2019-30f1ccc2b5b\">otras formas</a> de aplicar estilos a una aplicación React.</p>\n<p>La librería <a href=\"https://www.styled-components.com/\">styled-components</a>, que utiliza la sintaxis <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals\">literal de plantilla etiquetada</a> de ES6, ofrece un enfoque interesante para definir estilos.</p>\n<p><a href=\"https://styled-components.com/docs/basics#installation\">Instalemos</a> Styled Components y utilicémoslo para realizar algunos cambios de estilo en la aplicación de notas (la versión anterior a la instalación de Material UI). Primero, creemos dos definiciones de estilo para los componentes que usaremos:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> styled <span class=\"token keyword\">from</span> <span class=\"token string\">'styled-components'</span>\n\n<span class=\"token keyword\">const</span> Button <span class=\"token operator\">=</span> styled<span class=\"token punctuation\">.</span>button<span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\n  background: Bisque;\n  font-size: 1em;\n  margin: 1em;\n  padding: 0.25em 1em;\n  border: 2px solid Chocolate;\n  border-radius: 3px;\n</span><span class=\"token template-punctuation string\">`</span></span>\n\n<span class=\"token keyword\">const</span> Input <span class=\"token operator\">=</span> styled<span class=\"token punctuation\">.</span>input<span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\n  margin: 0.25em;\n  width: 300px;  \n</span><span class=\"token template-punctuation string\">`</span></span></code></pre></div>\n<p>El código crea versiones de los elementos HTML <i>button</i> y <i>input</i> con estilo y los asigna a las variables <i>Button</i> y <i>Input</i>.</p>\n<p>La sintaxis para definir estilos es bastante interesante, ya que las definiciones CSS se colocan entre comillas invertidas. Esta es la sintaxis de los <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals\">literales de plantilla etiquetados</a> de ES6.</p>\n<p>Los componentes definidos funcionan como elementos normales <i>button</i> y <i>input</i>, y se utilizan en la aplicación de la forma habitual:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">NoteForm</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> createNote <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>h2<span class=\"token operator\">></span>Create a <span class=\"token keyword\">new</span> <span class=\"token class-name\">note</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>h2<span class=\"token operator\">></span>\n\n      <span class=\"token operator\">&lt;</span>form onSubmit<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>addNote<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n<span class=\"gatsby-highlight-code-line\">        <span class=\"token operator\">&lt;</span>Input<span class=\"token operator\">></span></span>          value<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>newNote<span class=\"token punctuation\">}</span>\n          onChange<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token parameter\">event</span> <span class=\"token operator\">=></span> <span class=\"token function\">setNewNote</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n          placeholder<span class=\"token operator\">=</span><span class=\"token string\">\"write note content here\"</span>\n        <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n<span class=\"gatsby-highlight-code-line\">        <span class=\"token operator\">&lt;</span>Button type<span class=\"token operator\">=</span><span class=\"token string\">\"submit\"</span><span class=\"token operator\">></span>save<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Button<span class=\"token operator\">></span></span>      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>form<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>El formulario ahora se ve así:</p>\n<picture><img src=\"/static/80b632626bdf9435cbb2453d6afda963/5a190/u20.png\" srcset=\"/static/80b632626bdf9435cbb2453d6afda963/772e8/u20.png 200w,\n/static/80b632626bdf9435cbb2453d6afda963/e17e5/u20.png 400w,\n/static/80b632626bdf9435cbb2453d6afda963/5a190/u20.png 800w,\n/static/80b632626bdf9435cbb2453d6afda963/c1b63/u20.png 1200w,\n/static/80b632626bdf9435cbb2453d6afda963/c4451/u20.png 1450w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<p>Definamos los siguientes componentes para agregar estilos, todos los cuales son versiones mejoradas de los elementos <i>div</i>:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> Page <span class=\"token operator\">=</span> styled<span class=\"token punctuation\">.</span>div<span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\n  padding: 1em;\n  background: papayawhip;\n</span><span class=\"token template-punctuation string\">`</span></span>\n\n<span class=\"token keyword\">const</span> Navigation <span class=\"token operator\">=</span> styled<span class=\"token punctuation\">.</span>div<span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\n  background: BurlyWood;\n  padding: 1em;\n</span><span class=\"token template-punctuation string\">`</span></span>\n\n<span class=\"token keyword\">const</span> Footer <span class=\"token operator\">=</span> styled<span class=\"token punctuation\">.</span>div<span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\n  background: Chocolate;\n  padding: 1em;\n  margin-top: 1em;\n</span><span class=\"token template-punctuation string\">`</span></span></code></pre></div>\n<p>Los nuevos componentes ahora se pueden utilizar en la aplicación:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">App</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n<span class=\"gatsby-highlight-code-line\">    <span class=\"token operator\">&lt;</span>Page<span class=\"token operator\">></span></span><span class=\"gatsby-highlight-code-line\">      <span class=\"token operator\">&lt;</span>Navigation<span class=\"token operator\">></span></span>        <span class=\"token operator\">&lt;</span>Link style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>padding<span class=\"token punctuation\">}</span> to<span class=\"token operator\">=</span><span class=\"token string\">\"/\"</span><span class=\"token operator\">></span>home<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Link style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>padding<span class=\"token punctuation\">}</span> to<span class=\"token operator\">=</span><span class=\"token string\">\"/notes\"</span><span class=\"token operator\">></span>notes<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Link style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>padding<span class=\"token punctuation\">}</span> to<span class=\"token operator\">=</span><span class=\"token string\">\"/create\"</span><span class=\"token operator\">></span><span class=\"token keyword\">new</span> <span class=\"token class-name\">note</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span>\n<span class=\"gatsby-highlight-code-line\">      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Navigation<span class=\"token operator\">></span></span>\n      <span class=\"token operator\">&lt;</span>Routes<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/notes/:id\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>\n          <span class=\"token operator\">&lt;</span>Note\n            note<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>note<span class=\"token punctuation\">}</span>\n            toggleImportanceOf<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>toggleImportanceOf<span class=\"token punctuation\">}</span>\n            deleteNote<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>deleteNote<span class=\"token punctuation\">}</span>\n          <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/notes\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>\n          <span class=\"token operator\">&lt;</span>NoteList notes<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>notes<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/create\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>\n          <span class=\"token operator\">&lt;</span>NoteForm createNote<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>addNote<span class=\"token punctuation\">}</span><span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">\"/\"</span> element<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token operator\">&lt;</span>Home <span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Routes<span class=\"token operator\">></span>\n<span class=\"gatsby-highlight-code-line\">      <span class=\"token operator\">&lt;</span>Footer<span class=\"token operator\">></span></span><span class=\"gatsby-highlight-code-line\">         Note app<span class=\"token punctuation\">,</span> Department <span class=\"token keyword\">of</span> Computer Science<span class=\"token punctuation\">,</span> University <span class=\"token keyword\">of</span> Helsinki <span class=\"token number\">2026</span></span><span class=\"gatsby-highlight-code-line\">      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Footer<span class=\"token operator\">></span></span><span class=\"gatsby-highlight-code-line\">    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Page<span class=\"token operator\">></span></span>  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>El resultado final es el siguiente:</p>\n<picture><img src=\"/static/3ba1bf67492548f6d726a37c1f42b580/5a190/u21.png\" srcset=\"/static/3ba1bf67492548f6d726a37c1f42b580/772e8/u21.png 200w,\n/static/3ba1bf67492548f6d726a37c1f42b580/e17e5/u21.png 400w,\n/static/3ba1bf67492548f6d726a37c1f42b580/5a190/u21.png 800w,\n/static/3ba1bf67492548f6d726a37c1f42b580/c1b63/u21.png 1200w,\n/static/3ba1bf67492548f6d726a37c1f42b580/29007/u21.png 1600w,\n/static/3ba1bf67492548f6d726a37c1f42b580/50e7d/u21.png 1738w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<p>Styled-Components ha ido ganando popularidad últimamente y actualmente parece que mucha gente lo considera la mejor manera de definir estilos para aplicaciones React.</p>\n</div>\n<div class=\"tasks\">\n<h3>Ejercicios 5.29–5.31</h3>\n<p>A continuación, mejora los estilos de la aplicación de blogs utilizando Material UI o Styled Components.</p>\n<h4>5.29: blogs con estilo, paso 1</h4>\n<p>Añade estilos a los formularios de la aplicación.</p>\n<p>Su solución podría verse así. Formulario de inicio de sesión:</p>\n<picture><img src=\"/static/173ea24029e22354e1a619bc5deb00cf/5a190/l10.png\" srcset=\"/static/173ea24029e22354e1a619bc5deb00cf/772e8/l10.png 200w,\n/static/173ea24029e22354e1a619bc5deb00cf/e17e5/l10.png 400w,\n/static/173ea24029e22354e1a619bc5deb00cf/5a190/l10.png 800w,\n/static/173ea24029e22354e1a619bc5deb00cf/c1b63/l10.png 1200w,\n/static/173ea24029e22354e1a619bc5deb00cf/7db30/l10.png 1494w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<p>Creando un nuevo blog:</p>\n<picture><img src=\"/static/dba732efe3e232ff5427cd0fcb27abc4/5a190/l11.png\" srcset=\"/static/dba732efe3e232ff5427cd0fcb27abc4/772e8/l11.png 200w,\n/static/dba732efe3e232ff5427cd0fcb27abc4/e17e5/l11.png 400w,\n/static/dba732efe3e232ff5427cd0fcb27abc4/5a190/l11.png 800w,\n/static/dba732efe3e232ff5427cd0fcb27abc4/c1b63/l11.png 1200w,\n/static/dba732efe3e232ff5427cd0fcb27abc4/29007/l11.png 1600w,\n/static/dba732efe3e232ff5427cd0fcb27abc4/d3b46/l11.png 1690w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<h4>5.30: blogs con estilo, paso 2</h4>\n<p>Ahora diseña la barra de navegación de la aplicación y el componente que muestra las notificaciones. El resultado podría verse así:</p>\n<picture><img src=\"/static/4f9c284905af0714ef2e82db7d7f58ea/5a190/l12.png\" srcset=\"/static/4f9c284905af0714ef2e82db7d7f58ea/772e8/l12.png 200w,\n/static/4f9c284905af0714ef2e82db7d7f58ea/e17e5/l12.png 400w,\n/static/4f9c284905af0714ef2e82db7d7f58ea/5a190/l12.png 800w,\n/static/4f9c284905af0714ef2e82db7d7f58ea/c1b63/l12.png 1200w,\n/static/4f9c284905af0714ef2e82db7d7f58ea/67a79/l12.png 1408w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<h4>5.31: blogs con estilo, paso 3</h4>\n<p>Personaliza como prefieras la apariencia del componente que muestra un único blog. Este es un ejemplo:</p>\n<picture><img src=\"/static/370ca38d49065cab0f29cc2f8f765233/5a190/l14.png\" srcset=\"/static/370ca38d49065cab0f29cc2f8f765233/772e8/l14.png 200w,\n/static/370ca38d49065cab0f29cc2f8f765233/e17e5/l14.png 400w,\n/static/370ca38d49065cab0f29cc2f8f765233/5a190/l14.png 800w,\n/static/370ca38d49065cab0f29cc2f8f765233/c1b63/l14.png 1200w,\n/static/370ca38d49065cab0f29cc2f8f765233/53639/l14.png 1358w\" sizes=\"(max-width: 800px) 100vw, 800px\"></picture>\n<p>Este fue el último ejercicio de la sección; es hora de enviar el código a GitHub y marcar los ejercicios completados en el <a href=\"https://studies.cs.helsinki.fi/stats/courses/fullstackopen\">sistema de envío de ejercicios</a>.</p>\n</div>","frontmatter":{"mainImage":{"publicURL":"/static/b92f84fe9702a35b12f10af4588ba4c2/part-5.svg"},"part":5,"letter":"e","lang":"es"}}},"pageContext":{"part":5,"letter":"e","lang":"es"}},"staticQueryHashes":["3128451518"]}