react-puro-19
  • React Puro - 19
  • code
    • README
    • README
    • README
    • README
    • README
    • README
    • README
    • README
  • 7-state-en-clases
    • Ejemplo inicial: un contador
    • Manejo de eventos
    • El state
    • Sintaxis limpia en Class Components
    • setState es Asincrónico
    • Fusión superficial vs profunda
  • 5-children
    • Personalizar Children antes de renderizar
    • PropTypes para Children
    • Los Children
    • Diferentes tipos de Children
    • Manejando uso Children
  • 13-hook-usereducer
    • Qué es un Reducer?
    • Un ejemplo más practico
    • Entonces, Redux murió?
  • 4-proptypes
    • Documentación y depuración incluida
    • PropTypes como documentación
    • Cómo validar, formas comunes
    • Ejemplo Tweet con PropTypes
  • 3-props
    • Comunicación con componentes Padre
    • Las Props:
    • Pasar Props
    • Recibir Props
    • Ejemplo Tweet con Props
  • 11-pensando-uso-state
    • "Tipos" de componentes
    • Qué colocar en el State
    • Dónde mantener el estado
    • Pensando declarativamente
  • 9-requests-api
    • Intro
    • Eligir libreria HTTP
    • Obtener datos y mostrarlos
  • 10-state-en-funciones
    • El useState Hook
    • Actualizar State basado en State anterior
    • State como un Array
    • Reglas de los Hooks
    • La "magia" de los Hooks
    • State como un Objeto
    • Intro Hooks
  • 15-api-context
    • Usando React API Context
    • Patrón "Slots"
    • Patrón "Render Props"
    • Intro API Context
    • Otros Patrones de Context
    • Ejemplo perforación de props
    • hook_usecontext
  • 8-ciclo-vida-componente
    • Fases
    • El ciclo
    • Manejo de errores
    • Desmontaje
    • Representación
    • Montaje
  • 14-hook-useeffect
    • Límite cuando se ejecuta un Effect
    • Hacer cambios visibles del DOM
    • Obtener datos (Fetch) con useEffect
    • Intro useEffect
    • Re-obtener datos (Re-Fetch) cuando cambian
    • Solo ejecución en montaje y desmontaje
  • 2-jsx
    • Ejemplo componente Tweet:
    • JSX:
    • Trabajando con JSX:
  • 12-controles-entrada
    • Entradas controladas
    • Entradas no controladas
  • 6-github-file-list
    • Parte 2: la Prop 'key'
    • Parte inicial
  • 1-hola_mundo
    • Hola mundo:
Con tecnología de GitBook
En esta página

¿Te fue útil?

  1. 4-proptypes

Ejemplo Tweet con PropTypes

AnteriorCómo validar, formas comunesSiguiente3-props

Última actualización hace 5 años

¿Te fue útil?

Por tercera y ultima vez, volviendo al ejemplo de Tweet para ver cómo aplicar PropTypes a un conjunto real de componentes.

Recordar, la estructura esta así:

• Tweet
    – Avatar
    – Author
    – Time
    – Message
    – ReplyButton
    – LikeButton
    – RetweetButton
    – MoreOptionsButton

Y así es como debería verse actualmente:

Comenzando de abajo hacia arriba, agregar PropTypes a estos componentes. Hacer una copia del código props-tweet de antes para poder modificarlo sin temor de estropear el código anterior:

$ cp -a props-tweet proptypes-tweet && cd proptypes-tweet
$ npm start

Agregar el paquete prop-types e importarlo:

$ npm i --save prop-types
import PropTypes from 'prop-types';

Los botones son un buen lugar para comenzar. MoreOptionsButton no acepta props, por lo que no es necesario modificarlo.

LikeButton puede tomar opcionalmente una prop count, por lo que se agrega PropType para eso:

const LikeButton=({ count }) => (
    <span className="like-button" >
        <i className="fa fa-heart" />
        {count>0&&
            <span className="like-count" >
                {count}
            </span>}
    </span>
);

LikeButton.propTypes={
    count: PropTypes.number
};

Para verificar que funciona, ir al componente Tweet e intentar pasar una cadena en lugar de un número al LikeButton:

// Re:
<LikeButton count={tweet.likes} />

// Con esto:
<LikeButton count='foo' />

Si se actualiza (pagina navegador automáticamente), debería verse una advertencia en la consola del navegador como esta:

  • Warning: Failed prop type: Invalid prop ‘count‘ of type ‘string‘ supplied to ‘LikeButton‘, expected ‘number‘. Check the render method of ‘Tweet‘.

Bueno. Esta funcionando la validación correctamente.

Cambiar esa línea de nuevo a como estaba antes y ahora agregar un PropType de count al componente RetweetButton de la misma manera.

También descubrir los PropTypes para Message y Time (ambos toman cadenas opcionales). Hacerlos también.

Author es un poco más interesante: se necesita un objeto de author que debería tener propiedades de name y handle. ¿Alguna idea de cómo se implementaría eso usando uno de los validadores con React?

Si se dijera PropTypes.shape, se estaría en lo correcto. También se acepta PropTypes.object, aunque eso sea un poco menos explícito. Ver cómo se vería el validador de forma en el componente:

function Author({ author }) {
    const { name, handle }=author;
    return (
        <span className="author" >
            <span className="name" >{name}</span>
            <span className="handle" >@{handle}</span>
        </span>        
    );
}

Author.propTypes = {
    author : PropTypes.shape({
        name : PropTypes.string.isRequired,
        handle : PropTypes.string.isRequired
}).isRequired
};

Aquí, se requiere la prop de author, y debe tener un name y un handle como strings.

Es importante tener en cuenta: los PropTypes son una excelente herramienta de depuración, pero una validación fallida no detendrá la ejecución del código. Vigilar eso en ventana de la consola.

Qué tan explícito ser?

Cuando el objeto pasado a un componente es simple, es fácil justificar escribir un PropType de forma (shape). Sin embargo, cuando el objeto es más complejo, se puede comenzar a preguntar si vale la pena el esfuerzo. La respuesta dependerá del caso en particular. Si se va por la borda con shape, podría ser un dolor mantenerlo más tarde.

tweet