No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Convierte tus certificados en títulos universitarios en USA

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

16 Días
10 Hrs
30 Min
9 Seg
Curso de React.js

Curso de React.js

Juan David Castro Gallego

Juan David Castro Gallego

Componentes de TODO Machine

3/34
Recursos

Aportes 118

Preguntas 12

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Excelente que se muestre al principio lo que vamos a hacer. Me solia pasar que duraba toda la clase sin entender que haciamos y eso obligaba a tener que ver la clase más de una vez. Se nota que Juan escucha a los estudiantes e implementa esas mejoras.

Yo cree solita pausando el video todos los archivos con los componentes 😄

Dejo mi aporte:

Clase 3 Componentes de TODO Machine

Lo primero en hacer es eliminar los elementos del componente App.js, dejandolo con la siguiente estructura:

import React from 'react'
import logo from './platzi.webp';
import './App.css';

function App() {
  return (
    <div className="App">
    <TodoItem />
    <TodoItem />
    <TodoItem />
      
    </div>
  );
};
function TodoItem() {
  return (
    <li>
      <span>V</span>
      <p>Llorar con la Lorona</p>
      <span>X</span>
    </li>
  );
}

export default App;

Ahora debajo del div, agregamos un componente <TodoCounter />
<TodoSearch /> y luego agregamos un contenedor de los `` llamandolo

  <TodoItem />
  <TodoItem />
  <TodoItem />
<TodoList/>

Luego al final agregamos el boton <CreateTodoButton />.
Ahora toca crear los componentes que fuimos construyendo (En el caso de tener el error por React debemos importarlo también se puede usar el shorcout imr ojo que necesita tener la extensión de react):

Componente TodoCounter

import React from 'react'

function TodoCounter() {
  return (
    <h1>Haz completado 3 de 5 TODOS</h1>
  );
}

export { TodoCounter };

Componente TodoList

En el caso de este componente enviamos las propiedades o prop's para ir renderizando los TODO’s

import React from 'react'

function TodoList(props) {
  return (
    <ul>
      {props.children}
    </ul>
  )
}

export { TodoList };

Componente Todo Search

import React from 'react'

function TodoSearch() {
  return (
    <input placeholder="Buscar..." />
  )
}

export { TodoSearch };

Componente TodoItem

Este componente lo separamos del componente App.js

import React from "react";

function TodoItem() {
  return (
    <li>
      <span>V</span>
      <p>Llorar con la Lorona</p>
      <span>X</span>
    </li>
  );
}

export { TodoItem };

Componente TodoButton

import React from "react";

function CreateTodoButton() {
  return <button>+</button>;
}

export { CreateTodoButton };

Componente App Final

import React from "react";
import { TodoCounter } from "./TodoCounter";
import { TodoSearch } from "./TodoSearch";
import { TodoList } from "./TodoList";
import { TodoItem } from "./TodoItem";
import { CreateTodoButton } from "./CreateTodoButton";
import "./App.css";

function App() {
  return (
    <div className="App">
      <TodoCounter />
      <TodoSearch />

      <TodoList>
        <TodoItem />
        <TodoItem />
        <TodoItem />
      </TodoList>

      <CreateTodoButton />
    </div>
  );
}


export default App;

Pueden saber cuales son los atajos de su teclado para VSCode presionando : “CTRL + SHIFT + P” o “CMD + SHIFT + P”, y en la barra de busqueda que les aparece arriba, escribir Shortcuts. Al primer resultado le dan enter y los manda a un HTML con los atajos para su sistema.

El profe:
-Yeah, felicitaciones.
F A L T A T O D O L O D E M Á S 🤗

Particularmente cree un sistema de carpetas en este caso una llamada Components donde he alojado todas las funciones creadas, ademas de un archivo barril index.js , donde exporto desde allí todos mis componentes.

Mi solución:

Grande profe. Se entiende ultra fácil.

Mi aporte literal como lo pide el profe creería que es

function CreateTodoBotton(){
    return(
        <button>+</button>
    );
};
export { CreateTodoBotton };

Aqui mi solucion

function CreateToDoButton(){
return (
<button>Crear nueva tarea</button>
);

}
export { CreateToDoButton };

Los componentes pueden recibir parametros de 2 formas:

  1. A la hora de llamar el componente:
// Aqui dentro del componente TodoCounter usamos props.completed y props.total
<TodoCounter completed={3} total={5} />
  1. Pasandole más elementos como en el caso del TodoList:
