Como hacer

Cómo usar componentes de orden superior para reutilizar la lógica en React

Los componentes de orden superior (HOC) son un tipo de componente de React que le ayudan a reutilizar la razonamiento en su aplicación. La terminología puede parecer compleja, pero los HOC son fáciles de manejar y pueden hacer que su código almohadilla sea más simple de permanecer.

Un componente de orden superior siempre envuelve componentes secundarios con funcionalidad adicional. Un HOC se define como una función que acepta un componente como parámetro. Luego devuelve un nuevo componente, que normalmente renderizará el componente de entrada envuelto con accesorios adicionales.

Un ejemplo simple

La mejor forma de apreciar cuando los HOC tienen sentido es verlos en movimiento. Consideremos un sistema de suscripción simple donde el estado de la cesta del usufructuario se almacena de forma centralizada internamente de la aplicación. Nuestros ejemplos muestran a Redux como la tienda estatal, pero esto solo con fines ilustrativos.

Supongamos que este objeto representa el estado de nuestra aplicación:

{ checkout: { items: [ { label: "Product 1", price: 150.00, quantity: 2 }, { label: "Product 2", price: 75.00, quantity: 1 } ] } }

Tenemos una matriz simple que representa los artículos de la cesta del usufructuario. Nuestros componentes de suscripción derivarán títulos adicionales de este estado, como el valencia total del pedido y los impuestos a aplicar.

Nuestro sistema de suscripción probablemente deba mostrar el valencia total internamente de múltiples componentes independientes. Puede suceder un widget de mostrador fronterizo que muestre la cesta, una pantalla de revisión posterior al suscripción y una calculadora de costos de remisión. Un sistema ingenuo que simplemente pasara los medios de suscripción como accesorios correría el aventura de duplicar la razonamiento: cada componente tendría que calcular el valencia total del pedido por sí mismo.

Presentando el HOC

Veamos cómo puede ayudar un HOC:

import React from "react"; import {connect} from "react-redux"; const withCheckout = ComponentToWrap => { const ComponentWithCheckout = class extends React.Component { render() { return ( ComponentToWrap checkoutItems={this.props.checkout.items} checkoutTotal={this.total} {...this.props} /> ); } get total() { const prices = this.props.checkout.items.map(i => (i.quantity * i.price)); return prices.reduce((a, b) => (a + b), 0); } } return connect(({checkout}) => ({checkout}))(ComponentWithCheckout); } export default withCheckout;

El archivo exporta una sola función, withCheckout, que toma un componente React como único parámetro (ComponentToWrap). Interiormente de la función, creamos una nueva clase anónima que es en sí misma un componente de React.

Este nuevo componente render El método crea una instancia del ComponentToWrap pasamos a la función. Ahora tenemos la oportunidad de delimitar los accesorios de la instancia. Reenviamos la matriz de medios de suscripción como checkoutItems y hacer que el valencia total precalculado esté acondicionado como checkoutTotal.

Todos los accesorios pasados ​​al HOC se reenvían al componente interno, lo que garantiza que reciba todos los datos que requiere. La función devuelve la clase anónima recién creada que está relación para ser renderizada en toda su aplicación.

Usamos el connect método de react-redux entonces el checkout prop internamente del HOC recibe el valencia de la checkout secreto en el estado de nuestra tienda Redux. Este es un detalle de implementación: su HOC puede permanecer su propio estado o comunicarse con algún otro servicio internamente de su aplicación.

Usando el HOC

Ahora es el momento de poner en ejercicio nuestro HOC.

import React from "react"; import withCheckout from "./withCheckout.js"; class CheckoutReviewScreen extends React.Component { render() { return ( h1>Checkouth1> h2>{this.props.checkoutTotal}h2> ); } } export default withCheckout(CheckoutReviewScreen);

Asumimos nuestro withCheckout HOC se guardián en withCheckout.js en el mismo directorio que nuestro nuevo componente de pantalla de revisión de suscripción. Envolviendo el componente con nuestro withCheckout HOC, podemos lograr y visualizar el valencia total del pedido. No necesitamos calcularlo nosotros mismos ni almacenarlo en el estado de la aplicación. Si alguna vez quisiéramos renovar cómo se calcula el total (por ejemplo, unir un cargo de manejo fijo), solo necesitamos hacer el cambio en un espacio: internamente de nuestro HOC.

Ahora puedes renderizar en cualquier espacio de su aplicación. Nuestro ejemplo envuelto no necesita que se le pasen accesorios, ya que obtiene sus datos de nuestra tienda Redux. Porque esta envuelto con withCheckout, envuelto con Redux’s connect, la pantalla de revisión recibe automáticamente un checkoutTotal prop que suma los precios de todos los medios en el estado de la aplicación.

Ahora vale la pena mencionar cómo nombramos a nuestro HOC: withCheckout. Por convención, los nombres HOC normalmente tienen un with prefijo porque agregan poco a los componentes que envuelven. En nuestro caso, el HOC proporciona un golpe conveniente a nuestra canasta de suscripción que de otra forma necesitaríamos implementar internamente de cada componente.

Ventajas de los HOC

El uso de un HOC le permite idealizar comportamientos comunes de los componentes, minimizando la duplicación de código y aumentando la capacidad de mantenimiento. Los HOC permiten una forma de inyección de dependencia. Le ayudan a permanecer sus componentes más simples al permitir que se pasen más del mundo exógeno.

Los HOC son comunes internamente del ecosistema React. De hecho, hemos trillado uno en este artículo: connect(), parte de react-redux, que suscribe sus componentes a los cambios de estado de Redux.

Los HOC son populares porque proporcionan un método de reutilización de código que no rompe la autocontención de los componentes. El patrón utiliza la capacidad de composición de React para permitirle unir funcionalidad adicional sin el aventura de posesiones secundarios.

Puede acontecer cualquier componente de su aplicación a withCheckout sin romper nulo, el HOC solo agrega algunos accesorios adicionales. Por eso es tan importante que sus HOC avancen todas los accesorios que reciben{…this.props} en nuestro ejemplo). No deben hacer nulo que pueda interferir con el funcionamiento frecuente del componente envuelto.

Puede parecer que sus componentes ahora dependen de su HOC. Este no es el caso. Puede exportar una segunda lectura de su componente que no esté empaquetado, dando a los consumidores la opción de nominar cuál usar.

Su componente en efectividad solo insiste en admitir ciertos accesorios: checkoutTotal en nuestro caso. Esto podría ser proporcionado por el HOC o pasando un valencia dondequiera que se represente el componente. Nuestro HOC simplifica el exposición, pero no ha cambiado fundamentalmente la naturaleza de nuestros componentes renderizados.