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:

20 Días
0 Hrs
7 Min
32 Seg

Componente de Layout

6/31
Recursos

Aportes 32

Preguntas 6

Ordenar por:

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

Hola! Para los que les salga el error de:

‘children’ is missing in props validation

Tienen que instalar PropTypes:

npm i prop-types --save 

Y luego hacer lo siguiente en el archivo index.jsx/Layout

import PropTypes from 'prop-types'

const Layout = ({ children }) => {
  Layout.propTypes = {
    children: PropTypes.node.isRequired,
  }
  
  return (
    <div className='flex flex-col items-center mt-20'>
      {children}
    </div>
  )
} 

Y listo, les dejará de salir ese error 😃

Lo hice de esta manera agregando el Layout en el main.jsx de forma global, para no estar repitiendo el mismo componente en todos Pages

Hola!, yo lo hice de la siguiente forma, con la finalidad de solo importar una única vez layout dentro del App.jsx.

Lo hice de esta manera, importo solo una vez el “Layout” para todas las rutas. “Outlet” es similar a un “Slot” en otros frameworks de componentes o componentes en Vanilla JS,

Hola comunidad les comparto unos pequeños apuntes en Notion, espero les sean de utilidad.
Link aquí:
https://bg99astro.notion.site/Componente-Layout-75402f8c1a4540c5b7893c3605f4f393

Hola, solucione el error ‘children’ is missing in props validation
de esta manera:

En el fichero .eslintrc.cjs solo agrega esta lineá de código en las reglas de esta manera:
“react/prop-types”: “off”

rules: {
    "react/prop-types": "off"
  }

Debería quedarte algo así:

module.exports = {
  root: true,
  env: { browser: true, es2020: true },
  extends: [
    'eslint:recommended',
    'plugin:react/recommended',
    'plugin:react/jsx-runtime',
    'plugin:react-hooks/recommended'
  ],
  ignorePatterns: ['dist', '.eslintrc.cjs'],
  parserOptions: { ecmaVersion: 'latest', sourceType: 'module' },
  settings: { react: { version: '18.2' } },
  plugins: ['react-refresh'],
  rules: {
    'react-refresh/only-export-components': [
      'warn',
      { allowConstantExport: true },
    ],
    "react/prop-types": "off"
  },
}

Espero sea de ayuda! 😁👍

La versión 4.3.2 de Vite sigue generando el archivo .eslintrc.cjs por defecto en proyectos nuevos. La razón de esto es que, aunque Vite utiliza el formato de módulo JavaScript nativo (ES modules) por defecto, la generación del archivo .eslintrc.cjs es realizada por la plantilla oficial de Vite, no por Vite en sí mismo.

La plantilla oficial de Vite incluye el archivo .eslintrc.cjs por defecto, junto con otras configuraciones básicas para ESLint y otras herramientas, para facilitar la configuración inicial de un nuevo proyecto.

Si prefieres no utilizar el archivo .eslintrc.cjs, puedes eliminarlo manualmente después de crear tu proyecto con Vite, y luego configurar ESLint según tus necesidades utilizando otro archivo de configuración de ESLint, como .eslintrc.json o .eslintrc.js.

Hola! comparto el codigo de Layout para aquellos que decidieros typescrit

import React from 'react'

interface LayoutProps {
  children: React.ReactNode;
}

const Layout: React.FC<LayoutProps> = ({ children }) => {
  return (
    <div className='flex flex-col mt-20 items-center'>
      {children}
    </div>
  )
}

export default Layout

Básicamente la función del layout es conservar ciertos estilos que se van a repetir por lo que me parece màs fácil crear una componente clase en el archivo base de tailwind para que no sea necesario crea un componente e importarlo cada que se necesite.

@tailwind base;
@tailwind components;
@tailwind utilities;

.layoutBase {
    @apply flex flex-col mt-5 items-center;
}

Y luego se implementa así:

export const HomePage = () => {
  return (
    <div className='layoutBase'>
      HomePage
    </div>
  )
}

Hola!. Cuando crean un componente nuevo no hace falta que escriban toda la arrow function… si escriben sfc en visual code se les crea todo el componente de react con su export default!

Para los que les marca error con children por el eslintrc solo agreguen esta configuracion a su archivo .eslintrc.cjs

module.exports = {
  // ... otras configuraciones ...

  rules: {
    // ... otras reglas ...

    // Agrega esta regla para omitir la validación de "children"
    'react/prop-types': [
      'error',
      {
        ignore: ['children'], // Lista de props que no se validarán
      },
    ],
  },
};

Así no tendran que validarlo en cada archivo que usen children y no tendran que exportar o instalar el prop-types

‘children’ is missing in props validation este error se puede solucionar quitandolo del archivo .eslintrc.cjs en la parte de rules: 'react/prop-types':'off'

yo preferi hacer el wrapper a el componente AppRoutes me parece que es mas facil.

 const App = () => {
  return (
    <BrowserRouter>
      <Navbar />
      <Layout>
        <AppRoutes />
      </Layout>
    </BrowserRouter>
  )
}

y este es el resultado.

