DEV Community

Cover image for #CienDiasConCourseIt: Día 8/100
Javier Rodriguez
Javier Rodriguez

Posted on

#CienDiasConCourseIt: Día 8/100

Componentes: concepto e imports/exports entre componentes

Resumen:

Empezando a tocar mano, vamos a ver componentes y haremos uno de muchos. Esta va a ser la primera vez que veamos el gran potencial que tiene React sobre componentización. Falta bastante por ver, pero ya podemos ir haciendo algo (un portfolio 😎)

Podrás ver la lista de los 100 días en este enlace.


Componentes

Los componentes son bloques de código reutilizables que tienen que cumplir con tres requisitos:

  • Tienen que poder representarse a si mismo
  • Tiene que tener la capacidad de manejar su estado interno en caso de tenerlo
  • Tiene que tener la capacidad de recibir propiedades inmutables (props)

Los componentes que no contienen la capacidad de manejar su estado interno, se los conocen como Dumb o Stateless. Los que si pueden manejar su estado interno, se los conocen como Smart o Statefull.
Un ejemplo de un componente smart es el botón de "favoritos" de alguna aplicación. Eso es un estado interno.

Vamos a crear una post genérico de un blog (título y descripción):
Utilizando el proyecto creado del día anterior (o creando uno nuevo), vamos a editar el App.js para que solo retorne un div:

function App() {
  return (
    <div>
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

Luego, vamos a crear una carpeta llamada components dentro de la carpeta src. A dentro, vamos a crear otra carpeta Blog. Por convención, se crea una carpeta principal components y el nombre de los componentes en CamelCase.
Dentro de la carpeta Blog, vamos a crear un archivo llamado index.js:

import React from 'react';

function Blog(){
    return(
        ...
    )
}

export default Blog;
Enter fullscreen mode Exit fullscreen mode

Por defecto, se crea siempre este tipo estructura en cada componente. Siempre importaremos React para obtener todas sus funcionalidades y lo exportaremos. La función siempre debe tener el nombre del componente.

Ahora, procederemos a crear una entrada de Blog:

import React from 'react';

function Blog(){
    return(
        <section>
            <h3>Titulo copado</h3>
            <p>Parrafo copado</p>
        </section>
    );
}

export default Blog;
Enter fullscreen mode Exit fullscreen mode

Debemos llamar desde App al componente Blog:

import React from 'react';
import Blog from './components/Blog/index.js';
import './App.css';

function App() {
  return (
    <div>
      <Blog />
    </div>
  );
}

export default App;
Enter fullscreen mode Exit fullscreen mode

En la segunda linea, importamos el componente (como el archivo se llama index.js, se puede omitir y escribir menos). Dentro del div, ponemos nuestro componente como si fuera una etiqueta de HTML.
Si probamos ahora ejecutando npm start (dentro de la carpeta de la app!), veremos nuestro componente creado.

Lo maravilloso de esto, es que pueden repetir el componente la cantidad que quieran:

function App() {
  return (
    <div>
      <Blog />
      <Blog />
      <Blog />
      <Blog />
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

Volviendo a tener solo un componente, vamos a poder crear otros componentes: uno para el título y otro para el párrafo.
Para el titulo, dentro de la carpeta components, creamos otra carpeta llamda Title con un archivo llamado index.js. Codeamos de la misma forma que con index.js de Blog así:

import React from 'react';

function Title(){
    return(
        <h3>Titulo copado</h3>
    );
}

export default Title;
Enter fullscreen mode Exit fullscreen mode

En index.js de Blog, importamos el componente y escribimos su etiqueta:

import React from 'react';
import Title from '../Title'

function Blog(){
    return(
        <section>
            <Title />
            <p>Parrafo copado</p>
        </section>
    );
}

export default Blog;
Enter fullscreen mode Exit fullscreen mode

De la misma forma, crearemos un componente Text y su archivo index.js para nuestro párrafo. Después importamos el componente en index.js de Blog y creamos la etiqueta.

Práctica

Para acompañar el aprendizaje, voy a hacer un portfolio (obvio que para mí).
Con esto que sabemos hasta ahora, podemos hacer dos partes del portfolio: navbar y sección de proyectos. Por ahora solo crearemos los componentes y luego de terminar de aprender React, le daremos estilo y usaremos algunas librerías para darle un poco de animaciones. Después veremos como desployar la app.

Armé esta estructura en base a lo que aprendí hoy:
Alt Text
Entonces, tenemos los siguientes códigos:

  • En App.js
import Nav from './components/Nav';
import Projects from './components/Projects';

function App() {
  return (
    <div>
      <Nav />
      <Projects />
    </div>
  );
}

export default App;
Enter fullscreen mode Exit fullscreen mode
  • En index.js de Nav:
import React from 'react';
import Menu from '../Menu/'

function Nav() {
  return (
    <div>
        <Menu />
        <Menu />
        <Menu />
        <Menu />
        <Menu />
    </div>
  );
}

export default Nav;
Enter fullscreen mode Exit fullscreen mode
  • En index.js de Menu:
import React from 'react';

function Menu() {
  return (
    <a>
        MenuN
    </a>
  );
}

export default Menu;
Enter fullscreen mode Exit fullscreen mode
  • En index.js de Projects:
import React from 'react';
import Card from '../Card/';

function Projects() {
  return (
    <section>
        <Card />
        <Card />
        <Card />
        <Card />
    </section>
  );
}

export default Projects;
Enter fullscreen mode Exit fullscreen mode
  • En index.js de Card:
import React from 'react';

function Nav() {
  return (
    <div>
        <figure>
            Foto
        </figure>
        <h2>Titulo</h2>
        <p>Descripción</p>
        <h3>Tecnologías</h3>
        <figure>
            Imagenes copadas
        </figure>
    </div>
  );
}

export default Nav;
Enter fullscreen mode Exit fullscreen mode
  • Le damos un poco de estilo al componente Card para poder visualizar un poco mejor. Esto lo hacemos desde src en index.css:
section{
  display: flex;
}

section div{
  text-align: center;
  border: 1px solid red;
  margin: 1rem;
}
Enter fullscreen mode Exit fullscreen mode

Y tenemos esto!
Alt Text

Más adelante, mejoraremos esto para poder agregar enlaces e imagenes.


Día 8/100

Top comments (0)