Jimmy Buriticá Londoño
Sebastián Buitrago
que es el modelo mvc
Miguel Angel Reyes Moreno
Sebastián, es "Modelo Vista Controlador"
Darle estilos a una aplicación de React usando Styled Components cambia por completo la forma en que piensas sobre CSS. En lugar de archivos separados o preprocesadores, escribes los estilos directamente con JavaScript, dentro de tus propios componentes. Esto permite crear componentes reutilizables que llevan su apariencia incorporada y que pueden reaccionar dinámicamente a las propiedades que reciben.
¿Qué es CSS in JS y por qué usar Styled Components?
CSS in JS es una técnica que permite escribir el código CSS directamente dentro de archivos JavaScript, vinculando los estilos con los componentes de forma nativa. Styled Components es la herramienta más popular para implementar esta técnica en React [0:18]. A diferencia del CSS tradicional o de preprocesadores como Sass, aquí cada componente encapsula sus propios estilos, evitando conflictos de nombres y facilitando el mantenimiento.
Para instalar Styled Components en un proyecto se ejecuta npm install styled-components o, si se trabaja en Code Sandbox, basta con agregarlo desde la sección de dependencies [1:06].
¿Cómo se crea un componente estilizado?
La mecánica es distinta a crear un componente funcional tradicional. En lugar de definir una función que retorne JSX, se utiliza la función styled seguida de la etiqueta HTML que se desea estilizar. Los estilos se escriben dentro de template literals (comillas invertidas) [1:50]:
javascript import styled from "styled-components";
export const Title = styled.h2 padding-bottom: 10px; border-bottom: 1px solid blue;;
Este componente Title se usa exactamente igual que cualquier otro componente de React. Se importa con llaves porque no es una exportación por defecto [2:38].
¿Cómo aplicar hover, transiciones y estados deshabilitados?
Styled Components permite referenciar pseudo-clases usando el símbolo &, que representa al propio componente. Así se definen estilos para hover o disabled directamente dentro del mismo bloque [4:30]:
javascript const StyledButton = styled.button` cursor: pointer; padding: 5px 10px; border: 1px solid transparent; transition: border-color 0.15s;
&:hover { border-color: blue; }
&:disabled { background-color: lightblue; } `;
&:hover indica: "a mí mismo, cuando el mouse esté encima, aplica estos estilos" [4:42].&:disabled permite cambiar la apariencia cuando el botón está deshabilitado [6:08].transition suaviza el cambio de border-color en 150 milisegundos [5:44].Cuando el nombre del componente estilizado coincide con la función del componente original (por ejemplo, form y Form), la convención es anteponer la palabra Styled al nombre, como StyledForm [3:55].
¿Cómo funciona el ThemeProvider para estilos globales?
Una de las grandes ventajas de Styled Components es el ThemeProvider, un componente que envuelve toda la aplicación y distribuye un objeto de tema a todos los componentes hijos sin necesidad de pasar props manualmente en cada nivel [7:00].
javascript import { ThemeProvider } from "styled-components";
const themes = { avengers: { bg: "#1a1a2e", color: "#e94560", color2: "#7b2d8e" }, terminator: { bg: "#0f0f0f", color: "#ff0000", color2: "#cc0000" } };
export const Theme = (props) => ( <ThemeProvider theme={themes.avengers}> {props.children} </ThemeProvider> );
El ThemeProvider requiere obligatoriamente una propiedad theme que reciba un objeto [8:22]. Dentro de ese objeto se definen variables como colores de fondo, colores primarios y secundarios. Se crearon dos temas —Avengers y Terminator— para que la aplicación pueda cambiar de paleta de colores dinámicamente [8:05].
¿Cómo acceder al tema desde un componente estilizado?
Dentro de los template literals, se usa la interpolación de JavaScript para insertar una función que recibe las props del componente. Todas las props incluyen automáticamente el objeto theme proporcionado por el ThemeProvider [9:20]:
javascript
export const Title = styled.h2 padding-bottom: 10px; border-bottom: 1px solid ${(p) => p.theme.color2};;
(p) => p.theme.color2 extrae el color secundario del tema activo.p como abreviatura de props para mantener el código más compacto [9:40].border-color del botón en hover y en el background-color del estado disabled [10:20].¿Qué sigue con los estilos dinámicos en React?
La aplicación ya responde al tema de Avengers, mostrando bordes y fondos con la paleta morada definida. El siguiente paso es hacer que el tema cambie dinámicamente cuando el usuario pase el mouse sobre cada película [11:15]. Esto implica modificar no solo componentes individuales sino también los estilos globales de toda la aplicación, aprovechando la estructura de themes con múltiples paletas de colores.
Si ya probaste Styled Components en tu propio proyecto, comparte qué patrón de temas te resultó más útil y cómo organizaste tus componentes estilizados.
Jimmy Buriticá Londoño
Sebastián Buitrago
que es el modelo mvc
Miguel Angel Reyes Moreno
Sebastián, es "Modelo Vista Controlador"
Miguel Angel Reyes Moreno
& se llama ampersand
Mauricio Combariza
Por si acaso alguien pasa por lo mismo, los componentes deben nombrarse con mayúscula inicial StyledForm, si no no funciona y uno puede pasar horas buscando el erro
Juan Diego Quintero Calderón
Juan Pablo Jimenez
creo que me quedo con los preprocesadores xd
Omar Gabriel Aguilar Moscoso
xd
Sebastian Heredia
Es un dolor de cabeza trabajar en CodeSanbox, en este punto ya podemos crear una carpeta en VSC y configurarlo para el mejor manejo. :)
Ricardo Mazuera
Total!!!!!... es lo único que no me ha gustado del curso, ese CodeSandbox.
Santiago Jimenez Moncada
total codesanbox es de lo por que eh visto
Joel Andres Bonilla Tellez
cuidado con typear mal
Estuve como 20min tratando de ver cual era mi error porque me salía en blanco la pantalla y encima la consola no me tiraba ningún error, en micaso era que habia puesto props.childern en vez de children! T.T
export const Theme = (props) => ( <ThemeProvider theme={themes["daredevil"]}>{props.childern}</ThemeProvider> );
Ricardo Mazuera
Suele pasarnos a todos jaja
César Palma
Styled Components va con React y su fea sintaxis xD
Hector Rubio
Pues es cuestión de gustos, lo mas seguro es que ya estes acostumbrado un tipo de sintaxis en especifico, pero eso no significa que sea peor o mejor, lo mejor es adaptarse y seguir aprendiendo-
Ricardo Mazuera
Héctor, yo no estoy acostumbrado a ninguna sintaxis, apenas estoy aprendiendo y es horrible! jajaja. Me gustó más la de Vue Components de acuerdo al curso.
Mauricio Moreno Morales
Para que en VSCode se se coloreen los template strings de los styled components instalen esta extensión
https://marketplace.visualstudio.com/items?itemName=jpoissonnier.vscode-styled-components
Cesar Augusto Suarez Medina
El símbolo & se llama ampersand
Víctor Isaac Arias García
Parece que voy a tener que prácticar más esto de los styled-components es completamente nuevo para mi que solo conocia aplicar CSS normal y poco con preprocesadores y en JS puro
Diego Herrera Prado
¿Qué es mejor usar en React? ¿Styled components o un pre procesador? ¿Combinar ambos sería una buena opción?
Juan Castro
ProfesorNo hay una opción "mejor", solo opciones que se pueden adecuar más a un proyecto que a otro o simplemente que te gusten más. Combinar ambas también es una opción muy válida.
Max Andy Diaz Neyra
Sergio Sanc
En el Theme.js pusiste el codigo de Form.js si mal no estoy...
Shelsy Angélica Garcia Laverde
Shelsy Angélica Garcia Laverde
Sebastián Buitrago
Me sale este error al usar la propiedad Theme
dejo el link para que revisen el codigo aqui
Sneyder Barreto
Juan Castro
ProfesorSneyder encontró el error perfectamente. :clap:
Excelente la forma de pedir ayuda mostrando el error y dejando el link al código. :ok_hand:
¡Estamos atentos a cualquier otra pregunta!
Rafael Lizarraga
Hola Platzi! ¿Cómo va? Estoy armando una carpeta de Google Docs con la toma de notas de todos los cursos que voy realizando para que entre todos podamos aportar!
Los invito a participar! https://drive.google.com/drive/folders/1SWGMgTMPbwgasbzcivcpcnIudc2vk_v0?usp=sharing
Jorge De Jesus Tejeda Bello
Styled component de cierta forma es como si estuviéramos creando los componentes desde css con estilos xD
Sylvester Josué Rojas Cañón
Como siempre el profe Juan DC, conocedor de todas las areas <3
Lean Silva
Me parece super entretenido React, por suerte ya que tiene mucha demanda laboral. Creo que me voy a avocar a estudiarlo por completo.
++Estilos utilizados++
Form:
const StyleForm = styled.form` font-family: courier; margin: 0 50px 25px; padding: 10px 25px 25px; text-align: center; transform: scale(1); transition: transform 0.3s; &:hover { transform: scale(1.2); } `; const StyledButton = styled.button` cursor: pointer; padding: 5px 10px; margin: 0px 15px; border: 1px solid transparent; transition: 0.15s border-color; &:hover { border-color: blue; } &[disabled] { background: lightblue; } `;
Title
export const Title = style.h2` padding-bottom: 10px; border-bottom: 1px solid ${(props) => props.theme.color2}; `;
Códigos finales de la clase: Src/Theme.js
import React from "react"; import styled from "styled-components"; const StyledForm = styled.form` background-color: $bg; border: 1px solid $color; margin: 0 50px 25px; font-family: "Courier New", Courier, monospace; padding: 25px; text-align: center; transform: scale(1); transition: 0.3 transform; &:hover { transform: scale(1.2); } `; const StyledButton = styled.button` background: $color2; border: 1px solid $color; cursor: pointer; padding: 5px 10px; transition: 0.15s border-color; &:hover { border-color: ${(p) => p.theme.color2}; } &[disabled] { background: ${(p) => p.theme.color2}; } `; export default function Form(props) { const [quantity, setQuantity] = React.useState(0); const { movie } = props; return ( <StyledForm> <h4>{movie.name}</h4> <StyledButton type="button" onClick={() => setQuantity(quantity - 1)} disabled={quantity <= 0} > - </StyledButton> {quantity} <StyledButton type="button" onClick={() => setQuantity(quantity + 1)} disabled={quantity >= movie.available} > + </StyledButton> </StyledForm> ); }
src/Ttitle.js
import styled from "styled-components"; export const Title = styled.h2` padding-bottom: 10px; border-bottom: 1px solid ${(p) => p.theme.color2}; `;
src/Form.js
import React from "react"; import styled from "styled-components"; const StyledForm = styled.form` background-color: $bg; border: 1px solid $color; margin: 0 50px 25px; font-family: "Courier New", Courier, monospace; padding: 25px; text-align: center; transform: scale(1); transition: 0.3 transform; &:hover { transform: scale(1.2); } `; const StyledButton = styled.button` background: $color2; border: 1px solid $color; cursor: pointer; padding: 5px 10px; transition: 0.15s border-color; &:hover { border-color: ${(p) => p.theme.color2}; } &[disabled] { background: ${(p) => p.theme.color2}; } `; export default function Form(props) { const [quantity, setQuantity] = React.useState(0); const { movie } = props; return ( <StyledForm> <h4>{movie.name}</h4> <StyledButton type="button" onClick={() => setQuantity(quantity - 1)} disabled={quantity <= 0} > - </StyledButton> {quantity} <StyledButton type="button" onClick={() => setQuantity(quantity + 1)} disabled={quantity >= movie.available} > + </StyledButton> </StyledForm> ); }
Asi quedo mi codigo del Form, tuve que hacer modificaciones ya que salian errores Les dejo la documentacion
import React from "react"; import styled from "styled-components"; const Form1 = styled.form` font-family: "Courier New", Courier, monospace; padding: 10px 25px 25px; text-align: center; transform: scale(1); transition: 0.3s transform; &:hover { transform: scale(1.2); } `; const Button = styled.button` cursor: pointer; padding: 5px 10px; border: 1px solid transparent; transition: 0.15s border-color; &:hover { border-color: ${(p) => p.theme.color2}; } &:disabled { background-color: ${(p) => p.theme.color2}; } `; export default function Form(props) { const [quantity, setQuantity] = React.useState(0); const { movie } = props; return ( <Form1> <h4>{movie.name}</h4> <Button type="button" onClick={() => setQuantity(quantity - 1)} disabled={quantity <= 0} > - </Button> {quantity} <Button type="button" onClick={() => setQuantity(quantity + 1)} disabled={quantity >= movie.available} > + </Button> </Form1> ); }
¡Hola!
No estás retornando el ThemeProvider.
Deberías tener en la declaración de Theme:
export const Theme = (props) => { return ( <ThemeProvider theme={themes['avengers']}>{props.children}</ThemeProvider> ); };
Con eso no deberías tener errores. Un saludo.