Para no estar repitiendo el Layout en cada pagina, lo que hice fue lo siguiente `function App() {` ` return (` ` <BrowserRouter>` ` <Navbar />` ` <Layout>` ` <AppRoutes />` ` </Layout>` ` </BrowserRouter>` ` );` `}`
Todo esta quedando Hermoso, como mi Profe Hermosa. ![](https://static.platzi.com/media/user_upload/image-e9080b00-1b6b-4424-96ad-2f3c4b32ef41.jpg)
es correcto que se deba usar la etiqueta div para el layout?? no estoy seguro pero tal vez la etiqueta \<main> sea la semanticamente correcta... si estoy mal, por favor denme un mejor criterio semantico para el layout... gracias!
estuve unas buenas horas diciendo por que quebro mi app , salia un error con el vite era cosa de unas {} pero luego no cargaba nada de nada se ponia todo blanco , en la consola salia un error que nunca vi : Uncaught SyntaxError: ambiguous indirect export: default index.jsx:17:7 luego preguntando a chatgpt medijo que puede ser una doble import default cosa que busque , pero luego luego me di cuenta que faltaba esta linea en el layout `export default Layout` no me desanime ni un segundo solo que me saco de onda que pudo ser jajaj hacia tiempo que no me pasaba :3
Como aporte para quien quiera hacer un gradiente en el navbar: En el archivo App.css: ```js @tailwind base; @tailwind components; @tailwind utilities; @layer components { .navGradient { @apply bg-gradient-to-r from-[#d9afd9] via-[#b8c4dd] to-[#97d9e1]; } } ```Y en el componente Navbar en su index.jsx solo tendríais que colocar la nueva clase creada: ```css <nav className="flex justify-between items-center fixed z-10 top-0 w-full py-5 px-8 text-sm font-light navGradient"> ```Espero sirva de ayuda.
Como aporte si quereis hacer un gradiente en el navbar sería así: En App.css: ![](<Captura de pantalla 2024-07-03 a las 11.07.02>)```js @tailwind base; @tailwind components; @tailwind utilities; @layer components { .navGradient { @apply bg-gradient-to-r from-[#d9afd9] via-[#b8c4dd] to-[#97d9e1]; } } ```En el componente Navbar en su index.jsx solo teneís que llamar a esa clase que habéis creado: ```js <nav className="flex justify-between items-center fixed z-10 top-0 w-full py-5 px-8 text-sm font-light navGradient"> ```Espero que os sirva de ayuda ☺️
Este tipo de errores deberían decir como solucionar en el curso, son cosas que te hacen perder tiempo
El problema que enfrentas con el error "children is missing in props validation" es debido a que no estás validando las propiedades que tu componente `Layout` recibe. Para solucionar este problema, puedes usar PropTypes, que es una biblioteca para documentar los tipos de propiedades que un componente espera recibir. En este caso, vamos a validar que el componente `Layout` reciba `children`. A continuación te muestro cómo puedes hacerlo: 1. Instala la biblioteca `prop-types` si aún no la tienes instalada: ```js npm install prop-types ``` 1. Importa `PropTypes` y define las validaciones de tus propiedades: ```js import PropTypes from 'prop-types'; const Layout = ({ children }) => { return
{children}
; }; Layout.propTypes = { children: PropTypes.node.isRequired, }; export { Layout }; ``` Aquí estamos especificando que la propiedad `children` es de tipo `node` y es requerida (`isRequired`). Esto debería resolver el error relacionado con la validación de las propiedades. Informacion tomada en chat gpt
```js import PropTypes from 'prop-types' const Layout = ({ children }) => { Layout.propTypes = { children: PropTypes.node.isRequired, } return (
{children}
) } export default Layout ```import PropTypes from 'prop-types' const Layout = ({ children }) => {    Layout.propTypes = {        children: PropTypes.node.isRequired,    }    return (        \
            {children}        \
    )} export default Layout
Para tener el nabab pegado arriba debes poner: `absolute top-0`
Lo he dejado así visualmente hasta el momento: ![](https://static.platzi.com/media/user_upload/image-d7d15ea6-6898-49de-961a-779f3b467930.jpg)

Asi vamos

si estas usando typeScript la solucion a los errores que nos arroja el linter
en Layout

import { ReactNode } from 'react';

interface Props {
  children: ReactNode;
}

export const Layout: React.FC<Props> = ({children}) => {
  return (
    <div className='flex flex-col mt-20'>
      {children}
    </div>
  )
}

Asi Vamos

Me fue muy bien en esta clase, aprendí cosas nuevas y reforcé las que ya tenia😎

super divertido la creación de layout. Simplifica mucho el diseño general

Les dejo por acá un pequeño Shortcut para no pasar por cada elemento y poner el Componente de <Layout> solo en un lugar. Espero les sirva:

// >> src/pages/App/index.jsx

export function App() {

  return (
    <BrowserRouter>
      <Navbar/>
      {/* Este Layout aplica a todos los componentes de `AppRoutes` */}
      <Layout>
        <AppRoutes/>
      </Layout>
    </BrowserRouter>
  )
}
Para usar gradientes en el componente NavBar. Se tiene que escribir una clase en App.css: ```js @tailwind base; @tailwind components; @tailwind utilities; @layer components { .navGradient { @apply bg-gradient-to-r from-[#d9afd9] via-[#b8c4dd] to-[#97d9e1]; } } ``` Luego solo hay que usar la nueva clase en el componente NavBar.
TS: ![](https://static.platzi.com/media/user_upload/carbon%20%283%29-50c69961-6b00-4134-962e-1b571dc97e39.jpg)