// Aqui dentro del componente TodoList usamos props.children para referenciar los TodoItem
<TodoList>
	<TodoItem />
	<TodoItem />
	<TodoItem />
</TodoList>

Ahí vamos…

Aqui mi solucion y le añadi el tipico contador en el button 😄

import { useState } from "react"

function TodoCreateButton(){
    const [count, setCounter] = useState(0);
    
    const handle = () => {
        setCounter(count + 1)
    }
    
    return(
        <button onClick={handle}>Click uwu {count}</button>
    )
}

export {TodoCreateButton}

En este código, el useState es una función especial de React que nos permite agregar un estado a un componente. Un estado es básicamente un lugar donde puedes almacenar y controlar datos que pueden cambiar mientras el componente está en uso.

En este caso particular, useState(0) inicializa el estado con el valor 0. Al llamar a useState(0), obtenemos una variable llamada count que representa el valor actual del estado y una función llamada setCounter que nos permite actualizar ese valor.

La línea const [count, setCounter] = useState(0) declara y asigna los valores iniciales del estado. count guarda el valor actual, que comienza en 0, y setCounter es una función especial que nos permite actualizar ese valor.

La función handle es una función que creamos para manejar el evento de clic en el botón. Cada vez que se hace clic en el botón, la función handle se ejecuta y llama a setCounter(count + 1) para actualizar el estado. Básicamente, le decimos a React que incremente el valor de count en 1 y actualice el componente con el nuevo valor.

He aqui dejo mi solucion
Javascript:

Css:

Como se ve el componente:

Hint: Puse en los estilos globales

html {
	font-size: 62.5%;
}

¡Acabo de darme cuenta de que el curso dura nueve horas… ok hoy no nos vamos hasta que terminemos este curso!

Dios les bendiga, para comentar en windows a mi me sirve en teclado gringo con control + k + c, pd: Recomiendo el uso de teclado gringo, no me refiero a literal un teclado gringo sino cambiar la configuración interna a causa de que siento más ergonomico la posición de los atajos de teclado como llaves, corchetes, más y menos que, comillas invertidas, backslash, simbolos, etc. Incluso la pipe line y a veces siento que en español puede ser muy engorroso hacer ciertos atajos de teclado

function TodoButton(props){
return (
<input type=“button” value={props.value} />
);
}
export {TodoButton};

Me gustó muchísimo la edición de video donde se ve al profesor en el mismo IDE al lado del código. Creo que es mucho mejor que cuando aparece el profesor pequeñito en un circulito en una esquina. Ojalá sigan haciendo videos con este estilo.

1:41

Es de valientes saber borrar el código by Juan DC

podríamos guardar todos los componentes de un tipo ( en este caso los Todo) en un solo archivo , para ahorrarme la lista de archivos?

Friendly reminder para comentar algo en VSCode

Shift + Alt + A 😉

Autocompletar Elementos JSX

Se debe agregar en la configuración de VSC de la siguiente manera:

Ctrl + , y luego clic en el icono ↪📄 (Derecha superior), finalmente agregamos esto

{
  "emmet.includeLanguages": {
    "javascript": "javascriptreact"
  }
}

🔥 Tutorial: Configurar autocompletado JSX

Más sobre configuración de VSC

Mi solucion

import React from 'react'

function CreateTodoButton(){
    return(
        <button>Add</button>
    );
}

export  {CreateTodoButton};

Les dejo mi solución, yo prefiero utilizar una arrow function 😄 y exportarla directamente, para crearla pueden utilizar el atajo rafc!

Hola, Yo creo que el nombre del componente debería reflejar el objetivo de este. así se hace mas clara su responsabilidad.

