React Props
En React, los Props (propiedades) son el mecanismo para pasar datos del componente padre al componente hijo. Los Props son de solo lectura; los componentes hijos no pueden modificarlos directamente, sino que el componente padre debe administrarlos y actualizarlos.
La principal diferencia entre state y props es quepropslos props son inmutables, mientras que state puede cambiar según la interacción con el usuario. Es por eso que algunos componentes contenedores necesitan definir state para actualizar y modificar datos. Y los componentes hijos solo pueden transferir datos a través de props.
Usando Props
Sintaxis para pasar Props:
<ComponentName propName={propValue} />
El siguiente ejemplo demuestra cómo usar props en un componente:
Ejemplo de React
Pruébalo »
En el ejemplo, el atributo name se obtiene mediante props.name.
Props predeterminados
Puedes establecer valores predeterminados para props mediante la propiedad defaultProps de la clase del componente. Ejemplo:
Ejemplo de React
Pruébalo »
Múltiples Props
Puedes pasar múltiples atributos al componente hijo.
Ejemplo
return (
<div>
<h2>{props.name}</h2>
<p>Age: {props.age}</p>
<p>Location: {props.location}</p>
</div>
);
};
const App = () => {
return (
<UserCard name="Alice" age={25} location="New York" />
);
};
ReactDOM.render(<App />, document.getElementById('root'));
Validación de propTypes
propTypes es una herramienta proporcionada por React para realizar la verificación de tipos de los props de un componente.
Puedes usar la librería prop-types para verificar los tipos de los props del componente.
En React, propTypes se define como una propiedad estática del componente. Primero, necesitas instalar el paquete prop-types:
npm install prop-types
Luego, importa prop-types en el archivo de tu componente y define la propiedad propTypes. A continuación se muestra un ejemplo:
Ejemplo
const Greeting = (props) => {
return <h1>Hello, {props.name}!</h1>;
};
Greeting.propTypes = {
name: PropTypes.string.isRequired
};
const App = () => {
return (
<div>
<Greeting name="Alice" />
{/* <Greeting /> // Esta línea provocará una advertencia en la consola, porque name es obligatorio */}
</div>
);
};
ReactDOM.render(<App />, document.getElementById('root'));
Pasar funciones de devolución de llamada como Props
Puedes pasar funciones como props al componente hijo, y este puede invocar esas funciones para comunicarse con el componente padre.
Ejemplo
constructor(props) {
super(props);
this.state = { message: '' };
}
handleMessage = (msg) => {
this.setState({ message: msg });
};
render() {
return (
<div>
<ChildComponent onMessage={this.handleMessage} />
<p>Message from Child: {this.state.message}</p>
</div>
);
}
}
const ChildComponent = (props) => {
const sendMessage = () => {
props.onMessage('Hello from Child!');
};
return (
<div>
<button onClick={sendMessage}>Send Message</button>
</div>
);
};
ReactDOM.render(<ParentComponent />, document.getElementById('root'));
Desestructurando Props
En los componentes de función, puedes simplificar el código desestructurando props.
Ejemplo
return <h1>Hello, {name}!</h1>;
};
const App = () => {
return <Greeting name="Alice" />;
};
ReactDOM.render(<App />, document.getElementById('root'));
Resumen
- Pasar y usar Props: el componente padre pasa datos al componente hijo, el componente hijo recibe mediante
propslos props. - Props predeterminados:usa
defaultPropspara establecer los valores predeterminados de los atributos del componente. - Validación de PropTypes:usa
prop-typesla librería para verificar los tipos de props. - Pasar funciones de devolución de llamada: el componente padre puede pasar funciones como props al componente hijo, para lograr la comunicación entre componentes.
- Desestructurar Props: desestructura props en componentes de función para simplificar el código.
State y Props
El siguiente ejemplo demuestra cómo combinar state y props en una aplicación. Podemos establecer state en el componente padre y pasarlo al componente hijo mediante props. En la función render, configuramos name y site para obtener los datos pasados por el componente padre.
Ejemplo de React
Pruébalo »
Validación de Props
React.PropTypes se ha movido a la libreríaprop-typesprop-types.
<script src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/prop-types/15.8.1/prop-types.min.js" type="application/javascript"></script>
La validación de Props usapropTypesla librería prop-types, que puede garantizar que los componentes de nuestra aplicación se utilicen correctamente. React.PropTypes proporciona muchos validadores (validator) para verificar si los datos entrantes son válidos. Cuando se pasan datos no válidos a props, la consola de JavaScript mostrará una advertencia.
El siguiente ejemplo crea un componente Mytitle. El atributo title es obligatorio y debe ser una cadena; los tipos que no son cadenas se convertirán automáticamente en cadenas:
Ejemplo de React 16.4
Pruébalo »
Ejemplo de React 15.4
Pruébalo »
Por supuesto, podemos presentarte másPropTypesvalidadores y cómo usarlos. A continuación se muestran algunosPropTypesDescripción de los validadores:
Tipos de datos básicos
PropTypes.string: cadenaPropTypes.number: númeroPropTypes.boolean: booleanoPropTypes.object: objetoPropTypes.array: arrayPropTypes.func: funciónPropTypes.symbol:Symbol
Tipos especiales
PropTypes.node: cualquier contenido que se pueda renderizar: números, cadenas, elementos o arrays (incluidos estos tipos)PropTypes.element: elemento de ReactPropTypes.instanceOf(Class): instancia de una clase
Tipos combinados
PropTypes.oneOf(['option1', 'option2']): tipo de enumeración; el valor debe ser una de las opciones proporcionadasPropTypes.oneOfType([PropTypes.string, PropTypes.number]): uno de varios tiposPropTypes.arrayOf(PropTypes.number): array compuesto por un tipo determinadoPropTypes.objectOf(PropTypes.number): objeto compuesto por un tipo determinadoPropTypes.shape({ key: PropTypes.string, value: PropTypes.number }): objeto con una forma específica
Otros
PropTypes.any: cualquier tipoPropTypes.exact({ key: PropTypes.string }): objeto con claves específicas y sin claves adicionales
A continuación se muestran algunos ejemplos de código que demuestran cómo usar diferentesPropTypesvalidadores:
Ejemplo
import ReactDOM from 'react-dom/client';
import PropTypes from 'prop-types';
class MyComponent extends React.Component {
static propTypes = {
title: PropTypes.string.isRequired, // Debe ser una cadena y es obligatorio
age: PropTypes.number, // Número opcional
isAdmin: PropTypes.bool, // Booleano opcional
user: PropTypes.shape({ // Debe ser un objeto con una forma específica
name: PropTypes.string,
email: PropTypes.string
}),
items: PropTypes.arrayOf(PropTypes.string), // Debe ser un array de cadenas
callback: PropTypes.func, // Función opcional
children: PropTypes.node, // Contenido renderizable opcional
options: PropTypes.oneOf(['option1', 'option2']), // Debe ser uno de los valores específicos
};
render() {
return (
<div>
<h1>{this.props.title}</h1>
{this.props.age && <p>Age: {this.props.age}</p>}
{this.props.isAdmin && <p>Admin</p>}
{this.props.user && (
<div>
<p>Name: {this.props.user.name}</p>
<p>Email: {this.props.user.email}</p>
</div>
)}
{this.props.items && (
<ul>
{this.props.items.map((item, index) => (
<li key={index}>{item}</li>
))}
</ul>
)}
{this.props.callback && (
<button onClick={this.props.callback}>Click me</button>
)}
{this.props.children}
{this.props.options && <p>Option: {this.props.options}</p>}
</div>
);
}
}
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<MyComponent
title="Hello, World!"
age={30}
isAdmin={true}
user={{ name: "John Doe", email: "[email protected]" }}
items={['Item 1', 'Item 2', 'Item 3']}
callback={() => alert('Button clicked!')}
options="option1"
>
<p>This is a child element</p>
</MyComponent>
);