API de Alto Nivel de React
React
es el punto de entrada a la biblioteca de React. Si se carga React desde una etiqueta <script>
, estas API de alto nivel estarán disponibles en el React
global. Si se usa ES6 con npm se puede escribir import React from 'react'
. Si se usa ES5 con npm, se puede escribir var React = require('react')
.
Resumen
Componentes
Los componentes de React permiten dividir la UI en piezas independientes, reusables y pensar acerca de cada pieza aisladamente. Los componentes de React pueden ser definidos creando subclases React.Component
o React.PureComponent
.
Si no se usan las clases ES6, se puede usar el módulo create-react-class
. Para más información, ver Usar React sin ES6.
Los componentes de React también pueden ser definidos como funciones que se pueden envolver:
Crear elementos de React
Se recomienda usar JSX para describir cómo debe verse la UI. Cada elemento de JSX es solo un azúcar sintáctico para llamar React.createElement()
. Normalmente no se recurrirá a los siguientes métodos directamente si se está usando JSX.
Para más información, ver Usar React sin JSX.
Transformar elementos
React
proporciona varias API para manipular elementos:
Fragmentos
React
también proporciona un componente para renderizar múltiples elementos sin un contenedor.
Refs
Suspense
Suspense permite que los componentes “esperen” algo antes de renderizar. Hoy Suspense solo mantiene un caso de uso: cargar componentes activamente con React.lazy
. En el futuro mantendrá otros casos de uso como captura de datos.
Hooks
Los Hooks son una nueva adición en React 16.8. Permiten usar el estado y otras características de React sin escribir una clase. Los Hooks tienen una sección de documentos dedicados y una referencia API separada:
Referencia
React.Component
React.Component
es la clase base para los componentes de React cuando estos son definidos usando clases ES6:
class Greeting extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
Consulta Referencia API React.Component para ver una lista de métodos y propiedades relacionadas a la clase base React.Component
.
React.PureComponent
React.PureComponent
es similar a React.Component
. La diferencia entre ellos es que React.Component
no implementa shouldComponentUpdate()
, pero React.PureComponent
lo implementa con un prop superficial y una comparación del estado.
Si la función render()
del componente de React renderiza el mismo resultado dados los mismos props y estado, se puede usar React.PureComponent
para una mejora en el desempeño en algunos casos.
Nota
shouldComponentUpdate()
delReact.PureComponent
solo compara superficialmente los objetos. Si estos contienen estructuras de datos complejos pueden producir falsos negativos para diferencias más profundas. Solo se extiendePureComponent
cuando se espera tener los props y el estado simples o usarforceUpdate()
cuando se sabe que las estructuras de datos profundos han cambiado. O considera usar objetos inmutables para facilitar comparaciones rápidas de los datos anidados.Además,
shouldComponentUpdate()
delReact.PureComponent
omite las actualizaciones de los props para todo el componente del subárbol. Asegúrate que todos los componentes hijos también sean “puros”.
React.memo
const MyComponent = React.memo(function MyComponent(props) {
/* renderiza usando props */
});
React.memo
es un componente de orden superior.
Si el componente renderiza el mismo resultado dadas las mismas props, se puede envolver en una llamada a React.memo
para una mejora en el desempeño en algunos casos memoizando el resultado. Esto significa que React omitirá renderizar el componente y reusará el último resultado renderizado.
React.memo
solamente verifica los cambios en las props. Si tu componente de función envuelto en React.memo
tiene un Hook useState
, useReducer
o useContext
en su implementación, continuará volviéndose a renderizar cuando el estado o el contexto cambien.
Por defecto solo comparará superficialmente objetos complejos en el objeto de props. Si se desea controlar la comparación, se puede proporcionar también una función de comparación personalizada como el segundo argumento.
function MyComponent(props) {
/* renderiza usando props */
}
function areEqual(prevProps, nextProps) {
/*
retorna true si al pasar los nextProps a renderizar retorna
el mismo resultado que al pasar los prevProps a renderizar,
de otro modo retorna false
*/
}
export default React.memo(MyComponent, areEqual);
Este método solamente existe como una optimización del desempeño. No dependas de ello para “evitar” un renderizado, ya que puede conducir a errores.
Nota
A diferencia del método
shouldComponentUpdate()
en los componentes de clases, la funciónareEqual
retornatrue
si los props son iguales yfalse
si los props no son iguales. Esto es lo opuesto ashouldComponentUpdate
.
createElement()
React.createElement(
type,
[props],
[...children]
)
Crea y retorna un nuevo elemento React del tipo dado. El tipo del argumento puede ser ya sea un string de nombre de etiqueta (tales como 'div'
o 'span'
), un tipo de componente React (una clase o una función), o un tipo de fragmento React .
El código escrito con JSX será convertido para usar React.createElement()
. Normalmente no se invocará React.createElement()
directamente si se está usando JSX. Para aprender más, ver React Sin JSX.
cloneElement()
React.cloneElement(
element,
[config],
[...children]
)
Clona y retorna un elemento React usando element
como punto de partida. config
debe contener todas las nuevas props, key
, o ref
. El elemento resultante tendrá las props del elemento original con las nuevas props combinadas superficialmente. Los nuevos hijos reemplazarán los hijos existentes. key
y ref
del elemento original serán preservadas si key
y ref
no están presentes en la configuración.
React.cloneElement()
es casi equivalente a:
<element.type {...element.props} {...props}>{children}</element.type>
Sin embargo, también preserva las refs
. Esto significa que, si se obtiene un hijo con una ref
en él, no la robará accidentalmente de su ancestro. Se obtendrá la misma ref
adjunta al nuevo elemento. Las nuevas ref
o key
reemplazarán a las antiguas si estuviesen presentes.
Esta API fue introducida como un reemplazo al obsoleto React.addons.cloneWithProps()
.
createFactory()
React.createFactory(type)
Retorna una función que produce elementos React de un tipo dado. Como React.createElement()
, el tipo del argumento puede ser un string de nombre de etiqueta (como 'div'
o 'span'
), un tipo de componente React (una clase o una función) o un fragmento React.
Este auxiliar es considerado antiguo y en su lugar fomentamos el uso de JSX o de React.createElement()
.
Normalmente no se invocará React.createFactory()
directamente si se está usando JSX. Para aprender más, ver React sin JSX.
isValidElement()
React.isValidElement(object)
Verifica que el objeto sea un elemento React. Retorna true
o false
.
React.Children
React.Children
proporciona utilidades para lidiar con la estructura de datos opaca de this.props.children
.
React.Children.map
React.Children.map(children, function[(thisArg)])
Invoca una función en cada hijo inmediato dentro de children
con this
establecido a thisArg
. Si children
es un array, será recorrido y la función será llamada para cada hijo en el array. Si children es null
o undefined
, este método retornará null
o undefined
en vez de un array.
Nota
Si
children
es unFragment
será tratado como un hijo único y no será recorrido.
React.Children.forEach
React.Children.forEach(children, function[(thisArg)])
Es como React.Children.map()
pero no retorna un array.
React.Children.count
React.Children.count(children)
Retorna el número total de componentes en children
, igual al número de veces que un callback pasado a map
o forEach
sería invocado.
React.Children.only
React.Children.only(children)
Verifica que children
solo tenga un hijo (un elemento React) y lo retorna. De otro modo este método lanza un error.
Nota:
React.Children.only()
no acepta el valor retornado deReact.Children.map()
porque es un array en lugar de un elemento React.
React.Children.toArray
React.Children.toArray(children)
Retorna la estructura de datos opaca de children
como un array plano con keys asignadas a cada hijo. Es útil si se desea manipular colecciones de hijos en los métodos de renderización, particularmente si se desea reordenar o segmentar this.props.children
antes de pasarlo.
Nota:
React.Children.toArray()
cambia las keys para preservar las semánticas de los array anidados cuando se aplanan listas de hijos. Esto quiere decir quetoArray
antepone cada key en el array retornado de modo que cada elemento de key esté dentro del alcance del array de entrada que lo contiene.
React.Fragment
El componente React.Fragment
permite retornar elementos múltiples en un método de render()
sin crear un elemento DOM adicional:
render() {
return (
<React.Fragment>
Some text.
<h2>A heading</h2>
</React.Fragment>
);
}
También se puede usar con la sintaxis abreviada <></>
. Para más información, ver React v16.2.0: Soporte mejorado para fragmentos.
React.createRef
React.createRef
crea un ref que puede ser adjunto a los elementos React por medio del atributo ref.
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.inputRef = React.createRef(); }
render() {
return <input type="text" ref={this.inputRef} />; }
componentDidMount() {
this.inputRef.current.focus(); }
}
React.forwardRef
React.forwardRef
crea un componente React que envía el atributo ref que recibe a otro componente más abajo en el árbol. Esta técnica no es muy común, pero es particularmente útil en dos escenarios:
React.forwardRef
acepta una función de renderizado como un argumento. React llamará esta función con props
y ref
como dos argumentos. Esta función debe retornar un nodo React.
const FancyButton = React.forwardRef((props, ref) => ( <button ref={ref} className="FancyButton"> {props.children}
</button>
));
// Ahora puedes obtener un ref directamente al botón del DOM
const ref = React.createRef();
<FancyButton ref={ref}>Click me!</FancyButton>;
En el ejemplo anterior, React pasa un ref
dado a un elemento <FancyButton ref={ref}>
como un segundo argumento a la función de renderizado dentro de la llamada React.forwardRef
. Esta función de renderizado pasa el ref
al elemento <button ref={ref}>
.
Como resultado, después que React adjunte el ref, ref.current
apuntará directamente a la instancia del elemento DOM <button>
.
Para más información, ver reenvío de refs.
React.lazy
React.lazy()
permite definir un componente que es cargado dinámicamente. Esto ayuda a reducir el tamaño del bundle para demorar los componentes de carga que no son usados durante la renderización inicial.
Puedes aprender cómo usarlo desde nuestra documentación de división de código. También puedes consultar este artículo que explica cómo usarlo con más detalle.
// Este componente está cargado dinámicamente
const SomeComponent = React.lazy(() => import('./SomeComponent'));
Ten en cuenta que renderizar componentes lazy
requiere que haya un componente <React.Suspense>
más alto en el árbol de renderización. Así es como se especifica un indicador de carga.
Nota
Usar
React.lazy
con importación dinámica requiere que Promises esté disponible en el entorno JS. Esto requiere un polyfill en IE versión 11 e inferiores.
React.Suspense
React.Suspense
permite especificar el indicador de carga en caso de que algunos componentes en el árbol más abajo de él todavía no estén listos para renderizarse. Hoy en día, los componentes de carga diferida son el único caso compatible con <React.Suspense>
:
// Este componente está cargado dinámicamente
const OtherComponent = React.lazy(() => import('./OtherComponent'));
function MyComponent() {
return (
// Muestra <Spinner> hasta que OtherComponent cargue
<React.Suspense fallback={<Spinner />}>
<div>
<OtherComponent />
</div>
</React.Suspense>
);
}
Esto está documentado en nuestra guía de división de código. Ten en cuenta que los componentes lazy
pueden estar muy profundo en el árbol Suspense
— no tiene que envolverlos a todos. La mejor práctica es colocar <Suspense>
donde se desee ver un indicador de carga y usar lazy()
para hacer división de código.
Aunque esto no es soportado actualmente, en el futuro planeamos dejar que Suspense
maneje más escenarios como la captura de datos. Puedes leer sobre esto en nuestro plan de ruta.
Nota:
React.lazy()
y<React.Suspense>
aún no son soportados porReactDOMServer
. Esto es una limitación conocida que será resuelta en el futuro.