Esta fue la organización que le di, tengo entendido que mas adelante a cada componente se le agregara un estilo, por lo que considero que es mejor tener un orden por carpetas ![](https://static.platzi.com/media/user_upload/Untitled-d856c952-35e2-4abf-a04c-5a276c3946de.jpg)

Excelente actualización del curso. Va mucho más pausada y se ha detenido a explicar conceptos de forma más profunda. Excelente JuanDC, gracias por la actualización.

Componentes de Todo Machine

Antes de continuar debemos mencionar que tenemos dos formas de llamar a los componentes en JSX, el primero es con el autocerrado <componente />, y el segundo es con dos etiquetas de apertura y de cierre <componente></componente>. La forma de autocierre nos sirve cuando no vamos a poner componentes o elementos dentro de este componente, y la segunda forma nos permite poner componente dentro de componentes.


Maquetando la aplicación

A continuación, comenzaremos ya a maquetar los componentes necesarios para el Todo Machine, para esto primero borraremos todo lo que se encuentra adentro de nuestro componente App, el cual deberá quedar de la siguiente manera.

function App() {
  return (
    <div className="App">

        <TodoCounter />
        <TodoSearch />

        <TodoList>
            <TodoItem/>
            <TodoItem/>
            <TodoItem/>
        </TodoList>

        <CreateTodoButton>
    </div>
  );
}

⚠ La aplicación se romperá y no correrá, ya que los componentes no se han creado aún. Entonces porque lo hacemos de esta forma, esto es una técnica en la cual primero maquetamos la estructura de la aplicación y posteriormente creamos la funcionalidad de cada componente.


Creando los componentes

Para crear los componentes primero, crearemos archivos con el nombre de cada uno, esto nos permitirá tener una estructura más limpia y en caso de modificar algún componente poder encontrarlo con mayor facilidad. Recordemos que para los componentes tenemos que crear el archivo nombrándolo con la primera letra en mayúscula, y el nombre debe ser igual al nombre del componente.

TodoCounter

Crearemos un nuevo componente llamado TodoCounter en un archivo llamado TodoCounter.js. Deberá quedar de la siguiente manera.

function TodoCounter() {
    <h1>
        Has completado 3 de 5 TODOS
    </h1>
}

export { TodoCounter }
<h5>Exportar la función</h5>

Para poder utilizar el componente, debemos exportar la función, en este caso hay dos formas de hacerlo: con export default o con export nombrado.

<h6>Export default</h6>

Utilizar el export default <función> puede no ser la mejor opción, ya que al exportar de esta manera, tenemos la posibilidad de cambiar el nombre de la función al importar, lo que puede generar errores inesperados. Si quisiéramos manejarlo de esta manera, deberá quedar de la siguiente forma.

function TodoCounter() {
    <h1>
        Has completado 3 de 5 TODOS
    </h1>
}
export default TodoCounter
// Lo llamariamos de la siguiente forma

import NombreCualquiera from "./TodoCounter";

<h6>Export nombrado</h6>

El export nombrado con la sintaxis de objeto export { <función> }, es más recomendado cuando trabajamos con componentes de React, ya que nos permite evitar errores. Este tipo de export quedaría de esta manera:

function TodoCounter() {
    <h1>
        Has completado 3 de 5 TODOS
    </h1>
}
export { TodoCounter }
// Lo llamariamos de la siguiente forma

import { TodoCounter } from "./TodoCounter";

TodoSearch

👉 Repetiremos los pasos para la creación de componentes, por lo que a partir de ahora solo mencionaremos características propias de cada componente.

En este componente notaremos que tendrá un input en el cual posteriormente manejaremos información. Sin embargo, por ahora solo pondremos el input.

function TodoSearch(){
    return (
        <input placeholder="Cortar Cebolla"/>
    )
}

export { TodoSearch }

TodoList

Este componente es un poco especial, ya que a diferencia de los otros componentes manejará props. Por el momento no veremos más acerca de las props, ya que este tema se retomará más adelante.

function TodoList(props){
    return (
        <ul>
            {props.children}
        </ul>
    )
}

export { TodoList }

CreateTodoButton

Por el momento, no crearemos este componente. Sin embargo, para poder ver el avance de la aplicación, lo comentaremos en nuestro archivo App.js. Para comentar dentro de JSX utilizaremos la sintaxis {/* */}, por lo que deberá quedar de la siguiente manera:

    {/* <CreateTodoButton /> */}

TodoItem

Este componente ya se encuentra creado dentro de nuestro archivo App.js. Entonces lo único que necesitaremos será moverlo a su propio archivo.


Importando los archivos

Una vez tengamos creados los componentes creados, los importaremos en nuestro archivo App.js, utilizando la sintaxis de importación de objeto:

import { TodoCounter } from './TodoCounter';
import { TodoSearch } from './TodoSearch';
import { TodoList } from './TodoList';
import { TodoItem } from './TodoItem';

function App() {
    return (
        <div className="App">

            <TodoCounter />
            <TodoSearch />

            <TodoList>
                <TodoItem />
                <TodoItem />
                <TodoItem />
            </TodoList>

            {/* <CreateTodoButton /> */}
        </div>
    );
}

export default App;

**Que son los .props?** Certainly! In React.js, the `.props` property is used to access the properties (props) that are passed to a React component. Props allow you to pass data from a parent component to a child component. Here are some examples of using `.props` in React: ### Example 1: Basic Usage jsxCopy code`import React from 'react'`; `class Greeting extends React.Component` { ` render(`) { ` return` ( `
` `

Hello, {this.props.name}!

` `
` ); } } `// Usage of Greeting component` `class App extends React.Component` { ` render(`) { ` return` ( `
` ` <Greeting name="John" />` ` <Greeting name="Jane" />` `
` ); } } In this example, the `Greeting` component receives a `name` prop, and it renders a personalized greeting based on that prop. ### Example 2: Handling Different Types of Props jsxCopy code`import React from 'react'`; `class Book extends React.Component` { ` render(`) { ` return` ( `
` `

Title: {this.props.title}

` `

Author: {this.props.author}

` `

Published Year: {this.props.publishedYear}

` `
` ); } } `// Usage of Book component` `class BookList extends React.Component` { ` render(`) { ` return` ( `
` ` <Book title="React in Action" author="Mark Thomas" publishedYear={2020} />` ` <Book title="JavaScript: The Good Parts" author="Douglas Crockford" publishedYear={2008} />` `
` ); } } Here, the `Book` component receives `title`, `author`, and `publishedYear` as props. The `BookList` component uses the `Book` component to display information about different books. ### Example 3: Conditional Rendering Based on Props jsxCopy code`import React from 'react'`; `class AlertMessage extends React.Component` { ` render(`) { ` return` ( `
` {this.props.isError ? ( `

Error: {this.props.message}

` ) : ( `

Success: {this.props.message}

` )} `
` ); } } `// Usage of AlertMessage component` `class Notification extends React.Component` { ` render(`) { ` return` ( `
` ` <AlertMessage isError={true} message="Failed to load data" />` ` <AlertMessage isError={false} message="Data loaded successfully" />` `
` ); } } In this example, the `AlertMessage` component renders different messages and styles based on the `isError` prop. These examples illustrate how to use `.props` to pass and access data between React components. Remember that props are read-only, and you should not directly modify them within the component.
Exelente forma de explicar grande profe Juan, los efectos visuales de primera, es bueno que se explique desde el inicio todo lo que se va a realizar para entrar a realizar con conciencia genial...

Create Todo Button

  • El componente Create Todo Button representa el botón para crear nuevos TODOS en la aplicación.
  • Aunque actualmente no tiene funcionalidad implementada, su presencia es crucial para la futura interactividad de la aplicación.
  • Este botón será utilizado para desencadenar la aparición del formulario y modal que permitirá a los usuarios crear nuevos TODOS.
  • La estructura básica del botón incluye un elemento <button> con un icono de cruz (+) en su interior.
  • Aunque por ahora no tiene funcionalidad, su implementación es esencial para la completa experiencia de usuario planificada.

Communication Between Components with Props

  • La comunicación entre componentes en React se realiza a través de las “props” (propiedades).
  • En el componente TodoList, se utiliza props.children para permitir que otros componentes, como TodoItem, se rendericen dentro de la lista.
  • Las props son un mecanismo fundamental para pasar datos de un componente padre a sus componentes hijos.
  • En futuras clases, se explorará más a fondo el uso de props y cómo mejorar la comunicación entre componentes.

Conclusión y Próximos Pasos

  • Hasta ahora, hemos creado la estructura principal de la aplicación de Todo Machine, con componentes como TodoCounter, TodoSearch, TodoList, TodoItem, y CreateTodoButton.
  • Aunque algunos componentes no tienen funcionalidad completa, su implementación básica sienta las bases para futuras mejoras y características.
  • En la próxima clase, exploraremos más a fondo la comunicación entre componentes mediante props y continuaremos construyendo la interactividad de la aplicación.

Reto: Create Todo Button

  • El reto consiste en crear el componente CreateTodoButton, un botón que servirá para desencadenar la creación de nuevos TODOS en la aplicación.
  • Aunque la funcionalidad completa se abordará en clases posteriores, es esencial tener este componente creado y presente en la interfaz de usuario.
  • Crea un archivo CreateTodoButton.js, exporta el componente, e intégralo en el componente App.
  • La estructura básica incluye un elemento <button> con un icono de cruz (+) en su interior.

Recuerda seguir el enfoque de desarrollo progresivo, construyendo y mejorando cada componente paso a paso. ¡Buena suerte con el reto!

No soy experto, pero quise hacer la prueba de integrar algunas pequeñas cosas de Bootstrap, y les comparto mi humilde avance después de 2 horas.

Dios les bendiga, por fin entendí que el snippet rfce viene de react, function, component y export xd

Te amo juandc

Like si tomaste un curso de Richard B. Kaufman

Este docente es uno de los mejores que he visto en mi vida! sos increible!
Para los que se preguntaron como movio el import (Mac seria: alt-option + tecla direccion arriba)...
Dejo mi aporte: Dado que aún no se define la lógica del botón, se provee una función vacía. ![](https://static.platzi.com/media/user_upload/Captura%20de%20pantalla%202024-08-11%20a%20la%28s%29%207.45.24p.m.-f7ddb619-7bf4-47e4-b715-e1e0e3314969.jpg) Así se ve el componente cuando corre: ![](https://static.platzi.com/media/user_upload/Captura%20de%20pantalla%202024-08-11%20a%20la%28s%29%207.49.31p.m.-2fae7459-e703-47ff-93ce-5e346fd298af.jpg)
Shorcut para comentar: Windows -> Primero nos posicionamos en la línea que queremos comentar o seleccionamos varias líneas tecleamos ctrl + k + u Linux -> seleccionamos la línea o varias líneas ctrl + shift + /
Primero cree el documento TodoButtom,js Y luego cree el componente: ```js function TodoButtom(){ return( <button>+ Agregar mas Tareas</button> ); } export { TodoButtom }; ```Después de exportarlo en el documento TodoButtom.js, lo importe en el documento de App.js: ```js import { TodoButtom } from './TodoButtom'; ```Y listo así quedo: ![](https://static.platzi.com/media/user_upload/image-a8976c3e-57e4-40c4-b136-faeddf019791.jpg)
mi boton creado en el archivo CreateTodoButton.js: `function CreateTodoButton() {    return (      <button>Dale</button>    )  }    export { CreateTodoButton};`
bien explicado profe... super ese detalle
Excelente profesor. Las clases son claras, completas y entretenidas 😎
Para comentar un codigo o simplemente poner un comentario, se usa 💻👌 `shift + alt + A`
Les comparto mi solución al reto. 😁 ![](https://static.platzi.com/media/user_upload/code-df9e1dfd-619b-46a3-85d0-69f2117d30e8.jpg)
Cada vez más satisfecho con esta clase. Más cursos así!
gracias, profe juan ![](https://static.platzi.com/media/user_upload/VALIENTES-d8aa67fe-f3fb-4099-ae97-2f89f40b6254.jpg)
CTRL + C + K para comentar código en windows

En Windows el atajo por defecto de VS es ctrl + k + c , y tambien funciona para JSX.

CreateTodoButton

function CreateTodoButton() {
    return(
        <button>Agregar</button>
    );
  }

export { CreateTodoButton };
"Recuerda que neeitamos un botón" jajajajjajaja
`function CreateToDoButton() {    return(        <button>Add +</button>    );}` `export { CreateToDoButton }`
```js function CreateToDoButton() { return( <button>Add +</button> ); } export { CreateToDoButton } ```function CreateToDoButton() {    return(        \<button>Add +\</button>    );} export { CreateToDoButton }
TodoButton.js
function TodoButton() {
    return (
      <button>
        +
      </button>
    );
  }
  
  export { TodoButton };
App.js
import { TodoButton } from './TodoButton';

      <TodoButton />

Haz y Has: min 6:37 ✨😊

  • “Has” es una conjugación del verbo “haber”.
  • “Haz” viene del verbo “hacer”.

Mi solucion del componente Boton

function CreateTodoButton(){
    return (
        <button>Crear Tarea</button>
        )
};

export {CreateTodoButton};
function TodoButton() {
  return (
    <button> + </button>
  )
}

export { TodoButton }

gg

function CreateTodoButton() {
    return (
        <button> + </button>
    )
}

export { CreateTodoButton };
import { TodoCounter } from './TodoCounter';
import { TodoSearch } from './TodoSearch';
import { TodoList } from './TodoList';
import { TodoItem } from './TodoItem';
import { CreateTodoButton } from './CreateTodoButton'; 
import './App.css';

function App() {
  return (
    <div className="App">

      <TodoCounter />
      <TodoSearch />

      <TodoList>
        <TodoItem />
        <TodoItem />
        <TodoItem />
      </TodoList>

      <CreateTodoButton />

    </div>
  );
}

export default App;

Asi lo hice yo

Con el comando (ctrl + espace) + eligiendo el archivo, puedes importar el componente que detecta vscode.

-Creo un componente CreateTodoButton.js

function CreateTodoButton(){
    return(
        <button type="button">+</button>
    );
}
export  {CreateTodoButton}
  • Y final mente lo importa en App.js
import { CreateTodoButton } from './CreateTodoButton';

<div className="App">
....
 <CreateTodoButton />
</div>

La forma en que creé mi componente fue:

// En el archivo TodoCreateButton.js
function TodoCreateButton () {
    return (
        <button>Crear TODO</button>
    );
}

export { TodoCreateButton };
//En el archivo App.js lo importo y agrego el componente dentro del componente App.
import { TodoCreateButton } from './TodoCreateButton';

    <div className="App">
      <TodoTitle />
      <TodoSearch />
      <TodoList>
        <TodoItem />
        <TodoItem />
        <TodoItem />
      </TodoList>
      <TodoCreateButton />
    </div>

function CreateTodoButton(){
return(
<button variant=“contained”>Default</button>
)
}
export { CreateTodoButton }; // Export nombrados

Así es como quedo mi solución de Button

Ahí va

function CreateTodoButton() {
    return (
      <button>+ Agregar To-do</button>
    );
  }

  export { CreateTodoButton };

Prueben para comentar y descomentar control + shift + 7 ,uso linux y visual studio code

Componente Button

import React from 'react'

const CreateTodoButton = () => {
  return (
    <div>
        <button>+</button>
    </div>
  )
}

export {CreateTodoButton};
import { CreateTodoButton } from './components/CreateTodoButton';


function App() {
  return (
    <div className="App">
      {/*Contador*/}
      <TodoCounter />

      {/*Buscar Todo's*/}
      <TodoSearch />

      {/*Lista de Items*/}
      <TodoList> 
        <TodoItem/>
        <TodoItem/>
        <TodoItem/>
      </TodoList>

      {/*Crear ToDo*/}
      <CreateTodoButton/>

    </div>
  );
}

export default App;

Atajo para comentar en Windows :

CTRL + }

MI resolución del reto:
Cree un nuevo archivo con la siguiente función:

function CreateTodoButton(){
  return(
  <button>+</button>
  );
}

export {CreateTodoButton}

en el archivo App. js agregar la siguiente linea :

import { CreateTodoButton } from '' ;





Esta muy bien explicado

yo crre el componente de CreateTodoButton de una vez :V

Lo del chanclazo es epico 😄

Que buen atajo de teclado!! xd

function CreateTodoButton(){
    return(
      <button>Agregar</button>
      
    );
  }

  export { CreateTodoButton };

Mi componente 🙌🏼

function CreateTodoButton() {
  return (
    <button>➕</button>
  )
}

Mi solución:

App.js

<TodoButtonCreate value="Add" />

TodoButtonCreate.js

function TodoButtonCreate(props){
    return (
        <input type="button" value={props.value}/>
    );
}

export {TodoButtonCreate};

Aquí el reto de la clase.

function CreateTodoButton() {
    return (
        <button style={{ backgroundColor: 'blue', color: 'white' }}></button>
    );
  }
  export {CreateTodoButton}
Hola todavía no me queda claro ¿si este proyecto puede usar archivos con la extensión jsx o solo soporta archivos js ? y porque? y que es CRA? Gracias
En React, los "props" (abreviatura de "properties") son un mecanismo para pasar datos de un componente padre a un componente hijo. Los props son inmutables y se utilizan para configurar y personalizar los componentes hijos. La diferencia clave entre los props y los atributos es que los props son específicos de React y se utilizan para pasar datos entre componentes, mientras que los atributos son una característica de HTML y se utilizan para definir propiedades de los elementos HTML. En React, los props pueden ser cualquier tipo de dato, incluyendo funciones, mientras que los atributos HTML son generalmente cadenas de texto.
Mi reto: ![](https://static.platzi.com/media/user_upload/image-141cacdf-aa41-4f9e-a322-0041917bc80d.jpg)
Comparto mi reto: ![](https://static.platzi.com/media/user_upload/imagen-fb33918c-7429-4e50-9d9f-34bbcf2f6c41.jpg) ![](https://static.platzi.com/media/user_upload/imagen-f6daf4be-8b44-4629-afce-14345d861c6c.jpg)
Listo :D ![](https://static.platzi.com/media/user_upload/image-5c475848-99c7-4d65-b3e7-9f67d16927e2.jpg)
Este man es el mejor profe de desarrollo en platzi... los ejemplos y la forma de explicar hace que se entienda o se entienda.
Hasta el momento he aprendido bastante, asi va quedando... ![](https://static.platzi.com/media/user_upload/imagen-c264a3ef-ffa8-4422-8fe3-4c48d88b84d2.jpg)
Reto completado: ```js function CreateTodoButton() { return( <button>Create Todo</button> ) } export {CreateTodoButton} ```Por ahora fue sencillo, veremos mas adelante si hay que quemar la cabeza XDD
que facilidad con la que explica!!! 20 de 10 !
Mi solución del botón: ![](https://static.platzi.com/media/user_upload/image-d675dc01-d4b3-47e7-97f5-0d3585e8bb81.jpg) ![](https://static.platzi.com/media/user_upload/image-bbd2f09c-bbcd-4868-8364-280c270187fa.jpg)
Muy bueno como explica, se que en esta parte del curso es temprano pero seria bueno manejarlo en una carpeta llamada componentes e invocarlos alli :D
![]()![](https://scontent.flsc2-1.fna.fbcdn.net/v/t39.30808-6/450562332_418721874545570_9063034764957359677_n.jpg?_nc_cat=104\&ccb=1-7&_nc_sid=833d8c&_nc_ohc=2k1wWb-8_d4Q7kNvgFw4QHA&_nc_ht=scontent.flsc2-1.fna\&oh=00_AYAF8UeOvNzt_x_8BOKI-9hB8DbDhjR5iLYSYfavmmRj5g\&oe=66978853)
Bien que recuerdo esta aplicación, a ver como nos queda con esta nueva version.
bien
Hola!! Hice todo el código paso a paso como fue diciendo el profesor, pero cuando lo corro no veo nada en el navegador. Comparé con los códigos que dejó en recursos y los que fueron escribiendo acá y nada. Qué me puede estar faltando? instalar algo capaz? Muchas gracias
![]() Hola**, tengo un problema a la hora de que me muestre en el sitio web,** me sale la pagina en blanco, en la terminal no me reporta ningun error, ya no se que hacerrrr jajaja ![](https://static.platzi.com/media/user_upload/image-0ad839a6-58c3-4e3e-b905-57945c31e86c.jpg)

Si eres como yo que iniciaste el proyecto con Vite + React y te da error: Internal server error: Failed to parse source for import analysis because the content contains invalid JS syntax. If you are using JSX, make sure to name the file with the .jsx or .tsx extension.

Solo cambia las extensiones de los archivos .js a jsx y listo

```js file: CreateTodoButton---->function CreateTodoButton() { return ( <button type="button">☝🏻</button> ) }; export {CreateTodoButton}; import to file App.js----> import { CreateTodoButton} from './CreateTodoButton'; ```
## 🦄✨Utilicé bootstrap icons para insertar el icon de + para el botón y el componente me quedó así: ```js const CreateTodoButton = () => { return ( <button className="primaryButton"></button> ); }; export { CreateTodoButton }; ``` Adicional también añadí unos pequeños estilos para que el botón se vea mejor c: ```js .primaryButton { background-color: var(--primary-color); color: var(--light-color); border: none; border-radius: 4px; padding: 10px; font-size: 16px; cursor: pointer; transition: background-color 0.2s; } .primaryButton:hover { background-color: var(--primary-color-dark); } .primaryButton:active { background-color: var(--primary-color-light); } ```Y finalmente así quedó mi botoncito: ![](https://static.platzi.com/media/user_upload/Screenshot%202024-03-22%20165827-a528cbe2-3020-43a1-8248-e75dca1e0f4b.jpg) No sé por qué no me deja subir Gifs :))
![](https://static.platzi.com/media/user_upload/image-3b057d8e-81c4-4e40-9ea4-ebc41a2f316c.jpg) ![](https://static.platzi.com/media/user_upload/image-75f9dfab-05cb-4e54-9c41-ac499e8f3afb.jpg)
```js import React from 'react' function TodoButton() { return (
) } export { TodoButton } ```

otra vez x aqui